1.多对一的查询
对于处理一方是通过使用 **association** 来处理关系的
<select id="queryData" parameterType="PermissionQuery" resultMap="permissionMap">
select
p.id,
p.name,
p.sn,
mn.id mid,
mn.sn msn,
mn.name mname,
mn.icon,
mn.url,
mn.parent_id,
mn.intro
from permission p left join menu mn on p.menu_id=mn.id
<where>
<if test="name!=null and name!=''">
and p.name like concat('%',#{name},'%')
</if>
</where>
LIMIT #{start},#{pageSize}
</select>
<resultMap id="permissionMap" type="Permission">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="sn" property="sn"></result>
<!--处理一方-->
<association property="mn" javaType="Menu">
<id column="mid" property="id"></id>
<result column="msn" property="sn"></result>
<result column="mname" property="name"></result>
<result column="icon" property="icon"></result>
<result column="url" property="url"></result>
<result column="parent_id" property="parent_id"></result>
<result column="intro" property="intro"></result>
</association>
</resultMap>
2.多对一的添加
下面的permission是多,menu是一,添加一的属性直接 .字段名
<insert id="save" parameterType="Permission">
insert into permission(name,sn,menu_id) values(#{name},#{sn},#{mn.id})
</insert>
3.多对一的修改
对于多对一的修改一方的数据时候和添加的时候处理方式是一样的,主要是看代码
<!--修改-->
<update id="update" parameterType="Permission">
update permission set name=#{name},sn=#{sn},menu_id=#{mn.id} where id=#{id}
</update>
4.多对多的查询
注意多对多的分页查询应该使用下面使用的这种嵌套查询的方法才行
先第一张表关联中间表
<select id="queryData" parameterType="RoleQuery" resultMap="RoleMap">
select
distinct
r.id ,
r.name,
r.sn
from role r
left join role_permission rp on r.id = rp.role_id
<where>
<include refid="sqlWhere"></include>
</where>
LIMIT #{start},#{pageSize}
</select>
高级查询
<!--高级查询,判断是否传入来了name值-->
<sql id="sqlWhere">
<if test="name!=null and name!=''">
and r.name like concat('%',#{name},'%')
</if>
</sql>
然后再处理关系封装
<resultMap id="RoleMap" type="Role">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="sn" column="sn"></result>
<collection property="permissions" ofType="Permission" column="id" select="queryPermissionsByRoleid" >
</collection>
</resultMap>
然后再把第二张表关联中间表
<select id="queryPermissionsByRoleid" parameterType="long" resultMap="PermissionMap">
select p.id pid,p.name pname, p.sn psn
from role_permission rp
join permission p on p.id = rp.permission_id
where rp.role_id = #{id}
</select>
然后再处理关系封装
<resultMap id="PermissionMap" type="Permission">
<id property="id" column="pid"></id>
<result property="name" column="pname" ></result>
<result property="sn" column="psn"></result>
</resultMap>
5.多对多的保存
先保存中间表
<!--保存中间表方法 list-->
<insert id="saveRolePermission" parameterType="arrayList">
insert into role_permission(role_id,permission_id) values
<foreach collection="list" item="item" separator=",">
(#{item.roleId},#{item.permissionId})
</foreach>
</insert>
再保存自己那个表
<!--添加-->
<insert id="save" parameterType="Role" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into role(name,sn) values(#{name},#{sn})
</insert>
6.多对多的删除
先删除中间表
<delete id="deleteRolePermission" parameterType="long">
delete from role_permission where role_id=#{roleid}
</delete>
然后再删除自己的
<!--删除-->
<delete id="delete" parameterType="long">
delete from role where id=#{id}
</delete>
7.多对多的修改
先调用多对多删除的方法,再调用多对多添加的方法重新添加
8.自关联查询(多对一)
<select id="queryData" parameterType="MenuQuery" resultMap="MenuMap">
select m.id,m.sn,m.name,m.intro,m.url,m.icon,n.id pid,n.name pname from menu m left join menu n on m.parent_id=n.id
<where>
<include refid="sqlWhere"></include>
</where>
LIMIT #{start},#{pageSize}
</select>
<!--高级查询,判断是否传入来了name值-->
<sql id="sqlWhere">
<if test="name!=null and name!=''">
and m.name like concat('%',#{name},'%')
</if>
</sql>
处理结果集+处理一方
<resultMap id="MenuMap" type="Menu">
<id column="id" property="id"></id>
<result column="sn" property="sn"></result>
<result column="name" property="name"></result>
<result column="intro" property="intro"></result>
<result column="url" property="url"></result>
<result column="icon" property="icon"></result>
<!--处理一方-->
<association property="parent_id" javaType="Menu">
<id column="pid" property="id"></id>
<result column="pname" property="name"></result>
</association>
</resultMap>
9.多对一自关联的添加
就是普通的添加方式
<!--添加-->
<insert id="save" parameterType="Menu">
insert into menu(id,sn,name,icon,url,parent_id,intro) values(#{id},#{sn},#{name},#{icon},#{url},#{parent_id.id},#{intro})
</insert>
10.多对一自关联的修改
<update id="update" parameterType="Menu">
update menu set id=#{id},sn=#{sn},name=#{name},icon=#{icon},url=#{url},parent_id=#{parent_id.id},intro=#{intro} where id=#{id}
</update>
11.多对一自关联的删除
如果不考虑其他的关联表的话,首先就得判断删除得那个是不是一的那个对象,如果是就得把一下面对应的所有多先全部删除,
比如:如果是菜单的话,多个子菜单对应一个父菜单,那么如果删除的是父菜单的话,那么就得先把父菜单下面的所有子菜单删除,再删除父菜单
<!--删除父菜单对应的子菜单-->
<delete id="deleteChildren" parameterType="long">
delete from menu where parent_id=#{id}
</delete>
<!--删除-->
<delete id="delete" parameterType="long">
delete from menu where id=#{id}
</delete>