Title

mybatis 关联查询

 

 

 

什么是嵌套结果?:

即一条 sql 语句搞定关联关系

 

什么是嵌套查询:?

两个以上 的 方式搞定 关联关系

第一种 管理系统用的比较多

 

 

 设置 fetchType 可以实现一个 按需加载

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

result Map  高级用法:  使用 extend 关键字 集成 resultMap

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.enjoylearning.mybatis.mapper.TUserMapper">

    <resultMap id="BaseResultMap" type="TUser">
        <id column="id" property="id" />
        <result column="note" property="note" />
    </resultMap>
    <resultMap id="userAndPosition1" extends="BaseResultMap" type="TUser">
        <association property="position" javaType="TPosition" columnPrefix="post_">
            <id column="id" property="id"/>
        </association>
    </resultMap>

    <sql id="Base_Column_List">
        id, user_name, real_name, sex, mobile, email, note,
        position_id
    </sql>
    
    <select id="selectUserPosition1" resultMap="userAndPosition1">
        select   a.id,user_name,real_name,sex,    mobile,
        from t_user a,
            t_position b
        where a.position_id = b.id
    </select>
    
    <insert id="insertForeach4Batch" useGeneratedKeys="true" keyProperty="id">
        insert into t_user (user_name, real_name,sex, mobile,email,note,position_id)
        values(
            #{user.userName,jdbcType=VARCHAR},
            #{user.realName,jdbcType=VARCHAR},
            #{user.note,jdbcType=VARCHAR},
            #{user.position.id,jdbcType=INTEGER})
    </insert>

</mapper>

 

 

 

 

 

 

 

 

一些常用的技巧:

比如 A,B 两个表 都有 id, 这个时候需要 给两个相同字段取个别名

最好是加个前缀

比如 A_id , B_id

建议是 给子表重命名字段

 

 

 

 

 

 

 

 

 

建议给 mapper 添加个命名空间,这样可以 直接引用别的 xml 的 代码片段,达到复用的效果

比如:

<mapper namespace="com.enjoylearning.mybatis.mapper.TUserMapper">

  

 

mybatis 还有一种用法:嵌套查询

 

 

 

 

可以在 resultMap 中进行制定:

<resultMap id="userAndPosition2" extends="BaseResultMap" type="TUser">
        <association property="position" fetchType="lazy"  column="{position_id=id}" select="com.enjoylearning.mybatis.mapper.TPositionMapper.selectByPrimaryKey" />
    </resultMap>

 

 

 

 

 

<resultMap type="domain.User" id="user">
  <id column="id" property="id"/>
  <result column="age" property="age"/>
      <collection column="id" property="orders" ofType="domain.User_orders"   select="selectOrderByUser"> 
      <id column="id" property="id"/>
  <result column="name" property="name"/>
 </collection>


 

<resultMap id="blogResult" type="Blog">

  <association property="author" column="{id=author_id,likename=author_name}" javaType="Author" select="selectAuthor"/>

</resultMap>

相关的博客 文章: https://www.cnblogs.com/whb11/p/7230096.html

https://www.cnblogs.com/jimmy-muyuan/p/5459970.html

 

column = " { param1 = col1, param2 = col2 } "  这样子传递参数

 

 

 

discriminator 鉴别器 的使用

 

 

    <resultMap id="userAndHealthReport" extends="BaseResultMap" type="TUser">
                 
        <discriminator column="sex"  javaType="int">
            <case value="1" resultMap="userAndHealthReportMale"/>
            <case value="2" resultMap="userAndHealthReportFemale"/>
        </discriminator>
    </resultMap>
    

 

 

 

 

可以面向接口编程, 当 sex = 1 的时候,使用 男性体检报告.class new 一个对象

当 sex=2  的时候,使用 女性体检报告 new 一个对象

这种 就是在返回数据的 时候 动态 使用策略【类似于策略模式】,  通过鉴别器 考虑使用哪种类型

 

 

 

 

举个例子:

    <resultMap id="userAndHealthReportMale" extends="userAndHealthReport" type="TUser">
        <collection property="healthReports" column="id"
            select= "com.enjoylearning.mybatis.mapper.THealthReportMaleMapper.selectByUserId"></collection>
    </resultMap>
    
    <resultMap id="userAndHealthReportFemale" extends="userAndHealthReport" type="TUser">
        <collection property="healthReports" column="id"
            select= "com.enjoylearning.mybatis.mapper.THealthReportFemaleMapper.selectByUserId"></collection>
    </resultMap>
    
    <resultMap id="userAndHealthReport" extends="BaseResultMap" type="TUser">
                 
        <discriminator column="sex"  javaType="int">
            <case value="1" resultMap="userAndHealthReportMale"/>
            <case value="2" resultMap="userAndHealthReportFemale"/>
        </discriminator>
    </resultMap>
    

 

举个例子:

如果 orderType = 1, 去查询 order_consumer 表, 如果 orderType= 2, 去查询 order_pay 表

这个时候,就可以这样搞 ,配合嵌套查询,就特别方便

 

posted @ 2020-10-22 14:31  .geek  阅读(112)  评论(0编辑  收藏  举报