自定义映射 resultMap

字段名、属性名不一致

1、修改任意一方名称,使两者相同

2、SQL 语句使用 AS 关键字,使字段名的别名和实体类中的属性名保持一致

3、MyBatis 全局设置

<setting name="mapUnderscoreToCamelCase" value="true"/>

(1)MyBatis 核心配置文件中的 setting 标签,设置一个全局配置信息 mapUnderscoreToCamelCase

(2)mapUnderscoreToCamelCase:是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn,默认值 false

(3)在查询表中数据时,自动将 _ 类型的字段名转换为驼峰,例如:字段名 user_name,设置 mapUnderscoreToCamelCase 为 ture 后,此时字段名就会转换为 userName

(4)前提:字段名符合数据库的规则(使用 _ ),实体类中的属性名符合 Java 的规则(使用驼峰)

4、resultMap 设置自定义映射

(1)设置自定义映射,处理字段和属性的映射关系

(2)字段名和属性名一致的属性也需要映射,即全部属性都要列出来

(3)映射文件(示例)

<!--
    id:表示自定义映射的唯一标识,不能重复,用于标识一个结果映射
    type:查询的数据要映射的实体类的类型,类的全类名或别名
-->
<resultMap id="empResultMap" type="Emp">
    <!--
        id:设置主键的映射关系
        result:设置普通字段的映射关系
        property:设置映射关系中实体类中的属性名
        column:设置映射关系中表中的字段名
    -->
	<id property="eid" column="eid"></id>
	<result property="empName" column="emp_name"></result>
</resultMap>

<!-- List<Emp> getAllEmp(); -->
<select id="getAllEmp" resultMap="empResultMap">
	select * from emps
</select>

 

处理多对一映射关系

1、对一:聚合 JavaBean 对象

2、级联属性赋值

<resultMap id="EmpAndDeptResultMap" type="Emp">
    <id property="eid" column="eid"></id>
    <result property="empName" column="emp_name"></result>
    <result property="dept.did" column="did"></result>
    <result property="dept.deptName" column="dept_name"></result>
</resultMap>

<!-- Emp getEmpAndDept(@Param("eid") Integer eid); -->
<select id="getEmpAndDept" resultMap="EmpAndDeptResultMap">
    select *
    from emps left join depts
    on emps.eid = dept.did
    where emps.eid = #{eid}
</select>

3、使用 association 标签

(1)association 标签:处理多对一的映射关系

(2)property 属性:需要处理多对的映射关系的属性名,即多对一的 JavaBean

(3)javaType 属性:property 属性的类型

<resultMap id="EmpAndDeptResultMap" type="Emp">
    <id property="eid" column="eid"></id>
    <result property="empName" column="emp_name"></result>
    <association property="dept" javaType="Dept">
        <id property="did" column="did"></id>
        <result property="deptName" column="dept_name"></result>
    </association>
</resultMap>

<!-- Emp getEmpAndDept(@Param("eid") Integer eid); -->
<select id="getEmpAndDept" resultMap="EmpAndDeptResultMap">
    select *
    from emps left join depts
    on emps.eid = dept.did
    where emps.eid = #{eid}
</select>

4、分步查询

(1)select:设置分布查询 SQL 唯一标识:namespace / mapper 接口的全类名 + .SQL 语句 id / .方法名

(2)column:设置分步查询的条件,数据库中的列名,或者是列的别名

<resultMap id="EmpAndDeptByStepResultMap" type="Emp">
    <id property="eid" column="eid"></id>
    <result property="empName" column="emp_name"></result>
    <association property="dept"
                 select="org.test.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                 column="did">
    </association>
</resultMap>

<!-- Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);-->
<select id="getEmpAndDeptByStepOne" resultMap="EmpAndDeptByStepResultMap">
    select * from emps where eid = #{eid}
</select>
<!-- 此处resultMap只是处理字段和属性的映射关系-->
<resultMap id="EmpAndDeptByStepTwoResultMap" type="Dept">
    <id property="did" column="did"></id>
    <result property="deptName" column="dept_name"></result>
</resultMap>

<!-- Dept getEmpAndDeptByStepTwo(@Param("did") Integer did); -->
<select id="getEmpAndDeptByStepTwo" resultMap="EmpAndDeptByStepTwoResultMap">
    select * from depts where did = #{did}
</select>

 

延迟加载

1、分步查询的优点:可以实现延迟加载,但必须在核心配置文件中设置全局配置信息

(1)lazyLoadingEnabled:默认为 false,延迟加载的全局开关,当开启时,所有关联对象都会延迟加载

(2)aggressiveLazyLoading:默认为 false,当开启时,任何方法的调用都会加载该对象的所有属性,否则,每个延迟加载属性会按需加载

2、按需加载,获取的数据是什么,只会执行相应 SQL

3、全局配置

<setting name="lazyLoadingEnabled" value="true"/>

4、局部配置

(1)可通过 association 和 collection 中的 fetchType 属性,设置当前的分步查询是否使用延迟加载

(2)fetchType="lazy"(延迟加载)

(3)fetchType="eager"(立即加载)

 

处理一对多映射关系

1、对多:聚合 JavaBean 集合

2、使用 collection 标签

(1)collection 标签:处理一对多的映射关系

(2)ofType 属性:表示该属性对应的集合中,存储的数据类型

<resultMap id="DeptAndEmpResultMap" type="Dept">
    <id property="did" column="did"></id>
    <result property="deptName" column="dept_name"></result>
    <collection property="emps" ofType="Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
    </collection>
</resultMap>

<!-- Dept getDeptAndEmp(@Param("did") Integer did); -->
<select id="getDeptAndEmp" resultMap="DeptAndEmpResultMap">
    select *
    from depts left join emps
    on depts.did = emps.did
    where depts.did = #{did}
</select>

3、分步查询

(1)select:设置分布查询 SQL 唯一标识:namespace / mapper 接口的全类名 + .SQL 语句 id / .方法名

(2)column:设置分步查询的条件,数据库中的列名,或者是列的别名

<resultMap id="DeptAndEmpByStepOneResultMap" type="Dept">
    <id property="did" column="did"></id>
    <result property="deptName" column="dept_name"></result>
    <collection property="emps"
                select="org.test.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
                column="did">
    </collection>
</resultMap>

<!-- Dept getDeptAndEmpByStepOne(@Param("did") Integer did); -->
<select id="getDeptAndEmpByStepOne" resultMap="DeptAndEmpByStepOneResultMap">
    select * from t_dept where did = #{did}
</select>
<!-- 此处resultMap只是处理字段和属性的映射关系 -->
<resultMap id="DeptAndEmpByStepTwoResultMap" type="Emp">
	<id property="eid" column="eid"></id>
	<result property="empName" column="emp_name"></result>
</resultMap>

<!-- List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did); -->
<select id="getDeptAndEmpByStepTwo" resultType="DeptAndEmpByStepTwoResultMap">
	select * from emps where did = #{did}
</select>
posted @   半条咸鱼  阅读(96)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示