文章目录
1.关联关系的概念说明
①数量关系
主要体现在数据库中
一对一:身份证
一对多:锁与钥匙
多对多:老师和学生
②关联关系的方向
主要体现在java实体类中
双向:双方都可以访问到对方
Customer:包含Order的集合属性
Order:包含单个Customer的属性
单向:双方中只有一方能够访问到对方
Customer:不包含Order的集合属性,访问不到Order
Order:包含单个Customer的属性
2.创建模型
2.0环境的准备
①新建一个模板
②导入坐标POM.xml
③配置jdbc.properties和log4.xml和mybatis-config.xml
2.1数据库
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');
2.2实体类
package com.sdjzu.mybatis.entity;
import java.util.List;
public class Customer {
private Integer customerId;
private String customerName;
//一个客户对应多个订单
private List<Order> orderList;
public Customer() {
}
public Customer(Integer customerId, String customerName, List<Order> orderList) {
this.customerId = customerId;
this.customerName = customerName;
this.orderList = orderList;
}
public List<Order> getOrderList() {
return orderList;
}
public void setOrderList(List<Order> orderList) {
this.orderList = orderList;
}
public Integer getCustomerId() {
return customerId;
}
public void setCustomerId(Integer customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
@Override
public String toString() {
return "Customer{" +
"customerId=" + customerId +
", customerName='" + customerName + '\'' +
", orderList=" + orderList +
'}';
}
}
package com.sdjzu.mybatis.entity;
public class Order {
private Integer orderId;
private String orderName;
//一个订单仅对应一个客户
private Customer customer;
public Order() {
}
public Order(Integer orderId, String orderName, Customer customer) {
this.orderId = orderId;
this.orderName = orderName;
this.customer = customer;
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
@Override
public String toString() {
return "Order{" +
"orderId=" + orderId +
", orderName='" + orderName + '\'' +
", customer=" + customer +
'}';
}
}
3.对一
3.1OrderMapper接口
package com.sdjzu.mybatis.dao;
import com.sdjzu.mybatis.entity.Order;
public interface OrderMapper {
//查询出订单和用户
Order selectOrderWithCustomer(Integer orderId);
}
3.2OrderMapper.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sdjzu.mybatis.dao.OrderMapper">
<!--Order selectOrderWithCustomer(Integer orderId);-->
<!--创建resultMap实现“对一”的映射关系-->
<!--id属性:一般设置为SQL语句的id加上resultMap-->
<!--type属性:设置为SQL要返回的类型的全类型名-->
<resultMap id="selectOrderWithCustomerResultMap" type="com.sdjzu.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.sdjzu.mybatis.entity.Customer">
<!--配置Customers属性和字段的对应关系-->
<id column="customer_id" property="customerId"/>
<result column="customer_name" property="customerName"/>
</association>
</resultMap>
<select id="selectOrderWithCustomer" resultMap="selectOrderWithCustomerResultMap">
select order_id,order_name,c.customer_id,c.customer_name
from t_order o
Left join t_customer c
on o.customer_id=o.customer_id
where o.order_id=#{orderId}
</select>
</mapper>
3.3在Mybatis全局配置文件中注册Mapper配置文件
<mapper resource="mappers/orderMapper.xml"/>
3.4测试
@Test
public void testSelectOrderWithCustomer(){
OrderMapper mapper = session.getMapper(OrderMapper.class);
Order order = mapper.selectOrderWithCustomer(1);
System.out.println(order);
Customer customer = order.getCustomer();
System.out.println(customer);
}
4.对多
4.1CustomerMapper接口
/*对多*/
Customer selectCustomerAndOrder(Integer customerId);
4.2CustomerMapper.xml
<resultMap id="selectCustomerAndOrderResultMap" type="com.sdjzu.mybatis.entity.Customer">
<id column="customer_id" property="customerId"/>
<result column="customer_name" property="customerName"/>
<collection property="order" ofType="com.sdjzu.mybatis.entity.Order" >
<id column="order_id" property="orderId"/>
<result column="order_name" property="orderName"/>
</collection>
</resultMap>
<!--Customer selectCustomerAndOrder(Integer customerId);-->
<select id="selectCustomerAndOrder" resultMap="selectCustomerAndOrderResultMap">
SELECT c.customer_id,c.customer_name,o.order_id,o.order_name
FROM t_customer c
LEFT JOIN t_order o
ON c.customer_id=o.customer_id
WHERE c.customer_id=#{customerId};
</select>
4.3在mybatis全局配置中注册CustomerMapper
4.4测试
@org.junit.Test
public void testSelectCustomerAndOrderResultMap(){
CustomerMapper mapper = session.getMapper(CustomerMapper.class);
Customer customer = mapper.selectCustomerAndOrder(1);
System.out.println(customer.getCustomerId() + customer.getCustomerName());
List<Order> orderList= customer.getOrder();
for(Order order:orderList){
System.out.println(order);
}
}