5)MyBatis -自定义映射resultMap

MyBatis

7.自定义映射resultMap

Emp类:

在这里插入图片描述

Dept类:

在这里插入图片描述

1)使用全局配置处理字段名和属性名不一致的情况

1.为查询的字段设置别名,和属性名一致

2.当字段名名符合MySql的要求使用_,而属性名符合java的要求使用驼峰

​ 此时可以在MyBatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰

​ 如:emp_id---->empId,emp_name----->empName

    <settings>
<!--        将下划线映射为驼峰-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

2)resultMap处理字段属性的映射关系

resultMap:设置自定义的映射关系
id:唯一标识
type:处理映射关系的实体类的类型
常用标签属性:
id:处理主键和实体类中的属性的映射关系
result:处理普通字段和实体类中属性的映射关系
colum:设置映射关系的字段名,必须是sql查询出的某个的字段
property:设置映射关系中的属性的属性名,必须是处理实体类类型中的属性名

<!--  resultMap:设置自定义的映射关系
      id:唯一标识
      type:处理映射关系的实体类的类型
      常用标签:
      id:处理主键和实体类中的属性的映射关系
      result:处理普通字段和实体类中属性的映射关系
      colum:设置映射关系的字段名,必须是sql查询出的某个的字段
      property:设置映射关系中的属性的属性名,必须是处理实体类类型中的属性名
-->
    <resultMap id="empResultMap" type="Emp">
        <id column="emp_id" property="empId"/>
        <result column="emp_name" property="empName"/>
        <result column="age" property="age"/>
        <result column="gender" property="gender"/>
    </resultMap>


<!--Emp getEmpByEmpId(@Param("empId") int empId)-->
    <select id="getEmpByEmpId" resultMap="empResultMap">
        select * from t_emp where emp_id = #{empId}
    </select>

3)处理多对一的映射关系

1>级联方式:
    <resultMap id="empAndDeptResultMap" type="Emp">
        <id column="emp_id" property="empId"/>
        <result column="emp_name" property="empName"/>
        <result column="age" property="age"/>
        <result column="gender" property="gender"/>
        <result column="dept_id" property="dept.deptId"/>
        <result column="dept_name" property="dept.deptName"/>
    </resultMap>

<!--    Emp getEmpAndDeptByEmpId(@Param("empId") int empId)-->

<!--    sql表的外连接-->
    <select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
        select t_emp.*,t_dept.*
        from t_emp
        left join t_dept
        on t_emp.id = t_dept.id
        where t_emp.id = #{empId}
    </select>
2>使用assiociation标签处理多对以映射关系

association:处理多对一的映射关系(处理实体类类型的属性)
property:设置需要处理映射关系的属性属性名
javaType:设置要处理的属性的类型

    <resultMap id="empAndDeptResultMapOne" 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:设置需要处理映射关系的属性属性名
            javaType:设置要处理的属性的类型
    -->
        <association property="dept" javaType="Dept">
            <id column="dept_id" property="deptId"/>
            <result column="dept_name" property="deptName"/>
        </association>
    </resultMap>
    
        <select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMapOne">
        select t_emp.*,t_dept.*
        from t_emp
        left join t_dept
        on t_emp.id = t_dept.id
        where t_emp.id = #{empId}
    </select>
3>使用分步查询处理多对一映射关系

分步查询的优点:可以实现延迟加载

但是必须在核心配置文件中设置全局配置信息:

lazyLoadingEnabled:延迟加载的全局开关,当开启时,所有关联对象都会延迟加载

aggressiveLazyLoading:当开启时,任何方法的调用都会加载对该对象的所有属性,否则,每个属性都按需加载

此时就可以实现按需加载,获取的数据是什么,就会执行相应的sql。此时可通过asscoiation和collection中的fetchType属性设置当前分步查询是否使用延迟加载,fetchType=“lazy(延迟加载)|eager(立即加载)”

<!--        fetchType:在开启了延迟加载的环境中,通过该属性设置当前的分步查询是否使用延迟加载
            fetchType="eager(立即加载)|lazy(延迟加载)"
             -->
        <association property="dept" fetchType="eager"
                     select="org.example.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                     column="dept_id">

        </association>

在这里插入图片描述

在这里插入图片描述

EmpMapper接口类:

//    通过分步查询查询员工以及所对应的部门信息的第一步
    Emp getEmpAndDeptByStepOne(@Param("empId") int empId);

DeptMapper接口类;

//    通过分步查询查询员工以及所对应的部门信息的第二步
    Dept getEmpAndDeptByStepTwo(@Param("deptTd") int deptId)

EmpMapper.xml:

    <resultMap id="empAndDeptResultMapTwo" type="Emp">
        <id column="emp_id" property="empId"/>
        <result column="emp_name" property="empName"/>
        <result column="age" property="age"/>
        <result column="gender" property="gender"/>

<!--     property:设置需要处理的映射关系的属性的属性名
         select:设置分步查询的sql的唯一标识
         colum:将查询出的某个字段作为分步查询的sql的条件
-->
        <association property="dept"
                     select="org.example.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                     column="dept_id">

        </association>
    </resultMap>
<!--    Emp getEmpAndDeptByStepOne(@Param("empId") int empId)-->
    <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptResultMapTwo">
        select * from t_emp where emp_id = #{empId}
    </select>

DeptMapper.xml:

<!--   通过分步查询查询员工以及所对应的部门信息的第二步
    Dept getEmpAndDeptByStepTwo(@Param("deptTd") int deptId);
-->
    <select id="getEmpAndDeptByStepTwo" resultType="Dept">
        select * from t_dept where dept_id = #{deptId}
    </select>

4)处理一对多的映射关系

1>使用collection处理一对多的映射关系

​ 用法与association相似

<!--    Dept getDeptAndEmpByDetId(@Param("deptId") int deptId)-->

    <resultMap id="deptAndEmpResultMap" type="dept">
        <id column="dept_id" property="deptId"/>
        <result column="dept_name" property="deptName"/>
        <collection property="emps" ofType="Emp">
            <id column="emp_id" property="empId"/>
            <result column="emp_name" property="empName"/>
            <result column="age" property="age"/>
            <result column="gender" property="gender"/>
        </collection>
    </resultMap>

    <select id="getDeptAndEmpByDetId" resultMap="deptAndEmpResultMap">
        select *
        from t_dept
        left join t_emp
        on t_dept.dept_id = t_emp.dept_id
        where t_dept.dept_id = #{deptId}
    </select>
2>使用分步查询处理一对多的映射关系

DeptMapper:

Dept getDeptAndEmpByStepOne(@Param("deptId") int deptId)

EmpMapper:

List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") int deptId);

DeptMapper.xml:

    <resultMap id="deptAndEmpResultMapByStepOne" type="Dept">
        <id column="dept_id" property="deptId"/>
        <collection property="emps"
                    select="org.example.mapper.EmpMapper.getDeptAndEmpByStepTwo"
                    column="dept_id"
                    ></collection>
    </resultMap>
    
<!--    Dept getDeptAndEmpByStepOne(@Param("deptId") int deptId)-->
    <select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpResultMapByStepOne">
        select * from t_dept where dept_id = #{deptId}
     </select>

EmpMapper.xml:

<!--    List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") int deptId)-->
    <select id="getDeptAndEmpByStepTwo" resultType="Emp">
        select * from t_emp where dept_id = #{deptId}
     </select>
MybatisPlus是一个基于Mybatis框架的增强工具,可以简化和加速开发过程。在使用MybatisPlus进行数据库操作时,我们可以利用它自带的功能来进行基本的CRUD操作,同时也可以进行自定义映射resultmap自定义映射resultmap可以帮助我们在数据库查询结果与实体类之间建立映射关系,进而方便地操作数据。一般情况下,MybatisPlus会根据数据库字段与实体类属性的对应关系自动进行映射,但在某些特殊情况下,我们可能需要自己来定义映射关系。 要自定义映射resultmap,我们可以通过在实体类中使用注解`@ResultMap`来实现。首先,我们需要在实体类中定义与数据库字段对应的属性,并通过注解`@TableField`来指定数据库字段名。然后,我们可以在实体类中使用注解`@ResultMap`来声明自定义映射resultmap,并指定与数据库字段对应的属性。 例如,有一个数据库表student,包含字段id、name和age,我们可以定义一个实体类Student,其中id属性对应数据库字段id,name属性对应数据库字段name,age属性对应数据库字段age。然后,在Student类中使用注解`@ResultMap`自定义映射resultmap,例如: ```java @Data public class Student { @TableField("id") private Long id; @TableField("name") private String name; @TableField("age") private Integer age; @ResultMap("studentResultMap") public class StudentResultMap{ return new StudentResultMap(){ put("id", "id"); put("name","name"); put("age","age"); } } } ``` 在上述示例中,我们定义了一个名为studentResultMap自定义映射resultmap,并通过`put`方法指定了属性与数据库字段的对应关系。 当我们需要进行数据库查询时,可以通过`@Select`注解或者使用MybatisPlus提供的查询方法来执行查询操作。在查询操作中,我们可以使用自定义映射resultmap来获取查询结果,并将其映射到实体类中。 总之,通过自定义映射resultmap,我们可以灵活地实现数据库查询结果与实体类的映射关系,提高了系统的可维护性和代码的可读性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值