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对象。

mybatis中one2many

时间: 2024-11-05 13:41:14

mybatis中one2many的相关文章

2017年9月3日 Spring及Mybatis中连接数据库的不同方式

连接数据库用spring和mybatis中使用的方法可以不同,mybaits可以不用写数据库的配置文件 Spring的连接方法 <!-- 读取属性文件(.properties)的内容 --> <!-- location:指定要读取的属性文件的位置及文件名. 注: classpath:表示依据类路径去查找 容器依据路径读取属性文件的内容, 并且将这些内容存放到Properties对象上 --> //数据库的登入数据文件 //文件名db.properties #db connectio

mybatis中&quot;#&quot;和&quot;$&quot;的区别

mybatis中"#"和"$"的区别 动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析.mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}. 在下面的语句中,如果 username 的值为 zhangsan,则两种方式无任何区别: select * from user where name = #{name}; select * from

mybatis中的mapper接口文件以及example类的实例函数以及详解

##Example example = new ##Example(); example.setOrderByClause("字段名 ASC"); //升序排列,desc为降序排列. example.setDistinct(false)//去除重复,boolean型,true为选择不重复的记录. Criteria criteria = new Example().createCriteria(); is null;is not null; equal to(value);not equ

MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)

在MyBatis中,当我们编写好访问数据库的映射器接口后,MapperScannerConfigurer就能自动成批地帮助我们根据这些接口生成DAO对象(),然后我们再使用Spring把这些DAO对象注入到业务逻辑层的对象(Service类的对象).因此,在这种情况下的DAO层,我们几乎不用编写代码,而且也没有地方编写,因为只有接口.这固然方便,不过如果我们需要在DAO层写一些代码的话,这种方式就无能为力了.此时,MyBatis-Spring提供给我们的SqlSessionDaoSupport类

MyBatis中的OGNL教程

MyBatis中的OGNL教程 有些人可能不知道MyBatis中使用了OGNL,有些人知道用到了OGNL却不知道在MyBatis中如何使用,本文就是讲如何在MyBatis中使用OGNL. 如果我们搜索OGNL相关的内容,通常的结果都是和Struts有关的,你肯定搜不到和MyBatis有关的,虽然和Struts中的用法类似但是换种方式理解起来就有难度. MyBatis常用OGNL表达式 e1 or e2 e1 and e2 e1 == e2,e1 eq e2 e1 != e2,e1 neq e2

myBatis中的注解@Param、返回值为Map、JAVA读取Excel并解析文本、Class.getResource()和ClassLoader.getResource()

myBatis中的注解@Param:http://blog.csdn.net/gao36951/article/details/44258217:  http://www.cnblogs.com/thomas12112406/p/6217211.html. myBatis返回值为Map:http://blog.csdn.net/werewr342352321df/article/details/11892755. ====================== JAVA读取Excel并解析文本:h

mybatis中xml的sql之test中文报错

在mybatis中sql,test中文报错( java.lang.NumberFormatException 这句话明确告诉了我们是数字格式异常).需加.tostring(). <if test="bookName == '毛选集'.tostring() "> and b.book_Name like #{bookName} </if>

Mybatis中的resultType和resultMap 区别

Mybatis中的resultType和resultMap 是mybatis 中返回类型一定用到的,但不会同时出现.mybatis返回类型肯定是map结构,然后根据返回类型是map还是对象类型,再转换. 在给对象设置属性的时候,两个方法肯定会调用. private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException { final ResultLoaderMap lazyLoader

使用Log4jdbc-log4j2监听MyBatis中运行的SQL和Connection

引言: 在项目中使用了MyBatis,一个比较苦恼的问题是无法看到执行的SQL的具体情况,所以,就找到了Log4jdbc-log4j2.这个是一个基于jdbc层面的监听工具,可以监听对于数据库的主要操作,从而完美的查看到其中执行的操作. 1. Log4jdbc-log4j2版本选择 log4jdbc-log4j2-jdbc3.jar for JDBC 3 support in JDK 1.5 log4jdbc-log4j2-jdbc4.jar for JDBC 4 support in JDK