滴水恩情 发表于 2024-4-22 21:49:43

Mybatis之resultMap详解

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

① 创建数据库&数据表
CREATE DATABASE `dbtest1`;

CREATE TABLE `t_emp` (
`emp_id` int NOT NULL AUTO_INCREMENT,
`emp_name` varchar(20) DEFAULT NULL,
`age` int DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`dept_id` int DEFAULT NULL,
PRIMARY KEY (`emp_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `t_dept` (
`dept_id` int DEFAULT NULL,
`dept_name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;② 创建实体类Emp.java&Dept.java
public class Dept {

    private int deptId;

    private String deptName;

    //一对多关系(一个部门对应多个员工)
    private List<Emp> emps;

    public Dept() {
    }

    public Dept(int deptId, String deptName, List<Emp> emps) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.deptId = deptId;
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.deptName = deptName;
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.emps = emps;
    }

    public int getDeptId() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return deptId;
    }

    public void setDeptId(int deptId) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.deptId = deptId;
    }

    public String getDeptName() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return deptName;
    }

    public void setDeptName(String deptName) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.deptName = deptName;
    }

    public List<Emp> getEmps() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return emps;
    }

    public void setEmps(List<Emp> emps) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.emps = emps;
    }

    @Override
    public String toString() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return "Dept{" +
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>"deptId=" + deptId +
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>", deptName='" + deptName + '\'' +
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>", emps=" + emps +
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>'}';
    }
}public class Emp {

    private int empId;
    private String empName;

    private int age;
    private String gender;

    //多对一关系(多个员工对应一个部门)
    private Dept dept;

    public Emp() {
    }

    public Emp(int empId, String empName, int age, String gender, Dept dept) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.empId = empId;
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.empName = empName;
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.age = age;
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.gender = gender;
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.dept = dept;
    }

    public int getEmpId() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return empId;
    }

    public void setEmpId(int empId) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.empId = empId;
    }

    public String getEmpName() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return empName;
    }

    public void setEmpName(String empName) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.empName = empName;
    }

    public int getAge() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return age;
    }

    public void setAge(int age) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.age = age;
    }

    public String getGender() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return gender;
    }

    public void setGender(String gender) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.gender = gender;
    }

    public Dept getDept() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return dept;
    }

    public void setDept(Dept dept) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>this.dept = dept;
    }

    @Override
    public String toString() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return "Emp{" +
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>"empId=" + empId +
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>", empName='" + empName + '\'' +
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>", age=" + age +
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>", gender='" + gender + '\'' +
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>", dept=" + dept +
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>'}';
    }
}③ 创建jdbc.properties,添加如下内容
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/dbtest1?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456

jdbc.driverClassName=com.mysql.jdbc.Driver④ 创建Mybatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   
   
    <properties resource="jdbc.properties"/>
   
   
    <settings>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><setting name="mapUnderscoreToCamelCase" value="true"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><setting name="lazyLoadingEnabled" value="true"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><setting name="aggressiveLazyLoading" value="false"/>
    </settings>
   
   
    <typeAliases>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><package name="com.evan.mybatis.entity"/>
    </typeAliases>

   
    <environments default="mysql8">
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><environment id="mysql8">
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <transactionManager type="JDBC"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <dataSource type="POOLED">
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><property name="driver" value="${jdbc.driver}"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><property name="url" value="${jdbc.url}"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><property name="username" value="${jdbc.username}"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><property name="password" value="${jdbc.password}"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    </dataSource>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings></environment>

<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><environment id="mysql5">
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <transactionManager type="JDBC"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <dataSource type="POOLED">
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><property name="driver" value="${jdbc.driverClassName}"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><property name="url" value="${jdbc.url}"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><property name="username" value="${jdbc.username}"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><property name="password" value="${jdbc.password}"/>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    </dataSource>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings></environment>
    </environments>

   
    <mappers>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><package name="com.evan.mybatis.mapper"/>
    </mappers>
</configuration>⑤ 添加依赖
    <dependencies>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><dependency>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <groupId>org.mybatis</groupId>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <artifactId>mybatis</artifactId>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings></dependency>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><dependency>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <groupId>junit</groupId>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <artifactId>junit</artifactId>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <scope>test</scope>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings></dependency>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><dependency>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <groupId>mysql</groupId>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <artifactId>mysql-connector-java</artifactId>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings></dependency>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><dependency>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <groupId>log4j</groupId>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <artifactId>log4j</artifactId>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings></dependency>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><dependency>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <groupId>commons-logging</groupId>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    <artifactId>commons-logging</artifactId>
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings></dependency>
    </dependencies>⑥ 创建SqlSession工具类
public class SqlSessionUtil {

    private static final Log logger = LogFactory.getLog(SqlSessionUtil.class);

    public static SqlSession getSqlSession() {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>SqlSession sqlSession = null;
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>try(InputStream is = Resources.getResourceAsStream("mybatis-config.xml");) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    sqlSession = sqlSessionFactory.openSession(true);
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>} catch (IOException e) {
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>    logger.error(e);
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>}
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>return sqlSession;

    }
}字段和属性的映射关系处理方案

数据表中字段名与属性名不一致的情况

    /**
   * 根据id查询员工信息
   * @param empId
   * @return
   */
    Emp getEmpById(@Param("id") Integer empId);

[*]方式一:给字段起别名,别名与属性名一致
<select id="getEmpById" resultType="com.evan.mybatis.entity.Emp">
    select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId}
</select>

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

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

[*]可以通过为字段起别名的方式,保证和实体类中的属性名保持一致。
[*]可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将下划线类型的字段名转换为驼峰。
例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为 userName。
测试

    @Test    public void test1() {<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>SqlSession sqlSession = SqlSessionUtil.getSqlSession();<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>System.out.println(mapper.getEmpById(5));<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>sqlSession.close();    }多对一的关系映射处理

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

[*]方式一: 级联属性赋值处理
/**
* 获取员工及所对应的部门信息
* @param empId
* @return
*/
Emp getEmpAndDeptById(@Param("empId") Integer empId);<resultMap id="empAndDeptResultMap" type="emp">
        <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
        <result column="emp_name" property="empName" javaType="java.lang.String"/>
        <result column="age" property="age" javaType="java.lang.Integer"/>
        <result column="gender" property="gender" javaType="java.lang.String"/>
        <result column="dept_id" property="dept.deptId" javaType="java.lang.Integer"/>
        <result column="dept_name" property="dept.deptName" javaType="java.lang.String"/>
</resultMap>
<select id="getEmpAdnDeptById" resultMap="empAndDeptResultMap">
        SELECT
                t_emp.*,t_dept.`dept_name`
        FROM
                t_emp LEFT JOIN t_dept ON t_emp.`dept_id`=t_dept.`dept_id`
        WHERE
                t_emp.emp_id = #{id}
</select>

[*]方式二:使用标签
                                        <resultMap id="empAndDeptResultMap" type="emp">
        <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
        <result column="emp_name" property="empName" javaType="java.lang.String"/>
        <result column="age" property="age" javaType="java.lang.Integer"/>
        <result column="gender" property="gender" javaType="java.lang.String"/>
        <result column="dept_id" property="dept.deptId" javaType="java.lang.Integer"/>
        <result column="dept_name" property="dept.deptName" javaType="java.lang.String"/>
</resultMap>
<select id="getEmpAdnDeptById" resultMap="empAndDeptResultMap">
        SELECT
                t_emp.*,t_dept.`dept_name`
        FROM
                t_emp LEFT JOIN t_dept ON t_emp.`dept_id`=t_dept.`dept_id`
        WHERE
                t_emp.emp_id = #{id}
</select>测试

    @Test    public void test2() {<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>SqlSession sqlSession = SqlSessionUtil.getSqlSession();<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>System.out.println(mapper.getEmpAdnDeptById(2));<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>sqlSession.close();    }

[*]方式三:使用标签进行分步查询
Step 1:查询员工信息
public interface EmpMapper {

    /**
   * 第一步:通过分步查询员工及所对应的部门信息
   * @param empId
   * @return
   */
    Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
}Step 2:查询部门信息
public interface DeptMapper {

    /**
   * 第二步:通过分步查询员工及所对应的部门信息
   * @param deptId
   * @return
   */
    Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);
}<select id="getEmpAndDeptByStepTwo" resultType="com.evan.mybatis.entity.Dept">
   select * from t_dept where dept_id = #{deptId}
</select><resultMap id="empAndDeptByStepResultMap" type="emp">
        <id column="emp_id" property="empId"/>
        <result column="emp_name" property="empName"/>
        <result column="age" property="age"/>
        <result column="gender" property="gender"/>
       
        <association property="dept" javaType="dept" fetchType="lazy"
                               select="com.evan.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                               column="dept_id"/>
</resultMap>
<select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
        SELECT * FROM t_emp WHERE emp_id = #{empId}
</select>在Mybatis核心配置文件中设置全局延迟加载:
<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings><settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>结论:
分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息:
lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。
aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载。
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType="lazy(延迟加载)|eager(立即加载)"
测试

    @Test    public void test3() {<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>SqlSession sqlSession = SqlSessionUtil.getSqlSession();<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>System.out.println(mapper.getEmpAndDeptByStepOne(5));<settings>
   
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>sqlSession.close();    }一对多的关系映射处理


[*]方式一:使用标签
    /**
   * 根据部门id查询部门以及部门中所对应的员工信息
   * @param deptId
   * @return
   */
    Dept getDeptAndEmpById(@Param("deptId") Integer deptId);<resultMap id="deptAndEmpResultMap" type="dept">
        <id column="dept_id" property="deptId" javaType="java.lang.Integer"/>
        <result column="dept_name" property="deptName" javaType="java.lang.String"/>
       
        <collection property="emps" ofType="emp">
                <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
                <result column="emp_name" property="empName" javaType="java.lang.String"/>
                <result column="age" property="age" javaType="java.lang.Integer"/>
                <result column="gender" property="gender" javaType="java.lang.String"/>
        </collection>
</resultMap>
<select id="getDeptAndEmpById" resultMap="deptAndEmpResultMap">
        SELECT
                t_emp.*,t_dept.`dept_name`
        FROM t_dept
                       LEFT JOIN t_emp ON t_dept.`dept_id` = t_emp.`dept_id`
        WHERE t_dept.`dept_id` = #{deptId}
</select>

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


[*]分步查询测试
@Test
public void test5() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = mapper.getDeptById(2);
        System.out.println(dept);
        sqlSession.close();
}测试结果:
https://img2024.cnblogs.com/blog/3382744/202402/3382744-20240203175752240-1133613643.png
结果可以看到,多条查询语句执行。


[*]按需查询
@Test
public void test5() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = mapper.getDeptById(2);
        System.out.println(dept.getDeptName());
        sqlSession.close();
}测试结果:
https://img2024.cnblogs.com/blog/3382744/202402/3382744-20240203175947594-1560193098.png
开启延迟加载以后,可以看到按照需求查询指定SQL执行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Mybatis之resultMap详解