MyBatis之ResultMap-自定义结果映射

1.discriminator

MyBatis可以使用discriminator判断某列的值,然后根据某列的值改变封装	行为
<resultMap ....>
...
<discriminator javaType="java类型" column="数据库某一列">
    <case value="查询到值" resultType="">
        查询语句或者是查询封装规则
    </case>
    <case value="查询到值" resultType="">
        查询语句或者是查询封装规则
    </case>
</discriminator>
</resultMap>

2.collection
collection

<resultMap id="xml中唯一的id" type="JavaBean的类型">
    <id column="数据库列的id" property="JavaBean的id"></id>
    <result column="数据库返回的某一列的名称" property="JavaBean要封装的属性"></result>
    <!--ofType:要封装的JavaBean的全类名-->
    <collection property="一的一方的属性" ofType="多的一方的全类名">
        <id column="" property=""/>
        <result column="" property=""/>
        <result column="" property=""/>
    </collection>
</resultMap>

分步查询

<resultMap id="xml中唯一的id" type="JavaBean的类型">
    <id column="数据库列的id" property="JavaBean的id"></id>
    <result column="数据库返回的某一列的名称" property="JavaBean要封装的属性"></result>
    <!--ofType:要封装的JavaBean的全类名-->
    <collection property="一的一方的属性" select="分步查询的sql语句" column="传入的参数">
    </collection>
</resultMap>

多个参数

如果colum需要多个参数
<collection property="一的一方的属性" select="分步查询的sql语句" column="传入的参数">
</collection>
那么column可以写成
select的参数的作为key,实际sql返回的数据作为value
column="{deptId=id,deptName=name}"
fatchType,不用修改全局文件
lazy:延迟加载
eager:立即加载
<collection property="一的一方的属性" 
    select="分步查询的sql语句" 
    column="传入的参数"
    fatchType="lazy|eager">
 </collection>

3.association
级联查询

<resultMap id="xml中唯一的id" type="JavaBean的类型">
    <!--
        指定主键的封装规则,使用id标签mybatis会对其有优化
        当然你也可以使用result标签
    -->
    <id column="数据库列的id" property="JavaBean的id"></id>
    <result column="数据库返回的某一列的名称" 
        property="JavaBean要封装的属性"></result>
    <!--其他的列可以不用写,mybatis会自动封装,但一般是建议全部写-->
    <!--若是一对一的情况下,可使用级联属性的方式,
        如user对象里面有一个address对象-->
    <result column="aid" property="address.id"></result>
</resultMap>

association

<resultMap id="xml中唯一的id" type="JavaBean的类型">
<!--
    指定主键的封装规则,使用id标签mybatis会对其有优化
    当然你也可以使用result标签
-->
<id column="数据库列的id" property="JavaBean的id"></id>
<result column="数据库返回的某一列的名称" property="JavaBean要封装的属性"></result>
<!--其他的列可以不用写,mybatis会自动封装,但一般是建议全部写-->
<!--若是一对一的情况下,可使用association,如user对象里面有一个address对象-->
<association property="User对象中的address属性" javaType="com.ces.entity.Address Address的全类名">
    <id column="数据库中返回的address的id" property="address实体类的id"></id>
    <result column="" property=""></result>
</association>
</resultMap>

分步查询

根据用户id查询用户
根据用户中address的id值去查一个address
将查询到address封装到用户中
<resultMap id="xml中唯一的id" type="JavaBean的类型">
    <id column="数据库列的id" property="JavaBean的id"></id>
    <result column="数据库返回的某一列的名称" property="JavaBean要封装的属性">
    </result>
    <!-- 一个select会发一次SQL查询-->
   	<association property="javabean的某个属性"
                select="分步查询的方法名(namespace+id)" column="select的参数">
    </association>
</resultMap>

延迟加载(类似于hibernate中的load方法)

全局配置文件中开启延时加载
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当设置为true时,懒加载的对象可能被任何懒属性全部加载;否则,每个属性按需加载。-->
<setting name="aggressiveLazyLoading" value="false"/>
上一篇:springboot接入微信app支付


下一篇:MyBatis映射器总结