今天给大家分享的内容是关联关系映射,什么是一对多,什么是多对一?什么又是多对多。
下面小编来给大家分析,如有不对地方,麻烦见谅,欢迎评论指点。
1.一对多
一对多:就类似于我们在tb买东西,一次性卖了很多东西,一个订单有很多的订单项。
比如:我们有一个订单表查询结果
还有一个客户表
通过客户名称查询客户当前订单信息及对应的详细信息
select t1.customer_id,t1.customer_name,t2.cid,t2.order_id,t2.order_no from t_customer t1 inner join t_order t2 on t1.customer_id = t2.cid where t1.customer_name ='zs'order表与Customer表关联,一个客户对应多个订单
1.1.创建model层
Customer客户表
//生成set,get方法
@Data
//表示无参构造器
@NoArgsConstructor
//表示有参构造器
@AllArgsConstructor
//生成toStirng方法
@ToString
public class Customer {
private Integer customerId;
private String customerName;
List<Order> orders;
}
Order订单表
//生成set,get方法
@Data
//表示无参构造器
@NoArgsConstructor
//表示有参构造器
@AllArgsConstructor
//生成toStirng方法
@ToString
public class Order {
Integer orderId;
String orderNo;
Integer cid;
Customer customer;
}
1.2.创建mapper层
<?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.zking.mybatis.mapper.ICustomerapper">
<resultMap id="CustomerMap" type="com.zking.mybatis.model.Customer">
<id column="customer_id" property="customerId" javaType="java.lang.Integer"></id>
<result column="customer_name" property="customerName" javaType="java.lang.String"></result>
<collection property="orders" ofType="com.zking.mybatis.model.Order">
<id column="order_id" property="orderId" javaType="java.lang.Integer"></id>
<result column="order_no" property="orderNo" javaType="java.lang.String"></result>
<result column="cid" property="cid" javaType="java.lang.Integer"></result>
</collection>
</resultMap>
<select id="queryCustomer" resultMap="CustomerMap">
select t1.customer_id,t1.customer_name,t2.cid,t2.order_id,t2.order_no
from t_customer t1
inner join t_order t2 on t1.customer_id = t2.cid
<where>
<if test="customerName != null and customerName !=''">
and t1.customer_name #{customerName}
</if>
</where>
</select>
</mapper>
1.3.创建service层
@Service
public class Customerservice implements Icustomer{
@Autowired
private ICustomerapper iCustomerapper;
@Override
public List<Customer> queryCustomer(Customer customer) {
return iCustomerapper.queryCustomer(customer);
}
}
1.4.创建测试类
效果展示
//指定文件进行配置,用于生成spring上下文对象
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:applicationContext*.xml")
public class CustomerserviceTest {
@Autowired
private Customerservice customerservice;
@Test
public void queryCustomer() {
List<Customer> orders = customerservice.queryCustomer(null);
orders.forEach(System.out::println);
}
}
测试通过一对多的关联关系就完成了。
1.5总结:
一对多:一个客户对应多个订单
private List<Order> orders=new ArrayList<Order>();多对一:多个订单对应一个客户(一个订单对应一个客户)
private Customer customer;
2.多对多(相当于两个一对多)
多对多:相当于书籍分类,一本书可以属于多个分类,一个分类里面可以有多本书。
比如:我们有两个被关联表查询结果
t_category表
t_news表
t_news_category关联表
通过t_category表的名称查询当前信息及对应其他表详细信息
select t1.news_id,t1.title,t3.category_id,t3.category_name from t_news t1 inner JOIN t_news_category t2 on t2.nid=t1.news_id inner JOIN t_category t3 on t2.cid=t3.category_id where category_name = '国际'
运行结果
通过t_news表的id查询当前信息及对应其他表详细信息
select t1.news_id,t1.title,t3.category_id,t3.category_name from t_news t1 inner JOIN t_news_category t2 on t2.nid=t1.news_id inner JOIN t_category t3 on t2.cid=t3.category_id where news_id = 1
国际属于多个分类,一个分类里面可以有多国际。
2.1创建model层
t_category表
//生成set,get方法
@Data
//表示无参构造器
@NoArgsConstructor
//表示有参构造器
@AllArgsConstructor
//生成toStirng方法
@ToString
public class Category {
Integer categoryId;
String careforyName;
}
t_news表
//生成set,get方法
@Data
//表示无参构造器
@NoArgsConstructor
//表示有参构造器
@AllArgsConstructor
//生成toStirng方法
@ToString
public class New {
int NewsId;
String title;
}
t_news_category关联表
@Data
//表示无参构造器
@NoArgsConstructor
//表示有参构造器
@AllArgsConstructor
//生成toStirng方法
@ToString
public class Newcategory {
Integer id;
List<New> nid;
List<Category> cid;
}
这里小编解释一下
t_news_category表中字段nid对应t_news表的news_id字段
t_news_category表中cid对应t_category中的category_id字段
简单来说,nid——news_id cid——category_id
2.2创建mapper层
<resultMap id="NewcategoryMap" type="com.zking.mybatis.model.Newcategory">
<id column="id" property="id" javaType="java.lang.Integer"></id>
<collection property="nid" ofType="com.zking.mybatis.model.New">
<id column="news_id" property="NewsId" javaType="java.lang.Integer"></id>
<result column="title" property="title" javaType="java.lang.String"></result>
</collection>
<collection property="cid" ofType="com.zking.mybatis.model.Category">
<id column="category_id" property="categoryId" javaType="java.lang.Integer"></id>
<result column="category_name" property="careforyName" javaType="java.lang.String"></result>
</collection>
</resultMap>
<select id="queryNewcategory" resultMap="NewcategoryMap">
select t1.news_id,t1.title,t3.category_id,t3.category_name from t_news t1 inner JOIN t_news_category t2 on t2.nid=t1.news_id
inner JOIN t_category t3 on t2.cid=t3.category_id
<where>
<if test="careforyName != null and careforyName != ''">
and category_name #{careforyName}
</if>
</where>
</select>
2.3collection与association的区别
collection使用场景,一对多的一方(1——多),表示具体的实现类的对应关系用collection,对应关联属性用ofType
association使用场景,一对多的多方(多——多),表示一个集合或多个集合,对应关系用association,对应关联属性用javaTpe
2.4创建测试类
效果展示
测试demo
//指定文件进行配置,用于生成spring上下文对象
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:applicationContext*.xml")
public class CustomerserviceTest {
@Test
public void queryOrder() {
List<Order> orders = customerservice.queryOrder(null);
orders.forEach(System.out::println);
}
}