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>