mybatis的resultMap配置详解

1、mybatis的实体类继承

参考资料:
1、mybatis中实体类,po类继承另一个po类的情况
2、mybatis中resultMap配置细则

实体类的继承的作用是:可以通过继承减少代码在实体类中的重复使用,比如数据库的表中常常出现的字段所对应的实体类中的属性。

2、mybatis的resultMap标签中的属性extends,可以继承另外一个命名空间的resultMap标签。

<mapper namespace="xuecheng.dao.ACVSFundTest">

    <resultMap id="res" extends="xuecheng.dao.BaseEntityTest.baseCol" type="xuecheng.domain.ACVSFund">
        <!--<id column="id" property="id"/>-->
        <result column="fund_code" property="fundCode"/>
        <result column="fund_name" property="fundName"/>
        <result column="gmt_Create" property="gmtCreate"/>

    </resultMap>

继承另一个

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="xuecheng.dao.BaseEntityTest">
    <resultMap id="baseCol" type="xuecheng.domain.BaseEntity">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="age" property="age"/>
    </resultMap>

一、mybatis的属性标签

<resultMap>
        <constructor>
            <idArg/>
            <arg/>
        </constructor>
        <id/>
        <result/>
        <association property=""/>
        <collection property=""/>
        <discriminator javaType="">
            <case value=""></case>
        </discriminator>
</resultMap>

1.1、标签constructor

默认情况下,mybatis会使用实体类中的无参构造。当提供一个有参构造后,实体类中就不会提供无参构造。这时就需要在resultMap中特殊配置

假设实体类中的配置如下:

public User(Long id, String username, String password, String address) {
    
    
        this.id = id;
        this.username = username;
        this.password = password;
        this.address = address;
    }

映射文件的配置如下:

<resultMap id="userResultMap" type="org.sang.bean.User">
        <constructor>
            <idArg column="id" javaType="long"/>
            <arg column="username" javaType="string"/>
            <arg column="password" javaType="string"/>
            <arg column="address" javaType="string"/>
        </constructor>
    </resultMap>

1.2、标签association

适用的场景是一对一的

两张表:1、alias
在这里插入图片描述

2、province
在这里插入图片描述

provinceMapper.xml文件如下

<mapper namespace="xuecheng.dao.ProvinceMapper">
    <resultMap id="provinceResultMapper" type="xuecheng.domain.Province">
        <id column="id" property="id"/>
        <!--association 中的属性property 是一对一中的属性名称,
                        column是指传入参数的id
                        select 是指执行的方法-->
        <association property="alias" column="id" select="xuecheng.dao.AliasMapper.findAliasByPid"/>
    </resultMap>
    <select id="getProvince" resultMap="provinceResultMapper">
      SELECT * FROM province
    </select>

</mapper>

alias的xml文件如下:

<mapper namespace="xuecheng.dao.AliasMapper">
   <select id="findAliasByPid" parameterType="long" resultType="xuecheng.domain.Alias">
       SELECT * FROM alias WHERE pid=#{id}
   </select>
</mapper>

1.3、标签collection

 <resultMap id="provinceResultMapper" type="xuecheng.domain.Province">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <!--association 中的属性property 是一对一中的属性名称,
                        column是指传入参数的id
                        select 是指执行的方法-->
        <!--<association property="alias" column="id" select="xuecheng.dao.AliasMapper.findAliasByPid"/>-->

        <!--<collection property="cities" column="id" select="xuecheng.dao.CityMapper.findById"/>-->
</resultMap>

1.4、标签 discriminator (有点类似于switch语句)

    <resultMap id="provinceResultMapper" type="xuecheng.domain.Province">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <!--association 中的属性property 是一对一中的属性名称,
                        column是指传入参数的id
                        select 是指执行的方法-->
        <!--<association property="alias" column="id" select="xuecheng.dao.AliasMapper.findAliasByPid"/>-->

        <!--collection的测试-->
        <!--<collection property="cities" column="id" select="xuecheng.dao.CityMapper.findById"/>-->


        <!--以下有点类似于switch语句-->
        <discriminator javaType="int" column="area">
            <case value="1" resultMap="noodleResultMap"></case>
            <case value="2" resultMap="riceResultMap"></case>
        </discriminator>

        <!--以下collection,不能查出准确数据。原因不知因为是啥?-->
        <!--<collection property="cities" ofType="xuecheng.domain.City">-->
            <!--<id column="id" property="id"/>-->
            <!--<result column="name" property="name"/>-->
            <!--<result column="pid" property="pid"/>-->

        <!--</collection>-->

    </resultMap>

1.5、注意点:mybatis的懒加载

1.5.1、开启的两种方式,方式一(全局开启,即对所有查询):

<settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

说明:lazyLoadingEnabled默认是false,即不开启。aggressiveLazyLoading默认是true,即按照层级来进行查询,noodle和rice是同一级,即查询noodle的同时,rice也查询。如果是false,即是按需进行查询,需求查询noodle的时候,就不去查询rice了。

1.5.2、方式二(对局部进行操作)

在collection标签和association标签中,使用fetchType属性,eager代表立即加载,lazy代表延迟加载。

<association property="alias" column="id" select="org.sang.db.AliasMapper.findAliasByPid" fetchType="eager"/>
<collection property="cities" column="id" select="org.sang.db.CityMapper.findCityByPid" fetchType="lazy"/>

1.6、sql标签

可以只封装一部分查询语句,如下:

<sql id="selectAll3">
        id,username,address,password
</sql>

引用方式如下:

<select id="getUser3" resultType="user">
        SELECT
        <include refid="selectAll3"/> FROM user
 </select>

还可以在封装的时候使用一些变量,如下:

<sql id="selectAll4">
        ${prefix}.id,${prefix}.username,${prefix}.address
</sql>

注意变量引用方式是$符号哦,不是#,引用方式如下:

<select id="getUser4" resultType="user" parameterType="string">
        SELECT
        <include refid="selectAll4">
            <property name="prefix" value="u"/>
        </include> FROM user u
</select>

猜你喜欢

转载自blog.csdn.net/weixin_43983411/article/details/109846839