mybatis处理返回结果集

这篇具有很好参考价值的文章主要介绍了mybatis处理返回结果集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

结果处理

1 简单类型输出映射

返回简单基本类型

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

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

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

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

mybatis查询返回list集合,mybatis,java,数据库

mybatis查询返回list集合,mybatis,java,数据库

mybatis查询返回list集合,mybatis,java,数据库

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

2 对象映射

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

  • 自动封装的条件:

    • 开启了全局的自动结果映射,PARTIAL默认是单张表开启的mybatis查询返回list集合,mybatis,java,数据库

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

例如: 

定义的类中的属性名:

mybatis查询返回list集合,mybatis,java,数据库

 <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对象中,不同的则不会映射:

mybatis查询返回list集合,mybatis,java,数据库

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

  • 在全局配置文件中开启

mybatis查询返回list集合,mybatis,java,数据库

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

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

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

mybatis查询返回list集合,mybatis,java,数据库

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:

mybatis查询返回list集合,mybatis,java,数据库

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表:

mybatis查询返回list集合,mybatis,java,数据库

 dorm表:

mybatis查询返回list集合,mybatis,java,数据库

 admin表:

mybatis查询返回list集合,mybatis,java,数据库

案例一

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

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

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();
}

mybatis查询返回list集合,mybatis,java,数据库

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

    System.out.println(student.getDorm().getNum());
    • 前端也一样mybatis查询返回list集合,mybatis,java,数据库

  • 注意:查询多个学生信息只需要将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>

测试:

mybatis查询返回list集合,mybatis,java,数据库

案例二

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

方法1:关联查询

类中属性定义:

mybatis查询返回list集合,mybatis,java,数据库

 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();
}

mybatis查询返回list集合,mybatis,java,数据库

方法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>

测试:

mybatis查询返回list集合,mybatis,java,数据库

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

方法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();
}

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

mybatis查询返回list集合,mybatis,java,数据库

方法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>

测试:mybatis查询返回list集合,mybatis,java,数据库

 文章来源地址https://www.toymoban.com/news/detail-649490.html

到了这里,关于mybatis处理返回结果集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java使用线程池异步处理并返回结果

    1.1、@Bean注入的线程池 1.2、注入线程池处理异步任务

    2024年02月12日
    浏览(38)
  • Java入门7(异常处理,list集合)

    一般来讲,程序出现错误的时候,大致情况有三种: 语法错误 运行时错误,指的是各程序运行的时候,出现的一些没有想到的问题,比如除数为0,比如数组下标越界等等 逻辑错误,运行结果和与其结果不一致,俗称bug ⭐Java中的异常处理机制主要用于处理运行时错误 ​运行

    2024年02月03日
    浏览(61)
  • Java 查询 List 中存在的数据在集合中的索引位置

    在 Java 开发中,我们经常需要查询某些数据在 List 集合中的索引位置。如果我们使用传统的方式,比如逐条查询或者使用循环遍历,可能会造成时间复杂度较高的问题。本文将介绍如何使用 Java 优雅地查询 List 集合中存在的数据在集合中的索引位置,并提供示例代码和详细说

    2024年02月07日
    浏览(53)
  • 【Java】Mybatis查询数据库

    经过前面的学习Spring系列的操作已经差不多了,接下来我们继续学习更加重要的知识,将前端传递的参数存储起来,或者查询数据库里面的数据 MyBatis是款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis几乎祛除了所有的JDBC代码以及设置参数和获取结果集

    2024年01月18日
    浏览(60)
  • Java8对List集合中的数据进行过滤处理

    目录 0.需求场景 1.编码实现         假设有这样一个需求,将List中所有超过 35 岁的员工剔除,该如何实现呢?我们可以利用 Java8 的流式编程,轻松的实现这个需求。         当然也不局限与上述场景,对应的处理方法适用与根据 List 中元素或元素的属性,对 List 进行处

    2024年02月15日
    浏览(59)
  • mysql查询结果返回e9

    在使用 MySQL 数据库时,我们经常会进行查询操作。然而,有时候我们会发现,查询结果返回的数值中会有一个奇怪的字符“e9”,这个字符代表的是科学计数法中的10的9次方,也就是十亿。那么,为什么会出现这个字符,该如何解决呢?下面我们一起来探讨。 解决方法有两种

    2024年02月15日
    浏览(40)
  • 使用java8 新特性stream流对List<Map<String, Object>>集合进行遍历、过滤、查询、去重、排序、分组

    对于一个ListMapString, Object类型的数据,可以使用Java 8的新特性stream流来进行遍历、过滤、查询、去重、排序、分组等操作。 遍历: 过滤: 查询: 去重: 排序: 分组:

    2024年02月10日
    浏览(69)
  • Java EE 突击 13 - MyBatis 查询数据库(2)

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月11日
    浏览(51)
  • 配置 mybatis 打印出执行的 sql 及返回的结果集

    在开发过程中, 经常会遇到想要看到应用所执行的 sql 这样的需求. 比如你写了一个查询的功能, 但查询出来的结果与你预期的不符合, 你想搞清楚到底哪里出了问题, 你自然需要看看所执行的 sql 语句, 必要的话甚至还要亲自拷贝到数据库里去查查. 自然, 这就要求应用要能把执

    2024年02月07日
    浏览(45)
  • elasticsearch相同查询条件每次返回结果不一样

    现象: 今天web开发人员反馈,在腾讯云对某一个客户的某表数据执行相同的查询结果,有时候不返回数据; 我们是按周区分索引的,数据量不大,去掉时间条件执行查询发现会交替出现  命中21980和命中的8999结果; 解决: 1.首先简单查询其他的表或者其他的集群有没有类似

    2024年01月23日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包