1、关联关系概念说明
【1】数量关系
主要体现在数据库表中
-
一对一
夫妻关系,人和身份证号
-
一对多
用户和用户的订单,锁和钥匙
-
多对多
老师和学生,部门和员工
通过外键查询另一个表中的数据
【2】关联关系的方向
- 双向:双方都可以访问到对方
- Customer:包含Order的集合属性
- Order:包含单个Customer的属性
- 单向:双方中只有一方能够访问到对方
- Customer:不包含Order的集合属性,访问不到Order
- Order:包含单个Customer的属性
2、创建模型
①创建实体类
public class Customer {
private Integer customerId;
private String customerName;
private List<Order> orderList;// 体现的是对多的关系
public class Order {
private Integer orderId;
private String orderName;
private Customer customer;// 体现的是对一的关系
双向关联关系:双方都能够引用到对方
Customer中能够引用Order
Order中能够引用Customer
在双向关联关系中使用toString()等方法时注意避免无限死循环。
单向关联关系:双方中只有一方能够引用到对方
Customer中没有引用Order
Order中引用了Customer
②创建数据库表插入测试数据
CREATE TABLE `t_customer` (
`customer_id` INT NOT NULL AUTO_INCREMENT,
`customer_name` CHAR(100),
PRIMARY KEY (`customer_id`)
);
CREATE TABLE `t_order` (
`order_id` INT NOT NULL AUTO_INCREMENT,
`order_name` CHAR(100),
`customer_id` INT,
PRIMARY KEY (`order_id`)
);
INSERT INTO `t_customer` (`customer_name`) VALUES ('c01');
INSERT INTO `t_order` (`order_name`, `customer_id`) VALUES ('o1', '1');
INSERT INTO `t_order` (`order_name`, `customer_id`) VALUES ('o2', '1');
INSERT INTO `t_order` (`order_name`, `customer_id`) VALUES ('o3', '1');
实际开发时,一般在开发过程中,不给数据库表设置外键约束。
原因是避免调试不方便。
一般是功能开发完成,再加外键约束检查是否有bug。
一、对一
1、创建OrderMapper接口
public interface OrderMapper {
Order selectOrderWithCustomer(Integer orderId);
}
2、创建OrderMapper.xml配置文件
<!-- 创建resultMap实现“对一”关联关系映射 -->
<!-- id属性:通常设置为这个resultMap所服务的那条SQL语句的id加上“ResultMap” -->
<!-- type属性:要设置为这个resultMap所服务的那条SQL语句最终要返回的类型 -->
<resultMap id="selectOrderWithCustomerResultMap" type="com.atguigu.mybatis.entity.Order">
<!-- 先设置Order自身属性和字段的对应关系 -->
<id column="order_id" property="orderId"/>
<result column="order_name" property="orderName"/>
<!-- 使用association标签配置“对一”关联关系 -->
<!-- property属性:在Order类中对一的一端进行引用时使用的属性名 -->
<!-- javaType属性:一的一端类的全类名 -->
<association property="customer" javaType="com.atguigu.mybatis.entity.Customer">
<!-- 配置Customer类的属性和字段名之间的对应关系 -->
<id column="customer_id" property="customerId"/>
<result column="customer_name" property="customerName"/>
</association>
</resultMap>
<!-- Order selectOrderWithCustomer(Integer orderId); -->
<select id="selectOrderWithCustomer" resultMap="selectOrderWithCustomerResultMap">
SELECT order_id,order_name,c.customer_id,customer_name
FROM t_order o
LEFT JOIN t_customer c
ON o.customer_id=c.customer_id
WHERE o.order_id=#{orderId}
</select>
3、在Mybatis全局配置文件中注册Mapper配置文件
<!-- 注册Mapper配置文件:告诉Mybatis我们的Mapper配置文件的位置 -->
<mappers>
<!-- 在mapper标签的resourc