mybatis,一对一,一对多,多对多
Mybatis,一对一,一对多,多对多
mybatis我们经常要处理一些表与表之间的sql编写,处理一对一,一对多,以及多对多关系的查询语句,针对这些关联关系,我们用的最多的就是association标签和collection标签。
一对一关联映射(association)
- 场景
一个学生属于一个班级的一员(一对一),一个班级由多名学生组成(一对多)
一对一关系,从学生角度:学生对班级一对一
- 建表
CREATE TABLE `clazz` (
`clazz_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '班级主键',
`clazz_name` varchar(10) DEFAULT NULL COMMENT '班级名称',
PRIMARY KEY (`clazz_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
/*Data for the table `clazz` */
insert into `clazz`(`clazz_id`,`clazz_name`) values
(1,'零一班'),
(2,'零二班');
CREATE TABLE `student` (
`student_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '学生主键',
`student_name` varchar(10) DEFAULT NULL COMMENT '学生名字',
`student_clazz_id` int(5) DEFAULT NULL COMMENT '班级外键',
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*Data for the table `student` */
insert into `student`(`student_id`,`student_name`,`student_clazz_id`) values
(1,'张晓明',1),
(2,'沙玉子',1),
(3,'王有为',2),
(4,'华小明',2);
- 实体类
/**
*学生实体类
* */
public class Student {
private Integer studentId;//学生id
private String studentName;//学生名字
private Integer studentClazzId;//班级外键
//班级信息
private Clazz clazz;
}
/**
* 班级实体类
* */
public class Clazz {
private Integer clazzId;//班级主键
private String clazzName;//班级名称
}
- 映射文件
<select id="findStudentClazzMap" resultMap="StudenClazzMap">
select * from clazz,student where student.student_id=clazz.clazz_id;
</select>
<!--
association标签(一对一):
property="在Student类里面clazz的属性"
javaType="被映射实体类"
id="数据库字段名"
property="实体类字段名"
注意:association标签里面被映射实体类用javaType
javaType! javaType! javaType!
-->
<resultMap id="StudenClazzMap" type="com.newture.entity.Student">
<id column="student_id" property="studentId"></id>
<result column="student_name" property="studentName"></result>
<result column="student_clazz_id" property="studentClazzId"></result>
<association property="clazz" javaType="com.newture.entity.Clazz">
<id column="clazz_id" property="clazzId"></id>
<result column="clazz_name" property="clazzName"></result>
</association>
</resultMap>
- Mapper接口
@Mapper
public interface StudentsMapper {
public List<Student> findStudentClazzMap();
}
- 结果
[Student{studentId=1, studentName='张晓明', studentClazzId=1, clazz=Clazz{clazzId=1, clazzName='零一班'}},
Student{studentId=2, studentName='沙玉子', studentClazzId=1, clazz=Clazz{clazzId=2, clazzName='零二班'}}]
//从结果能看出
//学生——张晓明——零一班
//学生——沙玉子——零二班
一对多关联映射(collection)
- 场景
一个用户能创建多个订单(一对多)
一对多关系,从用户角度:用户对订单一对多
- 建表
CREATE TABLE `user` (
`user_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '用户主键',
`user_name` varchar(10) DEFAULT NULL COMMENT '用户名称',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
/*Data for the table `user` */
insert into `user`(`user_id`,`user_name`) values
(1,'王延发'),
(2,'萧焕明');
CREATE TABLE `orders` (
`order_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '订单主键',
`order_number` varchar(10) DEFAULT NULL COMMENT '订单号',
`user_id` int(5) DEFAULT NULL COMMENT '用户主键',
PRIMARY KEY (`order_id`),
KEY `user_id` (`user_id`),
CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*Data for the table `orders` */
insert into `orders`(`order_id`,`order_number`,`user_id`) values
(1,'订单0001',1),
(2,'订单0002',1),
(3,'订单0003',2);
- 实体类
/**
* 订单实体类
* */
public class Orders {
private Integer orderId;
private String orderNumber;
}
/**
* 用户实体类
* */
public class User {
private Integer userId;//用户主键
private String userName;//用户名字
//订单信息
private List<Orders> ordersList;
}
- 映射文件
<select id="findAllUser" resultMap="UserMap">
select * from user,orders where user.user_id = orders.user_id
</select>
<!--
collection标签:
property="在User里面Orders的集合名"
oftype="被映射实体类"
column="数据库字段名"
property="实体类属性名"
注意:collection标签里面被映射实体类用oftype
oftype! oftype! oftype!
-->
<resultMap id="UserMap" type="com.newture.entity.User">
<id column="user_id" property="userId"></id>
<result column="user_name" property="userName"></result>
<collection property="ordersList" ofType="com.newture.entity.Orders">
<id column="order_id" property="orderId"></id>
<result column="order_number" property="orderNumber"></result>
</collection>
</resultMap>
- Mapper接口
@Mapper
public interface ClazzMapper {
public List<Clazz> findClazzStudentMap();
}
- 结果
[User{userId=1, userName='王延发', ordersList=[Order{orderId=1, orderNumber='订单0001'}, Order{orderId=2, orderNumber='订单0002'}]},
User{userId=2, userName='萧焕明', ordersList=[Order{orderId=3, orderNumber='订单0003'}]}]
//从结果能看出
//用户——王延发拥有2个订单
//用户——萧焕明只拥有1个订单
多对多关联映射
多对多映射我就不过多做实际操作了,我们一般遇的比较多的情况就是(一对多对多)映射关系如下(大概!大概!大概!):
<resultMap>
<collection>
<collection>
</collection>
</collection>
</resultMap>
<!-- collection标签是使用oftype -->
<!-- association标签是使用javaType-->
这篇博客介绍了在Mybatis中处理一对一、一对多和多对多关联映射的方法。通过association和collection标签,演示了如何进行学生与班级的一对一、用户与订单的一对多关系映射,并简述了多对多关系的处理。内容包括建表、实体类定义、映射文件配置和Mapper接口实现。

被折叠的 条评论
为什么被折叠?



