myBatis级联一对一,一对多及批量操作

来源:互联网 发布:php接口文档生成工具 编辑:程序博客网 时间:2024/06/10 11:50

resultMap出现的标签组顺序:

Content Model : (constructor?, id*, result*, association*, collection*, discriminator?)

一对一:association ,一对多:collection ,以下为配置,注意两表同名的字段使用别名,

如主表有id级联表同样是id,级联表可以使用别名

<resultMap id="entityMap" type="Shops">
        <id column="id" property="id" jdbcType="BIGINT" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <collection property="shopsrelations" column="id" ofType="Shopsrelation">
             <id column="sr_id" property="id" jdbcType="BIGINT" />
            <result column="shopid" property="shopid" jdbcType="BIGINT" />
        </collection>
    </resultMap>


查询部分,字段这里简化了,sp_where是引入的查询条件

1、如果只是主表级联其他表不分页,直接select * from a left join b on a.id = b.id where 条件即可,如主表1条数据,级联表3条,查询的结果集mysql里面看到是3条,mybatis会把3个级联的数据封装到list,实际查询的主表数据条数1条

2.这里重点说下分页,之前的写法是 select * from a left join b on a.id = b.id limit 0,10 where 条件,这种结果集是有误的,如主表1条数据对应级联表2条,主表第2条对应级联表3条,这时候出现的结果集

a1  b1,a1  b2,a2 b3,a2 b4,a2 b5 .....,这时候如果limit 0,2 拿到的是 a1 b1,a1 b2,mybatis查询后拿到的只有1条,b1,b2封装到list了,明显就是错误的,我主表有a1,a2两条数据,我查询的是主表,2条应该都拿的到才对,所以才换成下面那种写法,先主表limit再级联。

3.说下查询总条数 这里如果查询条件是b表的,那么也要连接,同样 select count(0) form a left join b on a.id = b.id这种写法也是错的,主表1条,级联表3条,明显count是3,正确的写法 select count(DISTINCT(a.id)) from a left join b on a.id = b.id ,需要去重主表,当然如果你查询条件是主表的,不用连接直接查a表条数加条件也是可以,这里之所以连接是为了通用,不用每个地方都写的不一样。

4.上面说的是1对多,其实1对1的话select * from a left join b on a.id = b.id limit 0,10 where 条件这种写法也不会造成出错,如以b.status=1为条件。那么试下select * from  (select * from a-copy limit 0,10) a left join b on a.id = b.id where 条件,这种通用吗,

主表先取出条数连接后按条件刷选,结果是通用的。多对多的话,有中间表,可以直接理解为主表对中间表的1对多,那么查询原理是一样的。

5.关于这一块的理解,有疑问或者我说的有误请留言,互相讨论下。

    <select id="selectEntities" resultMap="entityMap" parameterType="map">
        SELECT
            s.id, s.name
            sr.id sr_id, sr.shopid
        FROM
            (select * from shops limit #{startRecord},#{pageSize}) s
        left join
            shopsrelation sr
        on s.id = sr.shopid
        <include refid="sp_where"></include>
    </select>

<select id="selectEntitiesCount" resultType="int" parameterType="map">
        SELECT
            count(DISTINCT(s.id))
        FROM
            shops s
        left join
            shopsrelation sr
        on s.id = sr.shopid
        <include refid="sp_where"></include>
    </select>



批量新增

<insert id="insertEntity" parameterType="Product" keyColumn="id" useGeneratedKeys="true" keyProperty="id">

  INSERT INTO

          test

         (

         name,age,create_at

         )

        VALUES

         ( #{name},#{age},now())

</insert>


批量删除

<delete id="deleteEntities" parameterType="list">

        delete from test where id in

        <foreach collection="list" item="item" open="(" separator="," close=")">

#{item}

</foreach>

</delete>


0 0
原创粉丝点击