今天给大家分享的内容是关联关系映射,什么是一对多,什么是多对一?什么又是多对多。
下面小编来给大家分析,如有不对地方,麻烦见谅,欢迎评论指点。
一对多:就类似于我们在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表关联,一个客户对应多个订单
Customer客户表
- //生成set,get方法
- @Data
- //表示无参构造器
- @NoArgsConstructor
- //表示有参构造器
- @AllArgsConstructor
- //生成toStirng方法
- @ToString
- public class Customer {
-
- private Integer customerId;
- private String customerName;
-
- List
orders; - }
Order订单表
- //生成set,get方法
- @Data
- //表示无参构造器
- @NoArgsConstructor
- //表示有参构造器
- @AllArgsConstructor
- //生成toStirng方法
- @ToString
- public class Order {
- Integer orderId;
- String orderNo;
- Integer cid;
- Customer customer;
- }

- "1.0" encoding="UTF-8" ?>
- 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>

- @Service
- public class Customerservice implements Icustomer{
-
- @Autowired
- private ICustomerapper iCustomerapper;
-
- @Override
- public List
queryCustomer(Customer customer) { - return iCustomerapper.queryCustomer(customer);
- }
- }
效果展示

- //指定文件进行配置,用于生成spring上下文对象
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration("classpath*:applicationContext*.xml")
- public class CustomerserviceTest {
-
- @Autowired
- private Customerservice customerservice;
-
- @Test
- public void queryCustomer() {
- List
orders = customerservice.queryCustomer(null); - orders.forEach(System.out::println);
- }
- }
测试通过一对多的关联关系就完成了。
1.5总结:
一对多:一个客户对应多个订单
private Listorders=new ArrayList (); 多对一:多个订单对应一个客户(一个订单对应一个客户)
private Customer customer;
多对多:相当于书籍分类,一本书可以属于多个分类,一个分类里面可以有多本书。
比如:我们有两个被关联表查询结果
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
![]()
国际属于多个分类,一个分类里面可以有多国际。
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
nid; - List
cid; - }
这里小编解释一下
t_news_category表中字段nid对应t_news表的news_id字段
t_news_category表中cid对应t_category中的category_id字段
简单来说,nid——news_id cid——category_id
- <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>
collection使用场景,一对多的一方(1——多),表示具体的实现类的对应关系用collection,对应关联属性用ofType


association使用场景,一对多的多方(多——多),表示一个集合或多个集合,对应关系用association,对应关联属性用javaTpe


效果展示

测试demo
- //指定文件进行配置,用于生成spring上下文对象
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration("classpath*:applicationContext*.xml")
- public class CustomerserviceTest {
-
- @Test
- public void queryOrder() {
- List
orders = customerservice.queryOrder(null); - orders.forEach(System.out::println);
- }
- }