本文主要讲述如何在mybatis中进行查询操作【详解】

一. 查询User对象

  1.查询单个对象User

  SelectUser接口声明如下

// 主要条件是使用id
public interface 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接口声明如下

// 主要条件是使用id
public interface 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接口声明如下

// 主要条件是使用id
public interface 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查询单个数据User
public void 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接口声明如下

// 主要条件是使用id
public interface 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接口声明如下

public interface 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接口声明如下

// 主要条件是使用id
public interface 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接口声明如下

public interface 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查询多个字段【多行】方式一:
public void 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查询多个字段【多行】方式二:
public void 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}}

最新文章

  1. AndroidStudio 点9图片文件报错
  2. Winform以任意角度旋转PictureBox中的图片的方法
  3. 微软职位内部推荐-B&I Site Lead
  4. 纪念逝去的岁月——C/C++二分查找
  5. Linux聊天室项目 -- ChatRome(select实现)
  6. Codeforces Round #197 (Div. 2)
  7. java split函数 对空的处理
  8. 层模型--相对定位(position:relative)
  9. nopCommerce 3.9 大波浪系列 之 路由注册
  10. 【集美大学1411_助教博客】团队作业6——展示博客(Alpha版本)
  11. Docker最全教程——数据库容器化(十)
  12. eos开发(二)使用cleos命令行客户端操作EOS(钱包wallet基础操作)
  13. 转《vue引入第三方js库》
  14. gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化
  15. 安卓开发_深入理解Handler消息传递机制
  16. lamp下mysql安全加固
  17. zeromq使用模式实验总结
  18. spring boot学习(8) SpringBoot 之切面AOP
  19. laravel中的模型关联之(一对多)
  20. cisco 3850 GBIC报错处理

热门文章

  1. 编译安装PHP7.4
  2. numpy常用知识点备忘(2)
  3. springboot启动问题集合
  4. Pyhton基础部分:6、与用户交互、基础运算符
  5. spring运行报500 bean不存在
  6. c++题目:切香肠
  7. 如何实现一个优秀的 HashTable 散列表?
  8. 斐波那契散列算法和hashMap实践
  9. Linux 使用打印机
  10. 如何解决arthas-failed-to-bind-telnet-or-http-port问题