zoukankan      html  css  js  c++  java
  • 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对象。

  • 相关阅读:
    oracle python操作 增删改查
    python连接oracle
    opengl问题
    [转]C++ 获取文件夹下的所有文件名
    @RequestMapping[转]
    hdu 6082
    maven/ssm框架搭建
    windows下mysql解压版安装及centos下mysql root密码忘记
    maven创建web项目
    eclipse用tomcat发布网站的目录
  • 原文地址:https://www.cnblogs.com/shenming/p/3812471.html
Copyright © 2011-2022 走看看