mybatis处理返回结果集

news2024/9/24 11:30:59

结果处理

1 简单类型输出映射

返回简单基本类型

//查询管理员总数
int adminCount();
<select id="adminCount" resultType="int">
        select count(*) from admin
</select>
  • 返回结果需要定义后才能使用简称

    • eg:resultType="Admin" 已经定义过别名了,所以就可以使用简称

    • 那么java中其它常用类型简称如何使用?(不使用简称就需要用全类名,eg:java.util.List)

      • 在mybatis底层源码中定义了一些常用的类型的简称

794769acd7964b44bb646cee0d315342.png

dc81f836aa394b8faec49d21ea023cca.png

dc987f4058494cfc935327cdc9978b91.png

  • 也可以在官网中查看定义好的类型简称或者自己可以重写已有的类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型,具体参考mybatis – MyBatis 3 | 配置

2 对象映射

  • mybatis会将查询到的结果自动封装到一个对象中,会自己创建给定类型的类的对象(通过是否执行无参构造方法我们可以看到)

  • 自动封装的条件:

    • 开启了全局的自动结果映射,PARTIAL默认是单张表开启的a940773f98644fdea54f5730f0e1c5ee.png

    • 数据库列名与属性名名字相同,mybatis会自动将查询结果封装到pojo对象中;如果不一样,比如java中使用标准驼峰命名,数据库中使用下划线连接命名,这个时候可以通过开启驼峰命名自动映射或开启全局设置实现自动转换98bd7ae4827b4f609913b89495bd4780.png

例如: 

定义的类中的属性名:

a79aa7fbe9c545aeb913a61e3ec3cfef.png

 <select id="findAdminById" parameterType="int" resultType="Admin">
      // 定义别名acc、adminGender
      select id,account acc,password,admin_gender adminGender from admin where id =#{id};
</select>

可以看到列名与属性名相同的,mybatis会自动将结果封装到pojo对象中,不同的则不会映射:

32e32ea526034a3b813b33668fa1a70e.png

开启驼峰命名自动映射后即使不设置别名,也可以自动实现驼峰映射(eg:admin_gender ---> adminGender)

  • 在全局配置文件中开启

c2eb7579d4114a9a937ca2f97135d180.png

查询多行数据,也就是返回多个对象

  • mybatis会自动创建多个对象,并通过set方法为属性赋值,然后将这些对象自动的封装到List集合中

List<Admin> findAdmins();
<select id="findAdmins" resultType="Admin">
    select id,account,password,admin_gender from admin
</select>

420e8f96e86c48f294092cc8121f0023.png

3 特殊处理定义 resultMap

定义 resutlMap

  • 在resutlMap 标签中,我们可以自定义结果映射

<resultMap id="adminMap" type="Admin">
     <id column="id" property="id"></id><!-- 封装映射主键列 -->
     <result column="account" property="account"></result>
     <result column="password" property="password"></result>
     <result column="admin_gender" property="gender"></result> 
</resultMap> 

  (1) resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为“adminMap”

  (2) resutlMap 的 id 属性是映射的 POJO 类

  (3) id 标签映射主键,result 标签映射非主键

  (4) property 设置 POJO 的属性名,column 数据库中列名

使用 resutlMap

<select id="findAdmins" resultMap="adminMap">
      select id,account,password,admin_gender from admin
</select>

  (1) 本例的输出映射使用的是 resultMap,而非 resultType

  (2) resultMap 引用了 adminMap

在说关联查询之前我们先说一个问题:

在关联查询的时候我们需要同时获取几张表中的数据,在模型类中进行封装的时候,我们会在一个类中把其他类中已有的属性再定义一遍,比如以前我们会在Student类会中再定义一遍我们需要的Dorm类中已有的属性,这样显然是不合理的,所以我们现在直接在Student中关联Dorm类中的属性,它就会将数据封装到关联的类中去,以减少代码冗余。

eg:

2e38bbf643a84d3e97a7cdda6d33a57f.png

4 多表关联处理结果集及嵌套查询

4.1 多表关联处理结果

resultMap 元素中 association , collection 元素.

  • association :是一对一使用的,用来封装类中所关联的对象信息,会创建一个关联对象

    • property="类中的属性名" ,javaType="类型",select表示要执行的sql语句

  • collection:关联元素处理一对多关联

4.2 嵌套查询

  • 将一个多表关联查询拆分为多次查询,查询主表数据,然后查询关联表数据

<association property="dorm" column="dormid" 
             select="findDormById" javaType="Dorm">
</association>

  (1) select:指定关联查询对象的 Mapper Statement ID 为 findDormById

  (2) column="dormid" :关联查询时将 dormid 列的值传入 findDormById,传多个参数的话就是{"属性名"="参数","属性名"="参数"}

  (3) collection 和 association 都需要配置 select 和 column 属性,两者配置方法相同

案例数据库表:

student表:

8542ef62adff4a6892ca94fa5e9d5626.png

 dorm表:

ddfcb4959c9840348e33da99ec6cc0e7.png

 admin表:

592628e55fe54ef08e1a5207b5f4ca9a.png

案例一

  • 在查询学生信息的时候将宿舍号和操作人也查询出来,这时就要用到多表关联结果处理

方法一:通过三张表关联查询,一次把信息都查询出来,在封装信息的时候再处理

Student findStudentById(int id);
<resultMap id="studentMap" type="com.ffyc.mybatispro.model.Student">
    <!--  
         mybatis默认配置,一旦出现了嵌套关联查询,就把自动映射关闭了,所以这里我们需要自定义结果映射
         要想让它继续自动映射,就需要在全局配置文件中设置autoMappingBehavior属性值为true,
         我们是不建议在多表查询时开启的,因为这需要高度规范的命名
    -->
    <id column="id" property="id"></id>
    <result column="num" property="num"></result>
    <result column="name" property="name"></result>
    <result column="gender" property="gender"></result>
    <result column="birthday" property="birthday"></result>
    <result column="oper_time" property="operTime"></result>
    <!--
      association:用来封装关联的对象信息
      property="dorm", 就是创建一个关联的对象
    -->
    <association property="dorm" javaType="Dorm">
        <!--
            这里的column是数据库中的列名或者我们定义的列的别名 
            property是Dorm类中的属性
        -->
        <result column="dormNum" property="num"></result>
    </association>
    <association property="admin" javaType="Admin">
        <result column="account" property="account"></result>
    </association>
</resultMap>
<select id="findStudentById" parameterType="int" resultMap="studentMap">
    SELECT 
        s.id,
        s.num,
        s.name,
        s.gender,
        s.birthday,
        d.num dormNum,
        a.account,
        s.oper_time
    FROM student s
              LEFT JOIN dorm d ON s.dormid = d.id
              LEFT JOIN admin a ON s.adminid = a.id
              WHERE s.id = #{id}
</select>

测试:

@Test
public void find() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
    
    Student student = studentDao.findStudentById(1);
    
    sqlSession.commit();
    sqlSession.close();
}

c98d4c824a6b4410869d4076354dd5cf.png

  • 在这里还要补充一点:如果在拿到学生信息后,需要获取学生的宿舍号,首先要拿到学生对象中的Dorm对象,然后再获取Dorm对象中属性

    System.out.println(student.getDorm().getNum());
    • 前端也一样30fbc45db6de43528ec4d4cc69db3538.png

  • 注意:查询多个学生信息只需要将sq语句中的WHERE s.id = #{id}这个条件给去掉,resultMap和查询一个是一样的

    List<Student> findStudents();

方法二:嵌套查询(把sql分成多次查询,先查询学生信息,再通过外键查询宿舍和操作人信息)

<resultMap id="studentMap" type="Student">
    <id column="id" property="id"></id>
    <result column="num" property="num"></result>
    <result column="name" property="name"></result>
    <result column="gender" property="gender"></result>
    <result column="birthday" property="birthday"></result>
    <result column="oper_time" property="operTime"></result>
    <!--
        select="findDormById" 查询语句id
        column="dormid" 将查询到的dormid作为条件再查询
        javaType="Dorm" 类型
    -->
    <association property="dorm" column="dormid" 
                 select="findDormById" javaType="Dorm"></association>
    <association property="admin" column="adminid" 
                 select="findAdminById" javaType="Admin"></association>
</resultMap>
<select id="findStudentById" resultType="Student" resultMap="studentMap">
     select id,num,name,gender,birthday,dormid,adminid from student where id = #{id}
</select>
<select id="findDormById" resultType="Dorm">
     select num from dorm where id = #{dormid}
</select>
<select id="findAdminById" resultType="Admin">
    select account from admin where id = #{adminid}
</select>

测试:

ccabeb07c9434f6fa69b7f4443aa619c.png

案例二

  • 在查询宿舍的同时查询出这个宿舍中所住学生的信息

方法1:关联查询

类中属性定义:

e231d6403c804109942461ddc89e9407.png

 Dorm findDormById(int id);
<resultMap id="dormMap" type="Dorm">
    <id column="id" property="id"></id>
    <result column="num" property="num"></result>
    <association property="admin" javaType="Admin">
        <result column="account" property="account"></result>
    </association>
    <!--
        property="students" 属性
        javaType="list" students的类型(list为类型简称)
        ofType="Student" 集合里所装数据的类型
    -->
    <collection property="students" javaType="list" ofType="Student">
        <result column="snum" property="num"></result>
        <result column="name" property="name"></result>
    </collection>
</resultMap>
<select id="findDormById" resultMap="dormMap" resultType="Dorm">
        SELECT
            d.id,
            d.num,
            s.num,
            s.name,
            a.account
       FROM dorm d
       LEFT JOIN admin a ON d.adminid = a.id
       LEFT JOIN student s ON d.id = s.dormid
                  WHERE d.id = 1
</select>

测试:

@Test
public void find(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    DormDao dormDao = sqlSession.getMapper(DormDao.class);
    //通过id查询宿舍和这个宿舍中所住学生的信息
    Dorm dorm = dormDao.findDormById(1);
    sqlSession.close();
}

3fe786f7017d4affad6e0cebc3f3b0fd.png

方法2:嵌套查询

<resultMap id="dormMap2" type="Dorm">
    <id column="id" property="id"></id>
    <result column="num" property="num"></result>
    <association property="admin" column="adminid" javaType="Admin"  select="findAdminById1"></association>
    <collection property="students" javaType="list" ofType="Student" column="id"
                select="findStudents1"></collection>
</resultMap>
<select id="findDormById1" resultMap="dormMap2" resultType="Dorm">
      SELECT id,num,adminid FROM dorm WHERE id = #{id}
</select>
<select id="findAdminById1" resultType="Admin">
    SELECT account FROM admin WHERE id = #{adminid}
</select>
<select id="findStudents1" resultType="Student">
    SELECT num,NAME FROM student WHERE dormid = #{id}
</select>

测试:

4aa9e887bd7447c88cdf83724902a591.png

  • 查询所有的宿舍及关联的学生信息

方法1:关联查询

List<Dorm> findDorms();
<select id="findDorms" resultMap="dormMap">
     SELECT
            d.id,
            d.num,
            s.num,
            s.name,
            a.account
       FROM dorm d
       LEFT JOIN admin a ON d.adminid = a.id
       LEFT JOIN student s ON d.id = s.dormid
</select>

测试:

@Test
public void find(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    DormDao dormDao = sqlSession.getMapper(DormDao.class);
    //查询每个宿舍,并关联每个宿舍中有多少个学生
    List<Dorm> dorms = dormDao.findDorms();
    /*
      对查询结果进行获取输出
     */
    // 遍历所有宿舍
    for (Dorm dorm:dorms){
        System.out.println(dorm);
        // 获取到宿舍中所有学生信息
        for (Student student:dorm.getStudents()){
            System.out.println(student.getNum()+":"+student.getName());
        }
    }
    sqlSession.close();
}

可以看到查询出了所有的宿舍以及宿舍所住学生的信息:

2c07788c7ef44cceb651d6a8efafeb47.png

方法2:嵌套查询

<resultMap id="dormMap" type="Dorm">
    <id column="id" property="id"></id>
    <result column="num" property="num"></result>
    <association property="admin" column="adminid" javaType="Admin" select="findAdminById"></association>
    <collection property="students" javaType="list" ofType="Student" column="id"
                select="findStudents"></collection>
</resultMap>
<select id="findDorms" resultType="Dorm" resultMap="dormMap">
    SELECT id,num,adminid FROM dorm
</select>
<select id="findAdminById" resultType="Admin">
    SELECT account FROM admin WHERE id = #{adminid}
</select>
<select id="findStudents" resultType="Student">
    SELECT num,NAME FROM student WHERE dormid = #{id}
</select>

测试:806ac0c3e5de483b845b73056249e1fb.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个人信息保护合规建设桔皮书

声明 本文是学习个人信息保护合规建设桔皮书. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 个人信息保护建设思考 识别监管要求聚焦安全保护重点 1. 个人信息处理原则合规 《个人信息保护法》总则中规定了个人信息处理的合法、正当、必要…

应用torchinfo计算网络的参数量

1 问题定义好一个VGG11网络模型后&#xff0c;我们需要验证一下我们的模型是否按需求准确无误的写出&#xff0c;这时可以用torchinfo库中的summary来打印一下模型各层的参数状况。这时发现表中有一个param以及在经过两个卷积后参数量&#xff08;param&#xff09;没变&#x…

从socket开始讲解网络模式(epoll)

从socket开始讲解网络模式 windows采用IOCP网络模型&#xff0c;而linux采用epoll网络模型&#xff08;Linux得以实现高并发&#xff0c;并被作为服务器首选的重要原因&#xff09;&#xff0c;接下来讲下epoll模型对网络编程高并发的作用 简单的socket连接 socket连接交互的…

Python学习笔记-PyQt6之MVC项目结构初试

MVC结构是之model-view-controller三层架构的开发框架&#xff0c;用以将项目界面和逻辑进行解耦分析&#xff0c;便于维护。与WPF的MVVM相似。 项目开发做了一个秒表试手&#xff1a; 1.项目架构如下 controller&#xff1a;用于放置界面的控制逻辑model&#xff1a;用于放置…

回顾这十年,感悟

十年前&#xff0c;我35岁了&#xff0c;在体制内工作&#xff0c;到了很多人眼里的躺平的年龄。我眼里的世界&#xff0c;也就那么大&#xff0c;没有想过更进一步&#xff0c;有点中年油腻了&#xff0c;体质也差了。……终于有一天&#xff0c;醒悟了&#xff0c;不想过这样…

高并发系统设计 -- 秒杀系统

高并发秒杀 秒杀问题相信大家都知道的&#xff0c;虽然是一个烂大街的项目&#xff0c;但是秒杀问题背后的知识是很值得学习的&#xff0c;很多高并发系统设计都可以参照秒杀系统来进行实现。而且顺着这个问题&#xff0c;我会教给大家如何进行高并发的系统设计。 我们先来看…

Android集成三方浏览器之Crosswalk

上一篇讲解了腾讯 X5 内核的集成&#xff0c;这一篇是讲解 Crosswalk 的集成 Crosswalk 也是采用了Chromenium 内核&#xff0c;是一款开源的 web 引擎&#xff0c;开发者可以直接把 Crosswalk 嵌入到应用之中&#xff0c;当然也支持共享模式&#xff08;系统中没有对应的 Cros…

费解的开关(BFS+哈希表+二进制枚举)

费解的开关&#xff08;BFS哈希表二进制枚举&#xff09;一、题目二、思路分析1、算法标签2、思路梳理方法1&#xff1a;BFS哈希表方法2&#xff1a;二进制枚举DFS一、题目 二、思路分析 1、算法标签 这道题考察的是BFS哈希表,DFS二进制枚举 2、思路梳理 方法1&#xff1a;…

Cohen–Sutherland 算法介绍(简单易懂)

目录 一、算法介绍 二、算法描述 三、算法总结 一、算法介绍 Cohen–Sutherland 算法用于直线段裁剪&#xff0c;通过判断直线与窗口之间的关系&#xff0c;来决定直线段部分的保留与舍弃。 二、算法描述 ① 首先&#xff0c;我们把屏幕分割成 9 个区域块&#xff0c;最中间区…

音乐相册如何制作?一步一步教会你

很多小伙伴会在旅行时&#xff0c;拍摄各种好看的照片&#xff0c;一趟旅途下来能留下好多照片呢&#xff0c;有些人会习惯将这些照片归类到一个相册里。其实我们也可以使用一些免费的软件将这些照片制作成有纪念意义的音乐相册&#xff0c;那大家知道免费制作音乐相册怎么做吗…

npm install 报警告npm WARN

npm install 报警告npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents1.2.0 (node_modules\fsevents npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN fsevents1.2.0 had bundled packages that do not match the requi…

Crack:Inobitec DICOM Viewer Pro 2.9 多语言版本

Inobitec DICOM Viewer Pro 的使命是扩大医生可见和可能的范围。通过为医学提供高质量的创新 IT 解决方案&#xff0c;Ω578867473为改善全世界人民的健康做出了贡献。感受到自己工作的价值&#xff0c;意识到 21 世纪医学面临的挑战的重要性&#xff0c;以及解决这些挑战的乐趣…

WordPress使用二级域名存储图片等静态资源达到网站加速的详细配置

最近发现源站压力较大&#xff08;水管太小&#xff09;于是想着把WordPress博客的图片等静态资源分离到二级域名中&#xff0c;二级域名再使用一次云盾免费加速CDN&#xff0c;达到动静分离的效果&#xff0c;在这个过程中遇到一些坑&#xff0c;特此记录一下&#xff0c;方便…

NumpyPandas 数据处理与挖掘

笔记来源B站&#xff1a;https://www.bilibili.com/video/BV1xt411v7z9?p21 python学习笔记1 Numpy1.1 Numpy优势1.1.1 Numpy介绍1.1.2 ndarray介绍1.1.3 ndarray与Python原生list效率对比1.1.4 ndarray优势1.2 认识N维数组-ndarray属性1.2.1 ndarray的属性1.2.2 ndarray的形状…

11.1、基于Django4的可重用、用户注册和登录系统搭建

文章目录系统的功能思路分析搭建项目环境创建项目&#xff08;虚拟环境&#xff09;创建子应用修改语言、时区创建数据库表启动项目git提交项目代码到本地仓库git initi 初始化&#xff0c;创建本地git仓库pycharm安装 .ignore插件&#xff0c;来设置git的忽略文件提交代码修改…

SpringBoot+VUE前后端分离项目学习笔记 - 【09 SpringBoot集成MyBatis-Plus和SwaggerUI】

集成mybatis-plus依赖 官网 : https://baomidou.com/ pom.xml <!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></depe…

01月份图形化一级打卡试题

活动时间 从2023年 1月1日至1月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; &#xff08;1&#xff09;小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 &#xff08;2&#xff09;小朋友做完题目后&…

认证的未来:2023 年值得关注的四大趋势

在经济不确定性和地缘政治紧张的一年中&#xff0c;数字领域充满网络威胁也就不足为奇了。从广泛的假冒诈骗到日益增多的短信网络钓鱼&#xff0c;网络攻击的频率和严重程度在 2022 年有所增加&#xff0c;这突显了所有行业的组织身份验证漏洞。 因此&#xff0c;当我们翻开新…

amis组件学习的配置介绍(二)

table view 表格视图 这个看文档也很好理解&#xff0c;但是还是需要介绍一下。 trs&#xff1a; <Array>设置表格行属性。tds: <Array>设置单元格属性。 {"type": "table-view",// 设置表格行"trs": [{"background": &…

常见排序算法(上)

篮球哥温馨提示&#xff1a;编程的同时不要忘记锻炼哦&#xff01;稳定的排序算法&#xff0c;可以设计成不稳定的. 目录 1、 认识排序 2、常见排序的分类 3、直接插入排序 4、希尔排序(缩小增量排序) 5、选择排序 6、堆排序 1、 认识排序 在学校中&#xff0c;如果我们…