Mybatis之resultMap详解

打印 上一主题 下一主题

主题 908|帖子 908|积分 2724

resultMap作用是处理数据表中字段与java实体类中属性的映射关系。
准备工作

① 创建数据库&数据表
  1. CREATE DATABASE `dbtest1`;
  2. CREATE TABLE `t_emp` (
  3.   `emp_id` int NOT NULL AUTO_INCREMENT,
  4.   `emp_name` varchar(20) DEFAULT NULL,
  5.   `age` int DEFAULT NULL,
  6.   `gender` char(1) DEFAULT NULL,
  7.   `dept_id` int DEFAULT NULL,
  8.   PRIMARY KEY (`emp_id`)
  9. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  10. CREATE TABLE `t_dept` (
  11.   `dept_id` int DEFAULT NULL,
  12.   `dept_name` varchar(20) DEFAULT NULL
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
复制代码
② 创建实体类Emp.java&Dept.java
  1. public class Dept {
  2.     private int deptId;
  3.     private String deptName;
  4.     //一对多关系(一个部门对应多个员工)
  5.     private List<Emp> emps;
  6.     public Dept() {
  7.     }
  8.     public Dept(int deptId, String deptName, List<Emp> emps) {
  9. <settings>
  10.    
  11.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  12. </settings>this.deptId = deptId;
  13. <settings>
  14.    
  15.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  16. </settings>this.deptName = deptName;
  17. <settings>
  18.    
  19.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  20. </settings>this.emps = emps;
  21.     }
  22.     public int getDeptId() {
  23. <settings>
  24.    
  25.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  26. </settings>return deptId;
  27.     }
  28.     public void setDeptId(int deptId) {
  29. <settings>
  30.    
  31.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  32. </settings>this.deptId = deptId;
  33.     }
  34.     public String getDeptName() {
  35. <settings>
  36.    
  37.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  38. </settings>return deptName;
  39.     }
  40.     public void setDeptName(String deptName) {
  41. <settings>
  42.    
  43.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  44. </settings>this.deptName = deptName;
  45.     }
  46.     public List<Emp> getEmps() {
  47. <settings>
  48.    
  49.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  50. </settings>return emps;
  51.     }
  52.     public void setEmps(List<Emp> emps) {
  53. <settings>
  54.    
  55.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  56. </settings>this.emps = emps;
  57.     }
  58.     @Override
  59.     public String toString() {
  60. <settings>
  61.    
  62.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  63. </settings>return "Dept{" +
  64. <settings>
  65.    
  66.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  67. </settings><settings>
  68.    
  69.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  70. </settings>"deptId=" + deptId +
  71. <settings>
  72.    
  73.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  74. </settings><settings>
  75.    
  76.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  77. </settings>", deptName='" + deptName + '\'' +
  78. <settings>
  79.    
  80.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  81. </settings><settings>
  82.    
  83.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  84. </settings>", emps=" + emps +
  85. <settings>
  86.    
  87.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  88. </settings><settings>
  89.    
  90.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  91. </settings>'}';
  92.     }
  93. }
复制代码
  1. public class Emp {
  2.     private int empId;
  3.     private String empName;
  4.     private int age;
  5.     private String gender;
  6.     //多对一关系(多个员工对应一个部门)
  7.     private Dept dept;
  8.     public Emp() {
  9.     }
  10.     public Emp(int empId, String empName, int age, String gender, Dept dept) {
  11. <settings>
  12.    
  13.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  14. </settings>this.empId = empId;
  15. <settings>
  16.    
  17.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  18. </settings>this.empName = empName;
  19. <settings>
  20.    
  21.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  22. </settings>this.age = age;
  23. <settings>
  24.    
  25.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  26. </settings>this.gender = gender;
  27. <settings>
  28.    
  29.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  30. </settings>this.dept = dept;
  31.     }
  32.     public int getEmpId() {
  33. <settings>
  34.    
  35.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  36. </settings>return empId;
  37.     }
  38.     public void setEmpId(int empId) {
  39. <settings>
  40.    
  41.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  42. </settings>this.empId = empId;
  43.     }
  44.     public String getEmpName() {
  45. <settings>
  46.    
  47.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  48. </settings>return empName;
  49.     }
  50.     public void setEmpName(String empName) {
  51. <settings>
  52.    
  53.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  54. </settings>this.empName = empName;
  55.     }
  56.     public int getAge() {
  57. <settings>
  58.    
  59.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  60. </settings>return age;
  61.     }
  62.     public void setAge(int age) {
  63. <settings>
  64.    
  65.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  66. </settings>this.age = age;
  67.     }
  68.     public String getGender() {
  69. <settings>
  70.    
  71.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  72. </settings>return gender;
  73.     }
  74.     public void setGender(String gender) {
  75. <settings>
  76.    
  77.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  78. </settings>this.gender = gender;
  79.     }
  80.     public Dept getDept() {
  81. <settings>
  82.    
  83.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  84. </settings>return dept;
  85.     }
  86.     public void setDept(Dept dept) {
  87. <settings>
  88.    
  89.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  90. </settings>this.dept = dept;
  91.     }
  92.     @Override
  93.     public String toString() {
  94. <settings>
  95.    
  96.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  97. </settings>return "Emp{" +
  98. <settings>
  99.    
  100.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  101. </settings><settings>
  102.    
  103.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  104. </settings>"empId=" + empId +
  105. <settings>
  106.    
  107.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  108. </settings><settings>
  109.    
  110.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  111. </settings>", empName='" + empName + '\'' +
  112. <settings>
  113.    
  114.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  115. </settings><settings>
  116.    
  117.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  118. </settings>", age=" + age +
  119. <settings>
  120.    
  121.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  122. </settings><settings>
  123.    
  124.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  125. </settings>", gender='" + gender + '\'' +
  126. <settings>
  127.    
  128.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  129. </settings><settings>
  130.    
  131.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  132. </settings>", dept=" + dept +
  133. <settings>
  134.    
  135.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  136. </settings><settings>
  137.    
  138.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  139. </settings>'}';
  140.     }
  141. }
复制代码
③ 创建jdbc.properties,添加如下内容
  1. jdbc.driver=com.mysql.cj.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/dbtest1?serverTimezone=UTC
  3. jdbc.username=root
  4. jdbc.password=123456
  5. jdbc.driverClassName=com.mysql.jdbc.Driver
复制代码
④ 创建Mybatis核心配置文件
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. <settings>
  4.    
  5.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  6. </settings>PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  7. <settings>
  8.    
  9.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  10. </settings>"http://mybatis.org/dtd/mybatis-3-config.dtd">
  11. <configuration>
  12.    
  13.    
  14.     <properties resource="jdbc.properties"/>
  15.    
  16.    
  17.     <settings>
  18. <settings>
  19.    
  20.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  21. </settings>
  22. <settings>
  23.    
  24.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  25. </settings><setting name="mapUnderscoreToCamelCase" value="true"/>
  26. <settings>
  27.    
  28.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  29. </settings>
  30. <settings>
  31.    
  32.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  33. </settings><setting name="lazyLoadingEnabled" value="true"/>
  34. <settings>
  35.    
  36.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  37. </settings>
  38. <settings>
  39.    
  40.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  41. </settings><setting name="aggressiveLazyLoading" value="false"/>
  42.     </settings>
  43.    
  44.    
  45.     <typeAliases>
  46. <settings>
  47.    
  48.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  49. </settings>
  50. <settings>
  51.    
  52.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  53. </settings><package name="com.evan.mybatis.entity"/>
  54.     </typeAliases>
  55.    
  56.     <environments default="mysql8">
  57. <settings>
  58.    
  59.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  60. </settings>
  61. <settings>
  62.    
  63.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  64. </settings><environment id="mysql8">
  65. <settings>
  66.    
  67.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  68. </settings>    <transactionManager type="JDBC"/>
  69. <settings>
  70.    
  71.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  72. </settings>    <dataSource type="POOLED">
  73. <settings>
  74.    
  75.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  76. </settings><settings>
  77.    
  78.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  79. </settings><property name="driver" value="${jdbc.driver}"/>
  80. <settings>
  81.    
  82.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  83. </settings><settings>
  84.    
  85.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  86. </settings><property name="url" value="${jdbc.url}"/>
  87. <settings>
  88.    
  89.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  90. </settings><settings>
  91.    
  92.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  93. </settings><property name="username" value="${jdbc.username}"/>
  94. <settings>
  95.    
  96.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  97. </settings><settings>
  98.    
  99.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  100. </settings><property name="password" value="${jdbc.password}"/>
  101. <settings>
  102.    
  103.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  104. </settings>    </dataSource>
  105. <settings>
  106.    
  107.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  108. </settings></environment>
  109. <settings>
  110.    
  111.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  112. </settings>
  113. <settings>
  114.    
  115.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  116. </settings><environment id="mysql5">
  117. <settings>
  118.    
  119.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  120. </settings>    <transactionManager type="JDBC"/>
  121. <settings>
  122.    
  123.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  124. </settings>    <dataSource type="POOLED">
  125. <settings>
  126.    
  127.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  128. </settings><settings>
  129.    
  130.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  131. </settings><property name="driver" value="${jdbc.driverClassName}"/>
  132. <settings>
  133.    
  134.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  135. </settings><settings>
  136.    
  137.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  138. </settings><property name="url" value="${jdbc.url}"/>
  139. <settings>
  140.    
  141.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  142. </settings><settings>
  143.    
  144.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  145. </settings><property name="username" value="${jdbc.username}"/>
  146. <settings>
  147.    
  148.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  149. </settings><settings>
  150.    
  151.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  152. </settings><property name="password" value="${jdbc.password}"/>
  153. <settings>
  154.    
  155.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  156. </settings>    </dataSource>
  157. <settings>
  158.    
  159.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  160. </settings></environment>
  161.     </environments>
  162.    
  163.     <mappers>
  164. <settings>
  165.    
  166.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  167. </settings><package name="com.evan.mybatis.mapper"/>
  168.     </mappers>
  169. </configuration>
复制代码
⑤ 添加依赖
  1.     <dependencies>
  2. <settings>
  3.    
  4.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  5. </settings><dependency>
  6. <settings>
  7.    
  8.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  9. </settings>    <groupId>org.mybatis</groupId>
  10. <settings>
  11.    
  12.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  13. </settings>    <artifactId>mybatis</artifactId>
  14. <settings>
  15.    
  16.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  17. </settings></dependency>
  18. <settings>
  19.    
  20.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  21. </settings><dependency>
  22. <settings>
  23.    
  24.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  25. </settings>    <groupId>junit</groupId>
  26. <settings>
  27.    
  28.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  29. </settings>    <artifactId>junit</artifactId>
  30. <settings>
  31.    
  32.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  33. </settings>    <scope>test</scope>
  34. <settings>
  35.    
  36.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  37. </settings></dependency>
  38. <settings>
  39.    
  40.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  41. </settings><dependency>
  42. <settings>
  43.    
  44.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  45. </settings>    <groupId>mysql</groupId>
  46. <settings>
  47.    
  48.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  49. </settings>    <artifactId>mysql-connector-java</artifactId>
  50. <settings>
  51.    
  52.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  53. </settings></dependency>
  54. <settings>
  55.    
  56.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  57. </settings><dependency>
  58. <settings>
  59.    
  60.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  61. </settings>    <groupId>log4j</groupId>
  62. <settings>
  63.    
  64.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  65. </settings>    <artifactId>log4j</artifactId>
  66. <settings>
  67.    
  68.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  69. </settings></dependency>
  70. <settings>
  71.    
  72.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  73. </settings><dependency>
  74. <settings>
  75.    
  76.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  77. </settings>    <groupId>commons-logging</groupId>
  78. <settings>
  79.    
  80.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  81. </settings>    <artifactId>commons-logging</artifactId>
  82. <settings>
  83.    
  84.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  85. </settings></dependency>
  86.     </dependencies>
复制代码
⑥ 创建SqlSession工具类
  1. public class SqlSessionUtil {
  2.     private static final Log logger = LogFactory.getLog(SqlSessionUtil.class);
  3.     public static SqlSession getSqlSession() {
  4. <settings>
  5.    
  6.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  7. </settings>SqlSession sqlSession = null;
  8. <settings>
  9.    
  10.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  11. </settings>try(InputStream is = Resources.getResourceAsStream("mybatis-config.xml");) {
  12. <settings>
  13.    
  14.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  15. </settings>    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  16. <settings>
  17.    
  18.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  19. </settings>    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
  20. <settings>
  21.    
  22.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  23. </settings>    sqlSession = sqlSessionFactory.openSession(true);
  24. <settings>
  25.    
  26.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  27. </settings>} catch (IOException e) {
  28. <settings>
  29.    
  30.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  31. </settings>    logger.error(e);
  32. <settings>
  33.    
  34.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  35. </settings>}
  36. <settings>
  37.    
  38.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  39. </settings>return sqlSession;
  40.     }
  41. }
复制代码
字段和属性的映射关系处理方案

数据表中字段名与属性名不一致的情况
  1.     /**
  2.      * 根据id查询员工信息
  3.      * @param empId
  4.      * @return
  5.      */
  6.     Emp getEmpById(@Param("id") Integer empId);
复制代码

  • 方式一:给字段起别名,别名与属性名一致
  1. <select id="getEmpById" resultType="com.evan.mybatis.entity.Emp">
  2.     select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId}
  3. </select>
复制代码

  • 方式二:设置全局配置,将字段名下换线自动映射为属性名驼峰规则
  1. <settings>
  2.    
  3.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  4. </settings>
复制代码
  1. <select id="getEmpById" resultType="com.evan.mybatis.entity.Emp">
  2.     select emp_id ,emp_name,age,gender from t_emp where emp_id = #{empId}
  3. </select>
复制代码

  • 方式三:使用ResultMap自定义映射处理
  1. <resultMap id="empResultMap" type="emp">
  2.        
  3.        
  4.         <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
  5.         <result column="emp_name" property="empName" javaType="java.lang.String"/>
  6.         <result column="age" property="age" javaType="java.lang.Integer"/>
  7.         <result column="gender" property="gender" javaType="java.lang.String"/>
  8. </resultMap>
  9. <select id="getEmpById" resultMap="empResultMap">
  10.         select emp_id,emp_name,age,gender
  11.         from t_emp
  12.         where emp_id = #{id}
  13. </select>
复制代码
结论:
若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用),实体类中的属性名符合Java的规则(使用驼峰)。
此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系。

  • 可以通过为字段起别名的方式,保证和实体类中的属性名保持一致。
  • 可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将下划线类型的字段名转换为驼峰。
    例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为 userName。
测试
  1.     @Test    public void test1() {<settings>
  2.    
  3.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  4. </settings>SqlSession sqlSession = SqlSessionUtil.getSqlSession();<settings>
  5.    
  6.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  7. </settings>EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);<settings>
  8.    
  9.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  10. </settings>System.out.println(mapper.getEmpById(5));<settings>
  11.    
  12.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  13. </settings>sqlSession.close();    }
复制代码
多对一的关系映射处理

查询员工信息以及员工所对应的部门信息。

  • 方式一: 级联属性赋值处理
  1. /**
  2. * 获取员工及所对应的部门信息
  3. * @param empId
  4. * @return
  5. */
  6. Emp getEmpAndDeptById(@Param("empId") Integer empId);
复制代码
  1. <resultMap id="empAndDeptResultMap" type="emp">
  2.         <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
  3.         <result column="emp_name" property="empName" javaType="java.lang.String"/>
  4.         <result column="age" property="age" javaType="java.lang.Integer"/>
  5.         <result column="gender" property="gender" javaType="java.lang.String"/>
  6.         <result column="dept_id" property="dept.deptId" javaType="java.lang.Integer"/>
  7.         <result column="dept_name" property="dept.deptName" javaType="java.lang.String"/>
  8. </resultMap>
  9. <select id="getEmpAdnDeptById" resultMap="empAndDeptResultMap">
  10.         SELECT
  11.                 t_emp.*,t_dept.`dept_name`
  12.         FROM
  13.                 t_emp LEFT JOIN t_dept ON t_emp.`dept_id`=t_dept.`dept_id`
  14.         WHERE
  15.                 t_emp.emp_id = #{id}
  16. </select>
复制代码

  • 方式二:使用标签
  1.                                         <resultMap id="empAndDeptResultMap" type="emp">
  2.         <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
  3.         <result column="emp_name" property="empName" javaType="java.lang.String"/>
  4.         <result column="age" property="age" javaType="java.lang.Integer"/>
  5.         <result column="gender" property="gender" javaType="java.lang.String"/>
  6.         <result column="dept_id" property="dept.deptId" javaType="java.lang.Integer"/>
  7.         <result column="dept_name" property="dept.deptName" javaType="java.lang.String"/>
  8. </resultMap>
  9. <select id="getEmpAdnDeptById" resultMap="empAndDeptResultMap">
  10.         SELECT
  11.                 t_emp.*,t_dept.`dept_name`
  12.         FROM
  13.                 t_emp LEFT JOIN t_dept ON t_emp.`dept_id`=t_dept.`dept_id`
  14.         WHERE
  15.                 t_emp.emp_id = #{id}
  16. </select>
复制代码
测试
  1.     @Test    public void test2() {<settings>
  2.    
  3.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  4. </settings>SqlSession sqlSession = SqlSessionUtil.getSqlSession();<settings>
  5.    
  6.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  7. </settings>EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);<settings>
  8.    
  9.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  10. </settings>System.out.println(mapper.getEmpAdnDeptById(2));<settings>
  11.    
  12.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  13. </settings>sqlSession.close();    }
复制代码

  • 方式三:使用标签进行分步查询
Step 1:查询员工信息
  1. public interface EmpMapper {
  2.     /**
  3.      * 第一步:通过分步查询员工及所对应的部门信息
  4.      * @param empId
  5.      * @return
  6.      */
  7.     Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
  8. }
复制代码
Step 2:查询部门信息
  1. public interface DeptMapper {
  2.     /**
  3.      * 第二步:通过分步查询员工及所对应的部门信息
  4.      * @param deptId
  5.      * @return
  6.      */
  7.     Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);
  8. }
复制代码
  1. <select id="getEmpAndDeptByStepTwo" resultType="com.evan.mybatis.entity.Dept">
  2.      select * from t_dept where dept_id = #{deptId}
  3. </select>
复制代码
  1. <resultMap id="empAndDeptByStepResultMap" type="emp">
  2.         <id column="emp_id" property="empId"/>
  3.         <result column="emp_name" property="empName"/>
  4.         <result column="age" property="age"/>
  5.         <result column="gender" property="gender"/>
  6.        
  7.         <association property="dept" javaType="dept" fetchType="lazy"
  8.                                  select="com.evan.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
  9.                                  column="dept_id"/>
  10. </resultMap>
  11. <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
  12.         SELECT * FROM t_emp WHERE emp_id = #{empId}
  13. </select>
复制代码
在Mybatis核心配置文件中设置全局延迟加载:
  1. <settings>
  2.    
  3.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  4. </settings><settings>
  5.    
  6.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  7. </settings>
复制代码
结论:
分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息:
lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。
aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载。
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType="lazy(延迟加载)|eager(立即加载)"
测试
  1.     @Test    public void test3() {<settings>
  2.    
  3.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  4. </settings>SqlSession sqlSession = SqlSessionUtil.getSqlSession();<settings>
  5.    
  6.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  7. </settings>EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);<settings>
  8.    
  9.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  10. </settings>System.out.println(mapper.getEmpAndDeptByStepOne(5));<settings>
  11.    
  12.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  13. </settings>sqlSession.close();    }
复制代码
一对多的关系映射处理


  • 方式一:使用标签
  1.     /**
  2.      * 根据部门id查询部门以及部门中所对应的员工信息
  3.      * @param deptId
  4.      * @return
  5.      */
  6.     Dept getDeptAndEmpById(@Param("deptId") Integer deptId);
复制代码
  1. <resultMap id="deptAndEmpResultMap" type="dept">
  2.         <id column="dept_id" property="deptId" javaType="java.lang.Integer"/>
  3.         <result column="dept_name" property="deptName" javaType="java.lang.String"/>
  4.        
  5.         <collection property="emps" ofType="emp">
  6.                 <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
  7.                 <result column="emp_name" property="empName" javaType="java.lang.String"/>
  8.                 <result column="age" property="age" javaType="java.lang.Integer"/>
  9.                 <result column="gender" property="gender" javaType="java.lang.String"/>
  10.         </collection>
  11. </resultMap>
  12. <select id="getDeptAndEmpById" resultMap="deptAndEmpResultMap">
  13.         SELECT
  14.                 t_emp.*,t_dept.`dept_name`
  15.         FROM t_dept
  16.                          LEFT JOIN t_emp ON t_dept.`dept_id` = t_emp.`dept_id`
  17.         WHERE t_dept.`dept_id` = #{deptId}
  18. </select>
复制代码

  • 方式二:分步查询
  1.     /**
  2.      * 分步查询第一步:根据id查询部门信息
  3.      * @param deptId
  4.      * @return
  5.      */
  6.     Dept getDeptById(@Param("deptId") Integer deptId);
复制代码
  1.     /**
  2.      * 分步查询第二步: 根据部门id查询部门所属员工
  3.      * @param deptId
  4.      * @return
  5.      */
  6.     List<Emp> getEmpListByDeptId(Integer deptId);
复制代码
  1. <settings>
  2.    
  3.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  4. </settings>    select * from t_emp where dept_id = #{deptId}   
复制代码
  1. <resultMap id="deptAndEmpByStepResultMap" type="dept">
  2.         <id column="dept_id" property="deptId" javaType="java.lang.Integer"/>
  3.         <result column="dept_name" property="deptName" javaType="java.lang.String"/>
  4.         <collection property="emps" column="dept_id"
  5.                 select="com.evan.mybatis.mapper.EmpMapper.getEmpListByDeptId"/>
  6. </resultMap>
  7. <select id="getDeptById" resultMap="deptAndEmpByStepResultMap">
  8.         select * from t_dept where dept_id = #{deptId}
  9. </select>
复制代码
测试


  • 分步查询测试
  1. @Test
  2. public void test5() {
  3.         SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.         DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
  5.         Dept dept = mapper.getDeptById(2);
  6.         System.out.println(dept);
  7.         sqlSession.close();
  8. }
复制代码
测试结果:

结果可以看到,多条查询语句执行。


  • 按需查询
  1. @Test
  2. public void test5() {
  3.         SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.         DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
  5.         Dept dept = mapper.getDeptById(2);
  6.         System.out.println(dept.getDeptName());
  7.         sqlSession.close();
  8. }
复制代码
测试结果:

开启延迟加载以后,可以看到按照需求查询指定SQL执行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表