本文主要讲述如何在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}}

MyBatis使用四(查询详解)的更多相关文章

  1. 深入浅出Mybatis系列四-配置详解之typeAliases别名(mybatis源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(三)---配置详解之properties ...

  2. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

  3. ElasticSearch第四步-查询详解

    ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...

  4. Mybatis SQL映射文件详解

    Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...

  5. Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)

    一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...

  6. MyBatis中@MapKey使用详解

    MyBatis中@MapKey使用详解我们在上一篇文章中讲到在Select返回类型中是返回Map时,是对方法中是否存在注解@MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对象 ...

  7. 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解

    http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...

  8. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  9. Solr安装入门、查询详解

    Solr安装入门:http://www.importnew.com/12607.html 查询详解:http://www.360doc.com/content/14/0306/18/203871_35 ...

  10. Qt零基础教程(四) QWidget详解篇

    在博客园里面转载我自己写的关于Qt的基础教程,没次写一篇我会在这里更新一下目录: Qt零基础教程(四) QWidget详解(1):创建一个窗口 Qt零基础教程(四) QWidget详解(2):QWid ...

随机推荐

  1. nginx+keepalived实现主从模式双机热备份

    主从模式就是一台机器提供服务,另一台机器作为备份机,当主机的服务停止时,备份机立刻接替主机的服务. 安装 安装nginx wget http://nginx.org/download/nginx-1. ...

  2. 2022春每日一题:Day 7

    题目:Fire 先预处理出每个F蔓延的时间,再bfs走迷宫. 代码: #include <cstdio> #include <cstdlib> #include <cst ...

  3. UED Landing 页 - 定时抓取掘金文章

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:琉易 https://liuxianyu.cn 本次分享基 ...

  4. php + layui 文件上传 以及 拖拽上传

    HTML: <div id="box"> <div id="drop_area">将文件拖拽到此区域</div> <d ...

  5. 协程Part1-boost.Coroutine.md

    首先,在计算机科学中 routine 被定义为一系列的操作,多个 routine 的执行形成一个父子关系,并且子 routine 一定会在父 routine 结束前结束,也就是一个个的函数执行和嵌套执 ...

  6. 批量将多个相同Excel表格内容合并到一个Excel表格的sheet工作簿当中。

    Sub Books2Sheets()Dim fd As FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) Dim ...

  7. 【PostgreSQL】PG读取元数据获取表结构及字段类型信息(过程拆解及其他应用场景)

    〇.参考链接 一.代码 指定模式的表名和字段 select c.relname 表名, cast ( obj_description (relfilenode, 'pg_class') as varc ...

  8. 【Hadoop学习】补充:优化、新特性

    一.数据压缩 1.概述 原则:IO密集而不是计算密集的job 压缩算法选择 2.压缩位置选择 通过参数进行配置 3.压缩实例: 数据流的压缩和解压缩 Map输出端采用压缩 Reduce输出端采用压缩 ...

  9. 跟我学Python图像处理丨图像分类原理与案例

    摘要:本篇文章将分享图像分类原理,并介绍基于KNN.朴素贝叶斯算法的图像分类案例. 本文分享自华为云社区<[Python图像处理] 二十六.图像分类原理及基于KNN.朴素贝叶斯算法的图像分类案例 ...

  10. 把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10

    就像黑火药时代里突然诞生的核弹一样,OpenAI的ChatGPT语言模型的横空出世,是人工智能技术发展史上的一个重要里程碑.这是一款无与伦比.超凡绝伦的模型,能够进行自然语言推理和对话,并且具有出色的 ...