首页 > 代码库 > mybatis中one2many

mybatis中one2many

上一章讲了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对象。