MyBatis对象关联关系---- association与collection
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;
Order实体类
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"/>
<!--使用resultMap属性引用上面的User实体映射-->
<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>
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
MyBatis对象关联关系---- association与collection的更多相关文章
- Mybatis关联查询<association> 和 <collection>
一.背景 1.在系统中一个用户存在多个角色,那么如何在查询用户的信息时同时把他的角色信息查询出来啦? 2.用户pojo: public class SysUser { private Long id; ...
- Mybatis中使用association及collection进行自关联示例(含XML版与注解版)
XML版本: 实体类: @Data @ToString @NoArgsConstructor public class Dept { private Integer id; private Strin ...
- Mybatis中使用association及collection进行一对多双向关联示例(含XML版与注解版)
XML版本: 实体类: package com.sunwii.mybatis.bean; import java.util.ArrayList; import java.util.List; impo ...
- MyBatis对象关联关系----多对多的保存与查询
模拟情景: 对象:学生,课程 关系:一个学生可选多个课程,一门课程可被多个学生选择 一.保存 1.创建数据库表,student,course,student_course,其中student_cour ...
- MyBatis之ResultMap的association和collection标签(一)
1.先说resultMap比较容易混淆的点, 2. Map结尾是映射,Type是类型 resultType 和restltMap restulyType: 1.对应的是java对象中的属性,大小写不 ...
- MyBatis之ResultMap的association和collection标签详解
一.前言 MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子. 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样. 如果能有一种数据库映射模式, ...
- mybatis中association和collection的column传入多个参数值
在使用 association和collection 进行关联查询的时候 column 参数可能会有多个,如下: 注意: parameterType 一定要是 java.util.Map
- MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟/懒加载
一.myBatis对象关系映射(多对一关系.一对多关系) 1.多对一关系: ---例子:多个员工同属于一个部门. (1)myBatis发送 额外SQL: ■ 案例:员工表通过 dept_id 关联 部 ...
- mybatis之关联关系
前言:在我们之前的hibernate中我们是学过了关联关系的,所以我们在本章给讲一讲mybatis的关联关系. mybatis的关联关系一对多的测试1.通过逆向工程生成Hbook,HbookCateg ...
随机推荐
- P1189 SEARCH(逃跑的拉尔夫)
P1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移 ...
- java二分法来求一个数组中一个值的key
package TestArray; import java.util.Arrays; /** * 二分法查找 */ public class Test { public static void ma ...
- FPGA的嵌入式乘法器
1. FPGA主要应用在并行处理资源的应用,视频与图像处理,无线通信的中频调制解调器. 嵌入式乘法器可以配置成一个 18 × 18 乘法器,或者配置成两个 9 × 9 乘法器.对于那些大于18 × 1 ...
- 小议Android多进程以致Application多次初始化
最近遇到一个bug,当应用加了多进程后,比如总共进程数为N,会出现在`startService()`时`onStartCommand()`方法会被重复调用`(N-1)`次的奇怪现象. ***## 祸起 ...
- ES5新增数组方法(3):some
检查数组元素中是否有元素符合指定. // 数组中的元素部分满足指定条件返回true let arr = [1, 3, 5, 7, 9]; console.log(arr.some((value, in ...
- JVM 什么时候会触发FGC
1:System.gc(); 2:老年代满了 没啥好说的从年轻代去往老年代的 3:JDK7或JDK6中永久区满了 得看是否还会有分配,如果没有就不会进行FGC,不过CMS GC下会看到不停地CMS G ...
- 使用CodeBlocks编译64位程序(用的编译器仅仅是windows sdk的)
需求: -CodeBlocks使用nightly版本: -Windows SDK(我使用的是6.0A,即微软针对vista的,因为这个比较小,你也可以选择其他版本但是要有64位编译器.他也适用于xps ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- mysql创建用户并手授权
--创建用户CREATE USER 'test'@'%' IDENTIFIED BY 'test'; --授权GRANT ALL ON *.* TO 'test'@'%'; --修改密码SET PAS ...
- DP入门(4)——线性结构上的动态规划
一.最长上升子序列(LIS) 给定n个整数A1,A2,…,An,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变).例如序列1,6,2,3,7 ...