difference between collection and association mapping in mybatis 3

幽映每白日,清辉照衣裳。这篇文章主要讲述difference between collection and association mapping in mybatis 3相关的知识,希望能为你提供帮助。
Mybatis处理“ 一对多” 的关系时,需要用到associasion元素。处理” 多对一“ 用collection元素来实现(这两个元素在之前mapper文件中提到过)。
本例子中,假设一名User可以有多个Orders,用associasion来实现关联关系
首先数据库表结构

CREATE TABLE `user` ( `id` int(8) NOT NULL AUTO_INCREMENT, `username` varchar(20) COLLATE utf8_bin NOT NULL, `usernumber` varchar(20) COLLATE utf8_bin NOT NULL, `loginname` varchar(20) COLLATE utf8_bin NOT NULL, `loginpassword` varchar(20) COLLATE utf8_bin NOT NULL, `sex` varchar(4) COLLATE utf8_bin DEFAULT NULL, `birthday` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; //orders表中为user_id添加外键,指向user表的id CREATE TABLE `orders` ( `oid` int(8) NOT NULL AUTO_INCREMENT, `orderid` varchar(20) COLLATE utf8_bin NOT NULL, `message` varchar(20) COLLATE utf8_bin DEFAULT NULL, `user_id` int(8) NOT NULL, PRIMARY KEY (`oid`), KEY `1001` (`user_id`), CONSTRAINT `1001` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Orders实体类
public int oid; public String orderid; public String message; public User user; //省略get/set方法

Order对象的sql映射文件,order.xml
< mapper namespace="com.mybaits.dao.impl.OrdersImpl"> < resultMap type="com.mybaits.bean.User" id="userResult"> < id property="id" column="id" /> < result property="username" column="username"/> < result property="usernumber" column="usernumber"/> < result property="loginname" column="loginname"/> < result property="loginpassword" column="loginpassword"/> < result property="sex" column="sex"/> < result property="birthday" column="birthday" /> < /resultMap> < resultMap type="com.mybaits.bean.Orders" id="orderResult"> < id property="oid" column="oid"/> < result property="orderid" column="orderid"/> < result property="message" column="message"/> < association property="user" column="user_id" javaType="com.mybaits.bean.User" jdbcType="INTEGER" resultMap="userResult"> < /association> < /resultMap> < select id="findAllOrders" resultMap="orderResult"> select * from orders o left join user u on o.user_id=u.id < /select> < insert id="saveOrder" parameterType="Orders"> insert into orders (orderid,message,user_id) values(#{orderid},#{message},#{user.id}) < /insert> < /mapper> < !--使用resultMap属性引用上面的User实体映射-->

OrderTest类
@Test public void Test2(){ List< Orders> l=order.findOrders(); for(int i=0; i< l.size(); i++){ System.out.println(l.get(i)); } } 订单编号:10001订单信息:订单1下单用户:BN 订单编号:10002订单信息:订单2下单用户:BN 订单编号:10003订单信息:订单3下单用户:qwe 订单编号:10004订单信息:订单4下单用户:qwe 订单编号:10005订单信息:订单5下单用户:JAVA

利用collection在User对象中关联
1.在User中添加 List< Orders> orders 属性
private List< Orders> orders=new ArrayList< Orders> (); //get/set方法

2.User的sql映射文件user.xml
< resultMap type="com.mybaits.bean.User" id="userResult"> < id property="id" column="id" /> < result property="username" column="username"/> < result property="usernumber" column="usernumber"/> < result property="loginname" column="loginname"/> < result property="loginpassword" column="loginpassword"/> < result property="sex" column="sex"/> < result property="birthday" column="birthday" /> //collection元素映射 user对象中order的集合属性,resultMap指向下面的order的resultMap < collection property="orders" ofType="Orders" resultMap="orderResult"> < /collection> < /resultMap> < resultMap type="com.mybaits.bean.Orders" id="orderResult"> < id property="oid" column="oid"/> < result property="orderid" column="orderid"/> < result property="message" column="message"/> < /resultMap> < select id="getUOBN" parameterType="string" resultMap="userResult"> select * from user u left join orders o on o.user_id=u.id where u.usernumber=#{usernumber} < /select>

3.测试类
@Test public void Test11(){ User u=userDao.findUserOrders("01111001"); System.out.println("用户:"+u.getUsername()+"\n订单总数:"+u.getOrders().size()); for(Orders o:u.getOrders()){ System.out.println("订单号:"+o.getOrderid()+"\t订单信息:"+o.getMessage()); }}用户:BN 订单总数:2 订单号:10001订单信息:订单1 订单号:10002订单信息:订单2

http://www.voidcn.com/blog/fqf_520/article/p-4973660.html
 
 
I am going to assume that you have a many to many relationship between Projects and Employees, which is why you created a Project Assignment table. This Project Assignment table / object may only have two fields/columns: a mapping of project id to employee id - a classic "bridge table" (aka "join" or "junction" table).
When you map this model to an object graph, you have three options:
A Project object can have a list of all employees assigned to it
An Employee object can have a list of projects s/he is assigned to
Create a Project Assignment object that has a mapping of each projects to its employee and each employee to his/her project.
In your example you chose the last option.
 
Association
An association is a single mapping for a "has-one" relationship.
Suppose an Employee can only be assigned to one Project at a time. Some models call this a "has-one" or "belongs to" relationship. If you want to make Employee your "primary" focus in the object graph, then you would map it with an association to his/her Project:
< resultMap id="employeeResultMap" type="Employee">
< constructor>
< idArg column="employee_id" javaType="_integer"/>
< /constructor>
< result property="firstName"column="first_name"/>
< result property="lastName" column="last_name"/>
< !-- etc. for other simple properties of Employee -->
< !-- Project is a "complex property" of Employee, so we use an -->
< !-- association to grab all of the Projects properties also -->
< association property="assignedProject" resultMap="projectResultMap"/>
< /resultMap>
In this case your objects would look like this:
public Employee {
int id;
String firstName;
String lastName
Project assignedProject;
}
public Project {
int id;
String name;
String abc;
}

Collection
An collection is a "list" or "set" of associations.
Now model the inverse - we make Project the primary focus. A Project has a "has-many" relationship with Employee, so it will have a list or collection of those, so we use a "collection" mapping:
< resultMap id="projectResultMap" type="Project">
< constructor>
< idArg column="project_id" javaType="_integer"/>
< arg column="name" javaType="String"/>
< /constructor>
< result property="abc" column="abc"/>
< !-- This tells mybatis that there can be multiple Employees -->
< !-- to look up and get their properties -->
< collection property="employees" ofType="Employee">
< constructor>
< idArg column="employee_id" javaType="_integer"/>
< /constructor>
< result property="firstName"column="first_name"/>
< result property="lastName" column="last_name"/>
< /collection>
< /resultMap>
Now your objects would look like this:
public Employee {
int id;
String firstName;
String lastName
}
public Project {
int id;
String name;
String abc;
List< Employee> employees;
}

Project Association
To have a Project Association object, you would either need:
A single Project Association object that maps all projects to employees and vice versa
One Project Association object per project, mapping a project to its employees
One Project Association object per employee, mapping an employee to his/her projects
The first option is rather complex and messy - you would be trying to do relational mapping with object graphs (hash tables most likely).
I would choose to make one of the entities (Project or Employee) the primary focus and then model it as I showed above. The one case I didn‘t cover is if Employee is your primary focus and an Employee can be on multiple projects, then make that a "has-many" relationship using a collection rather than the association I used above.
Final Note: if it would help to see examples of using a "has-one" association and a "has-many" collection, see the MyBatis Koans I created: https://github.com/midpeter444/mybatis-koans. Koans 10 and 11 demonstrate this.
http://stackoverflow.com/questions/12425384/difference-between-collection-and-association-mapping-in-mybatis-3
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html


https://github.com/ShawnyXiao/SpringBoot-MyBatis
https://github.com/oneone1995/M-Volunteer-SpringBoot

待确定:
https://github.com/sunlightcs/renren-security








【difference between collection and association mapping in mybatis 3】 

    推荐阅读