MyBatis的使用四(查询详解)
本文主要讲述如何在mybatis中进行查询操作【详解】
,即 将查询到的每行结果 --存放-->Map ---封装--> List
>。
>的结构如下
一. 查询User对象
1.查询单个对象User
SelectUser接口声明如下
// 主要条件是使用id public interface SelectUser { // 查询单行数据,返回对象User User getUserSingleByID(@Param("id") int id); }
SelectUser.xml文件声明如下
mapper namespace="com.hspedu.mapper.SelectUser">
select id="getUserSingleByID" resultType="User">
select * from t_user where id = #{id};
select>
mapper>
2. 查询多个对象User
SelectUser接口声明如下
// 主要条件是使用id public interface SelectUser { // 查询多行数据,返回User类的集合【查询 >= id 的数据】 ListgetUserListByID(@Param("id") int id); }
SelectUser.xml文件声明如下
mapper namespace="com.hspedu.mapper.SelectUser">
select id="getUserListByID" resultType="User">
select * from t_user where id >= #{id}
select>
mapper>
问题:当查询单个对象时,是否可以用List
SelectUser接口声明如下
// 主要条件是使用id public interface SelectUser { // 查询单行数据,返回对象User ListgetUserSingleByID(@Param("id") int id); }
SelectUser.xml文件声明如下
mapper namespace="com.hspedu.mapper.SelectUser">
select id="getUserSingleByID" resultType="User">
select * from t_user where id = #{id};
select>
mapper>
测试test
@Test // 使用id查询单个数据User public void selectUserByID(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectUser mapper = sqlSession.getMapper(SelectUser.class); Listuser = mapper.getUserSingleByID(12); System.out.println(user); sqlSession.close(); }
测试结果如下
运行结果正常
总结:当返回的数据对象不清楚有几个的情况,建议使用List
二. 查询字段
1.查询单个字段【单行】
SelectUser接口声明如下
// 主要条件是使用id public interface SelectUser { // 查询单个字段【单行】 // 返回类型根据字段的类型而定,具体问题具体分析 String getNameByID(@Param("id") int id); }
SelectUser.xml文件声明如下
mapper namespace="com.hspedu.mapper.SelectUser">
select id="getNameByID" resultType="string">
select username from t_user where id = #{id}
select>
mapper>
注意:在SelectUser接口定义的方法 getNameByID() 的返回类型需要根据字段的类型来指明,或者直接使用Object。
2. 查询单个字段【多行】
SelectUser接口声明如下
public interface SelectUser { // 查询单个字段【多行】 ListgetNameRowsByID(@Param("id") int id); }
SelectUser.xml文件声明如下
mapper namespace="com.hspedu.mapper.SelectUser">
select id="getNameRowsByID" resultType="string">
select username from t_user where id >= #{id}
select>
mapper>
与 一中查询多行数据类似,返回类型是List
3. 查询多个字段【单行】
SelectUser接口声明如下
// 主要条件是使用id public interface SelectUser { // 查询多个字段【单行】 // Map中 key是字段名,value是属性值 MapgetColsByID(@Param("id") int id); }
SelectUser.xml文件声明如下
mapper namespace="com.hspedu.mapper.SelectUser">
select id = "getColsByID" resultType="map">
select username,password,age from t_user where id = #{id}
select>
mapper>
在SelectUser接口定义的方法返回类型是Map
Map
4. 查询多个字段【多行】
SelectUser接口声明如下
public interface SelectUser { // 查询多个字段【多行】 // 此时不能使用 Map作为返回类型,数据不止一条 // 方式1:使用List List
SelectUser.xml文件声明如下
mapper namespace="com.hspedu.mapper.SelectUser">
select id="getClosRowsByID" resultType="map">
select username,password,age from t_user where id >= #{id}
select>
select id="getMapsByID" resultType="map">
select id,username,password,age from t_user where id >= #{id}
select>
mapper>
方式1:测试test
@Test // 根据id查询多个字段【多行】方式一: public void selectColsRowsByID(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectUser mapper = sqlSession.getMapper(SelectUser.class); List> mapList = mapper.getClosRowsByID(6); // 遍历集合 for (Map map : mapList) { System.out.println(map); } sqlSession.close(); }
测试结果如下
{password=tom123, age=20, username=Tom} {password=tom123, age=20, username=Tom} {password=tom123, age=20, username=Tom} {password=tom12345, age=20, username=jack} {password=hsp12345, age=25, username=hsp} {password=tom123, age=20, username=Tom} {password=tom123, age=20, username=Tom} {password=tom123, age=20, username=Tom} {password=hsp12345, age=25, username=hsp}
方式2:测试test
@Test // 根据id查询多个字段【多行】方式二: public void selectMapsByID(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectUser mapper = sqlSession.getMapper(SelectUser.class); Mapmaps = mapper.getMapsByID(6); // 遍历map,注意此时map的结构 Map Set keySet = maps.keySet(); // java.lang.Integer cannot be cast to java.lang.String // [16, 6, 9, 10, 11, 12, 13, 14, 15] // id的字段类型: class java.lang.Integer. // 因此需要将Map 变成Map for (Integer s : keySet) { System.out.println(maps.get(s)); } sqlSession.close(); }
测试结果如下
{password=hsp12345, id=16, age=25, username=hsp} {password=tom123, id=6, age=20, username=Tom} {password=tom123, id=9, age=20, username=Tom} {password=tom123, id=10, age=20, username=Tom} {password=tom12345, id=11, age=20, username=jack} {password=hsp12345, id=12, age=25, username=hsp} {password=tom123, id=13, age=20, username=Tom} {password=tom123, id=14, age=20, username=Tom} {password=tom123, id=15, age=20, username=Tom}
注意方式1和方式2的区别
方式1的返回类型是List
List
[{password=tom123, age=20, username=Tom},{password=tom123, age=20, username=Tom}, {password=tom123, age=20, username=Tom}, {password=tom12345, age=20, username=jack}, {password=hsp12345, age=25, username=hsp}, {password=tom123, age=20, username=Tom}, {password=tom123, age=20, username=Tom}, {password=tom123, age=20, username=Tom}, {password=hsp12345, age=25, username=hsp}]
方式2是通过注解@MapKey("字段名"),注意这里的字段名是作为每行数据value的key【因此应该选择能够唯一标识某一行数据的字段名作为每行数据的key】。
Map>的结构如下
{16={password=hsp12345, id=16, age=25, username=hsp}, 6={password=tom123, id=6, age=20, username=Tom}, 9={password=tom123, id=9, age=20, username=Tom}, 10={password=tom123, id=10, age=20, username=Tom}, 11={password=tom12345, id=11, age=20, username=jack}, 12={password=hsp12345, id=12, age=25, username=hsp}, 13={password=tom123, id=13, age=20, username=Tom}, 14={password=tom123, id=14, age=20, username=Tom}, 15={password=tom123, id=15, age=20, username=Tom}}
文章来源于互联网:MyBatis的使用四(查询详解)
THE END
二维码