MyBatis 嵌套查询

104113_gtGV_2371844.png

1.association:一对一嵌套查询

第一种方式:执行效率比较低;会查询2次数据库、第一次先查一次role;第二次查roleone;所以引起效率较低;

property:映射到列结果的字段或属性;

column:数据库的类名,或重命名的列标签;

select:映射语句的 ID,可以加载这个属性映射需要的复杂类型;

javaType:Java 类的完全限定名,或一个类型别名(参考上面内建类型别名的列 表) 。如果你映射到一个 JavaBean,MyBatis 通常可以断定类型;

RoleMapper.xml

<resultMap id="resultMapAss" type="com.study.demo.web.dto.RoleTestDto" extends="BaseResultMap">

    <association property="roleOne" column="id" select="com.study.demo.web.mapper.RoleOneMapper.findByRoleId" />
</resultMap>

<select id="findByRoleAss" resultMap="resultMapAss">
    select * from am_role where id=#{id} and is_del = 1
</select>
<select id="findByRoleAss" resultMap="resultMapAss">
    select * from am_role where id=#{id} and is_del = 1
</select>

RoleOneMapper.xml 测试

<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.study.demo.web.model.RoleOne">
    <id column="id" property="id" />
    <result column="role_id" property="roleId" />
    <result column="name" property="name" />
    <result column="tests" property="tests" />
</resultMap>

<select id="findByRoleId" resultMap="BaseResultMap">
    SELECT * from role_one where role_id = #{roleId}
</select>

 

第二种方式:效率较高:一次查询出嵌套关联关系;

RoleMapper.xml

<resultMap id="resultMapAssTwo" type="com.study.demo.web.dto.RoleTestDto" extends="BaseResultMap">

    <association property="roleOne" javaType="com.study.demo.web.model.RoleOne">
        <id column="id" property="id" />
        <result column="role_id" property="roleId" />
        <result column="name" property="name" />
        <result column="tests" property="tests" />
    </association>
</resultMap>

<select id="findByRoleAssTwo" resultMap="resultMapAssTwo">
  SELECT
        role.*,
        one.id id_one,
        one.role_id,
        one. NAME name_one,
        one.tests
    FROM
        am_role role
    LEFT JOIN role_one one ON role.id = one.role_id
    WHERE
        role.id = #{id}
</select>

 

2.collection:集合嵌套循环

第一种方式:查询效率较低、应该要查询2次数据库;先查询role表再查permission;

property:映射到列结果的字段或属性;    

column:来自数据库的类名,或重命名的列标签;

select:另外一个映射语句的 ID,可以加载这个属性映射需要的复杂类型;

javaType:一个 Java 类的完全限定名,或一个类型别名(参考上面内建类型别名的列 表) 。如果你映射到一个 JavaBean,MyBatis 通常可以断定类型;

ofType: Java 类的完全限定名;

RoleMapper.xml

<!-- 1对多关联关系 -->
<resultMap id="roleToList" type="com.study.demo.web.dto.RoleDto" extends="BaseResultMap">
    <collection property="permissionArrayList" column="id" select="com.study.demo.web.mapper.PermissionMapper.findPermissionByRolerId"/>
</resultMap>

<select id="findByRoleId" resultMap="roleToList">
    select * from am_role where id=#{id} and is_del = 1
</select>

PermissionMapper.xml

<select id="findPermissionByRolerId" resultType="com.study.demo.web.model.Permission">
    SELECT
        per.*
    FROM
        am_permission per
    LEFT JOIN am_role_permission rper ON per.id = rper.permission_id
    WHERE
        rper.role_id = #{id}
</select>

 

第二种方式:效率高,一次查询;

<resultMap id="roleToListTwo" type="com.study.demo.web.dto.RoleTwoDto" extends="BaseResultMap">

    <collection property="permissionArrayList" javaType="list" ofType="com.study.demo.web.model.Permission">
        <id column="id_one" property="id"/>
        <result column="system_id" property="systemId"/>
        <result column="pid" property="pid"/>
        <result column="name_one" property="name"/>
        <result column="type" property="type"/>
        <result column="permission_value" property="permissionValue"/>
        <result column="uri" property="uri"/>
        <result column="icon" property="icon"/>
        <result column="status" property="status"/>
        <result column="sequence" property="sequence"/>
        <result column="is_del_one" property="isDel"/>
        <result column="create_time_one" property="createTime"/>
        <result column="update_time_one" property="updateTime"/>
    </collection>
</resultMap>

<select id="findByRoleTwo" resultMap="roleToListTwo">
    SELECT
        role.*,
        per.id id_one,
        per.pid pid,
        per.name name_one,
        per.type type,
        per.permission_value permission_value,
        per.uri uri,
        per.icon icon,
        per.status status_one,
        per.sequence sequence_one,
        per.is_del is_del_one,
        per.create_time crete_time_one,
        per.update_time update_time_one
    FROM
        am_role role
    LEFT JOIN am_role_permission rper ON role.id = rper.role_id
    LEFT JOIN am_permission per ON per.id = rper.permission_id
    WHERE
        role.id = #{id}
</select>

 

 

 

转载于:https://my.oschina.net/studyjing/blog/1542431

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值