案例:员工中有部门属性.
在员工的映射文件中,添加属性关系的映射.
<resultMap type="User" id="user_mapping">
<association property="dept" column="dept_id"
select="com.lwf.mybatis.hallo.DeptmentMapper.get"/>
resultMap>
association标签的属性:
此时查询一个员工,并实例化后的结果为发送两条sql.
若查询n个员工(都有部门属性),就会发送1条查员工+n条查部门的sql.(性能太低)
在员工的映射文件中,添加属性关系的映射.
<resultMap type="User" id="user_mapping">
<association property="dept" column="dept_id" javaType="Deptment">
<id property="id" column="did"/>
<result property="name" column="dname"/>
association>
resultMap>
列表查询时候,用left join 部门表格
<select id="list" resultMap="user_mapping">
select
u.id,u.name,u.age,u.birthday,
d.id as did,d.name as dname
from user u left join deptment d on u.dept_id=d.id
select>
此刻查询员工列表对象,只需要一条sql即可.
insert into user (name,age,dept_id) values (#{name},#{age},#{dept.id})
update employee set name=#{name},age=#{age},dept_id=#{dept.id} where id=#{id}
案例:部门对象中有员工属性.(外键依然在员工表中)
需要添加额外的方法和sql语句,去维护员工表中的员工的dept_id列.
1.mapper中添加方法
//userId,表示一个user对象的id
//deptId,表示一个dept对象的id
void updateRelation(@Param("userId")Long userId, @Param("deptId")Long deptId);
2.映射文件中添加sql
<update id="updateRelation">
update user set dept_id = #{deptId} where id=#{userId}
update>
3.测试
Deptment dept = new Deptment();
dept.setName("人事部");
dept.getList().add(mapper.get(8L));//给该部门添加两个已经存在的员工
dept.getList().add(mapper.get(9L));
deptmapper.add(dept); //持久化后,自动注入数据库中对应的id值
//维护关系
for (User user : dept.getList()) {
deptmapper.updateRelation(user.getId(),dept.getId());
}
4.小结:
这种方式,较为简单,同时性能低,一个员工发送一条维护关系的sql,
思路2:获取数组对象,放着是该部门的员工的id的数组,mapper的方法形参是部门id+数组对象.映射的sql为:
update user set dept_id = #{deptId} where id in 数组(此处使用遍历)
此时维护关系的代码片段,不再需要遍历
依然需要额外的sql去维护二者关系.
void deleteRelation( @Param("deptId")Long deptId);
2.映射文件中添加sql
<update id="deleteRelation">
update user set dept_id = null where id=#{userId}
update>
3.测试
Deptment dept= mapper.get(1L);
//清空对应员工的外键
for (User user : dept.getList()) {
deptmapper.updateRelation(dept.getId());
}
//删除部门
mapper.delete(1L);
4.小结:
这种方式,较为简单,同时性能低,一个员工发送一条维护关系的sql,
思路2:获取数组对象,放着是该部门的员工的id的数组,mapper的方法形参是数组对象.映射的sql为:
update user set dept_id = null where id in 数组(此处使用遍历)
此时的操作,只需要2步,1:清空外键,2:删除部门(不用遍历)
在员工的映射文件中,添加按部门id查询的sql.
<select id="selectByDeptId" resultMap="user_mapping">
select *from user where dept_id=#{id}
select>
在部门的映射文件中,添加属性关系的映射.
property="list" column="id" ofType="User" select="com.lwf.mybatis.hallo.UserMapper.selectByDeptId"/>
collection标签的属性:
在部门的映射文件中,添加属性关系的映射.
<collection property="list" ofType="User">
<id property="id" column="uid"/>
<result property="name" column="uname"/>
<result property="age" column="uage"/>
<result property="birthday" column="ubirthday"/>
collection>
修改查询的sql
只需要一条sql,就可以查询出对应的部门和员工list.
案例:部门中有员工list属性,二者关系的多对多.
中间表为 deptment_user.
1.需要额外的sql去维护关系
//传递员工的id和部门id,同步到中间表
void addRelation(@Param("userId")Long userId, @Param("deptId")Long deptId);
<insert id="addRelation">
insert into deptment_user(dept_id,user_id) values(#{deptId},#{userId})
insert>
2.测试
deptmapper.add(dept);//添加后,就添加其id属性
for (User user : dept.getList()) {
deptmapper.resovleRelation(user.getId(), dept.getId());
}
3.小结
当添加的部门有100个员工,需要100个sql去维护.这个不知道怎么改了...
1.删除关系.根据部门id值,将中间表 dept_id=#{id}的行,都删除.
2.删除部门.
1.删除关系,根据部门id值,将中间表 dept_id=#{id}的行,都删除.
2.添加关系,即添加部门时候的维护关系的操作.
3.修改部门.
在员工的映射文件中,添加通过部门id,查找员工.
<select id="getByDept" parameterType="Long" resultMap="user_mapping">
select u.id,u.name,u.age,u.birthday
from deptment_user du join user u on du.user_id=u.id
where du.dept_id = #{id}
select>
在部门的映射文件中,添加属性关系的映射.
property="list" ofType="User" column="id" select="com.lwf.mybatis.hallo.UserMapper.getByDept"/>
有中间表的内连方式,拼sql太麻烦~~