上一章讲了many2one,接下来看看单向的one2many,请注意,下面的代码只做演示,不推荐在真实项目中使用。通过这个例子,也能更深刻的理解到在使用mybatiis的时候,应该更加谨慎的设计对象。
首先创建对象:
public class Employee {
private Long id;
private String name;
}
public class Department {
private Long id;
private String name;
private Set<Employee> emps = new HashSet<Employee>();
}
可以看到department和employee是单向的one2many。
这时候,对于employee来说,就是一个简单的单对象,我们先完成Employee对象的映射:
<mapper namespace="cd.itcast.mybatis.mapper.EmployeeMapper">
<insert id="save" parameterType="Employee" useGeneratedKeys="true"
keyProperty="id">
INSERT INTO EMPLOYEE(name)
VALUES
(#{name})
</insert>
<select id="get" resultType="Employee" parameterType="long">
SELECT * FROM
EMPLOYEE WHERE id = #{id}
</select>
</mapper>
接下来看看department的映射。先看保存。注意,之前我们说过,在mybatis中,所有的sql都是我们自己来控制。而现在的对象是单向的
one2many,考虑在hibernate中,因为从many方没法管理one方的关系,只有one方能够管理关系,所以只有通过额外的update语
句来完成关系的维护。所以,现在我们除了department本身的保存,还需要用一个额外的update来维护one和many的关系:
<insert id="save" parameterType="Employee" useGeneratedKeys="true"
keyProperty="id">
INSERT INTO DEPARTMENT(name)
VALUES
(#{name})
</insert>
<update id="update" parameterType="hashmap">
UPDATE EMPLOYEE SET DEPT_ID = #{deptId} WHERE id = #{id}
</update>
Insert没啥多说的,注意这个update,我们设置的parameterType是hashmap类型。下面的update语句中,使用了#{deptid}和#{id},在这里deptid和id就不再指代属性了,而是map中的key值了。
下面来看看save测试:
@Test
public void testSave() {
Department d = new Department();
d.setName("d");
Employee e = new Employee();
e.setName("e1");
Employee e2 = new Employee();
e2.setName("e2");
d.getEmps().add(e);
d.getEmps().add(e2);
SqlSession session = MyBatisUtil.getInstance().openSession();
EmployeeMapper em = session.getMapper(EmployeeMapper.class);
em.save(e);
em.save(e2);
DepartmentMapper dm = session.getMapper(DepartmentMapper.class);
dm.save(d);
for (Employee te : d.getEmps()) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("deptId", d.getId());
m.put("id", te.getId());
dm.update(m);
}
session.commit();
session.close();
}
一定要注意保存顺序,首先是保存many方的两个employee,接着保存one方,department,然后我们需要手动遍历department
对应的employee列表,并创建成一个一个的hashmap,并将这些hashmap作为参数传入更新关系的update中。
从这个save就可以看出,如果对象设计有问题,那么在设计sql的时候就很困难。当然,还有其他的简单的保存方式,比如保存employee的时候使用hashmap保存,不使用Employee对象。
mybatis中one2many