MyBatis的使用四(查询详解)

文章详细讨论了在MyBatis中如何查询User对象,包括查询单个对象和多个对象,以及查询不同类型的字段,如单个字段、多个字段,并涉及到返回结果类型如List<User>和Map<String,Object>的使用场景。特别提到了@MapKey注解在查询多行数据时的作用,以确保数据的键值对应。
摘要由CSDN通过智能技术生成

一. 查询User对象

  1.查询单个对象User

  SelectUser接口声明如下

// 主要条件是使用idpublicinterface SelectUser {

// 查询单行数据,返回对象User

User getUserSingleByID(@Param("id") int id);

}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser">

<!--User getUserSingleByID(@Param("id") int id)--><select id="getUserSingleByID" resultType="User">

select * from t_user where id = #{id};

</select></mapper>

  2. 查询多个对象User

  SelectUser接口声明如下

// 主要条件是使用idpublicinterface SelectUser {

// 查询多行数据,返回User类的集合【查询 >= id 的数据】

List<User> getUserListByID(@Param("id") int id);

}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser"><!--List<User> getUserListByID(@Param("id") int id)--><select id="getUserListByID" resultType="User">

select * from t_user where id >= #{id}

</select></mapper>

  问题:当查询单个对象时,是否可以用List<User>作为返回类型?

  SelectUser接口声明如下

// 主要条件是使用idpublicinterface SelectUser {

// 查询单行数据,返回对象User

List<User> getUserSingleByID(@Param("id") int id);

}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser"><!--User getUserSingleByID(@Param("id") int id)--><select id="getUserSingleByID" resultType="User">

select * from t_user where id = #{id};

</select></mapper>

  测试test

@Test

// 使用id查询单个数据Userpublicvoid selectUserByID(){

SqlSession sqlSession = SqlSessionUtils.getSqlSession();

SelectUser mapper = sqlSession.getMapper(SelectUser.class);

List<User> user = mapper.getUserSingleByID(12);

System.out.println(user);

sqlSession.close();

}

  测试结果如下

  运行结果正常

  总结:当返回的数据对象不清楚有几个的情况,建议使用List<User>

二. 查询字段

  1.查询单个字段【单行】

  SelectUser接口声明如下

// 主要条件是使用idpublicinterface SelectUser {

// 查询单个字段【单行】

// 返回类型根据字段的类型而定,具体问题具体分析

String getNameByID(@Param("id") int id);

}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser"><!--String getNameByID(@Param("id") int id)--><select id="getNameByID" resultType="string">

select username from t_user where id = #{id}

</select></mapper>

  注意:在SelectUser接口定义的方法 getNameByID() 的返回类型需要根据字段的类型来指明,或者直接使用Object。

  2. 查询单个字段【多行】

  SelectUser接口声明如下

publicinterface SelectUser {

// 查询单个字段【多行】

List<String> getNameRowsByID(@Param("id") int id);

}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser"><!--List<String> getNameRowsByID(@Param("id") int id);--><select id="getNameRowsByID" resultType="string">

select username from t_user where id >= #{id}

</select></mapper>

  与 一中查询多行数据类似,返回类型是List<字段类型或者Object>

  3. 查询多个字段【单行】

  SelectUser接口声明如下

// 主要条件是使用idpublicinterface SelectUser {

// 查询多个字段【单行】

// Map<String,Object> 中 key是字段名,value是属性值

Map<String,Object> getColsByID(@Param("id") int id);

}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser"><!--Map<String,Object> getColsByID(@Param("id") int id)--><select id = "getColsByID" resultType="map">

select username,password,age from t_user where id = #{id}

</select></mapper>

  在SelectUser接口定义的方法返回类型是Map<String,Object>类型,

  Map<String,Object>的key是字段名,value是属性值,这里的Object用的巧妙

  4. 查询多个字段【多行】

  SelectUser接口声明如下

publicinterface SelectUser {

// 查询多个字段【多行】

// 此时不能使用 Map<String,Object> 作为返回类型,数据不止一条

// 方式1:使用List<Map<>>

List<Map<String,Object>> getClosRowsByID(@Param("id") int id);

// 方式2:使用@MapKey("字段名") 查出的结果 Map<Map<>>

// @MapKey("字段名"),key是字段名【唯一标志该行数据】value是该行数据

// 此时在xml文件,查询字段必须要包含唯一标识id

@MapKey("id")

// Map<String,Object> getMapsByID(@Param("id") int id);

Map<Integer,Object> getMapsByID(@Param("id") int id);

}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser">

  <!--方式1:使用List<Map<>> --><!--Map<String,Object> getClosRowsByID(@Param("id") int id);--><select id="getClosRowsByID" resultType="map">

select username,password,age from t_user where id >= #{id}

</select>

  <!--方式2:使用@MapKey注解 --><!--@MapKey("id")

Map<String,Object> getMapsByID(@Param("id") int id);--><select id="getMapsByID" resultType="map">

select id,username,password,age from t_user where id >= #{id}

</select></mapper>

  方式1:测试test

@Test

// 根据id查询多个字段【多行】方式一:publicvoid selectColsRowsByID(){

SqlSession sqlSession = SqlSessionUtils.getSqlSession();

SelectUser mapper = sqlSession.getMapper(SelectUser.class);

List<Map<String, Object>> mapList = mapper.getClosRowsByID(6);

// 遍历集合for (Map<String, Object> 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查询多个字段【多行】方式二:publicvoid selectMapsByID(){

SqlSession sqlSession = SqlSessionUtils.getSqlSession();

SelectUser mapper = sqlSession.getMapper(SelectUser.class);

Map<Integer, Object> maps = mapper.getMapsByID(6);

// 遍历map,注意此时map的结构 Map<id=Map,id=Map...>

Set<Integer> 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<String,Object> 变成Map<Integer,Object>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<Map>,即 将查询到的每行结果 --存放-->Map<String,Object> ---封装--> List<Map<String,Object>>。

    List<Map<>>的结构如下

[{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< " 字段名的值 " = 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}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值