zoukankan      html  css  js  c++  java
  • Mybatis 实用篇(四)返回值类型

    Mybatis 实用篇(四)返回值类型

    一、返回 List、Map

    List<User> getUsers();
    <select id="getUsers" resultType="User">
        select * from user;
    </select>
    
    Map<String, Object> getUsers();
    <select id="getUsers" resultType="map">
        select * from user;
    </select>
    

    二、返回指定的 key

        @MapKey("id")
        Map<Integer, User> getUsers();
        <select id="getUsers" resultType="User">
            select * from user;
        </select>
    

    三、resultMap

    mapUnderscoreToCamelCase=true 时可以自动将下划线转为驼峰规则,如果还不能满足要求就需要自定义返回类型。如下:

    List<User> getUsers();
    <select id="getUsers" resultMap="myMap">
        select u.id, u.name, u.did, d.name dname from user u, dept d where u.did=d.id;
    </select>
    
    <resultMap id="myMap" type="User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="dept.id" column="did"/>
        <result property="dept.name" column="dname"/>
    </resultMap>
    

    3.1 association

    association 可以将一个 java bean 对象 dept 封装到起来,如:

    public class User {
    
        private int id;
        private String name;
        private DePartment dept;
    }
    
    <resultMap id="myMap" type="User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <association property="dept" javaType="DePartment">
            <result property="id" column="did"/>
            <result property="name" column="dname"/>
        </association>
    </resultMap>
    
    <!-- association 可以分步查找 -->
    <resultMap id="myMap" type="User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <!-- 指定 select 语句的 id 和要传入的参数 id -->
        <association property="dept" javaType="DePartment" select="getDept" column="id"/>
    </resultMap>
    
    <select id="getUsers" resultMap="myMap">
        select id, name from user;
    </select>
    <select id="getDept" resultType="DePartment">
        select id, name from dept where id=#{id};
    </select>
    

    3.2 collection

    collection 可以将 java bean 对象的 list 集合 users 封装到起来,如:

    public class DePartment {
    
        private int id;
        private String name;
        private List<User> users;
    }
    
    <resultMap id="myMap" type="DePartment">
        <id property="id" column="did"/>
        <result property="name" column="dname"/>
        <collection property="users" ofType="User">
            <result property="id" column="id"/>
            <result property="name" column="name"/>
        </collection>
    </resultMap>
    <select id="getDept" resultMap="myMap">
        select u.id, u.name, u.did, d.name dname from user u, dept d where u.did=d.id;
    </select>
    

    也可以分步查找,注意 N + 1 问题

    <resultMap id="myMap" type="DePartment">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="users" ofType="User" select="getUsers" column="id"/>
    </resultMap>
    <select id="getUsers" resultType="User">
        select id, name from user where did=#{did};
    </select>
    <select id="getDept" resultMap="myMap">
        select id, name from dept;
    </select>
    

    注意:

    1. 支持多列传值:column="{key1=colum1, key2=colum2}"
    2. 分步查找支持缓存,可以配置属性 fetchType="eager(立即执行)/lazy(延迟加载)",也可以全局配置
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
    

    使用时如果用到了就会去查找,否则不会查找:

    List<DePartment> depts = userMapper.getDept();
    System.out.println(depts.get(0).getName());
    System.out.println(depts.get(0).getUsers());
    

    mybatis 查找时的 sql 如下,可以看到用到 dept 的 users 属性时才进行查找:

    2018-09-06 06:50:30 DEBUG getDept9:159 - ==>  Preparing: select id, name from dept; 
    2018-09-06 06:50:30 DEBUG getDept9:159 - ==> Parameters: 
    2018-09-06 06:50:31 DEBUG getDept9:159 - <==      Total: 2
    dev
    2018-09-06 06:50:31 DEBUG getUsers9:159 - ==>  Preparing: select id, name from user where did=?; 
    2018-09-06 06:50:31 DEBUG getUsers9:159 - ==> Parameters: 1(Integer)
    2018-09-06 06:50:31 DEBUG getUsers9:159 - <==      Total: 2
    [User{id=1, name='binarylei', age=0, sex='null'}, User{id=3, name='binarylei3', age=0, sex='null'}]
    

    每天用心记录一点点。内容也许不重要,但习惯很重要!

  • 相关阅读:
    解决Navicat导出Excel数字为科学计数法问题
    maven pom.xml文件中properties标签介绍
    Maven中配置maven-compiler-plugin 插件
    使用Spring Boot 优雅地发送邮件
    Intellij IDEA 设置JDK版本
    MySQL order by if()或order by in()条件排序
    Eclipse工具的简单使用
    Java中的四种权限修饰符及六种非访问修饰符(简识)
    原来你的电脑就是这样被木马远控了!!!(转载)
    记Java中有关内存的简单认识
  • 原文地址:https://www.cnblogs.com/binarylei/p/9746984.html
Copyright © 2011-2022 走看看