• mybatis关联关系映射


    今天给大家分享的内容是关联关系映射,什么是一对多,什么是多对一?什么又是多对多。

    下面小编来给大家分析,如有不对地方,麻烦见谅,欢迎评论指点。

    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客户表

    1. //生成set,get方法
    2. @Data
    3. //表示无参构造器
    4. @NoArgsConstructor
    5. //表示有参构造器
    6. @AllArgsConstructor
    7. //生成toStirng方法
    8. @ToString
    9. public class Customer {
    10. private Integer customerId;
    11. private String customerName;
    12. List orders;
    13. }

    Order订单表

    1. //生成set,get方法
    2. @Data
    3. //表示无参构造器
    4. @NoArgsConstructor
    5. //表示有参构造器
    6. @AllArgsConstructor
    7. //生成toStirng方法
    8. @ToString
    9. public class Order {
    10. Integer orderId;
    11. String orderNo;
    12. Integer cid;
    13. Customer customer;
    14. }

    1.2.创建mapper层

    1. "1.0" encoding="UTF-8" ?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    3. <mapper namespace="com.zking.mybatis.mapper.ICustomerapper">
    4. <resultMap id="CustomerMap" type="com.zking.mybatis.model.Customer">
    5. <id column="customer_id" property="customerId" javaType="java.lang.Integer">id>
    6. <result column="customer_name" property="customerName" javaType="java.lang.String">result>
    7. <collection property="orders" ofType="com.zking.mybatis.model.Order">
    8. <id column="order_id" property="orderId" javaType="java.lang.Integer">id>
    9. <result column="order_no" property="orderNo" javaType="java.lang.String">result>
    10. <result column="cid" property="cid" javaType="java.lang.Integer">result>
    11. collection>
    12. resultMap>
    13. <select id="queryCustomer" resultMap="CustomerMap">
    14. select t1.customer_id,t1.customer_name,t2.cid,t2.order_id,t2.order_no
    15. from t_customer t1
    16. inner join t_order t2 on t1.customer_id = t2.cid
    17. <where>
    18. <if test="customerName != null and customerName !=''">
    19. and t1.customer_name #{customerName}
    20. if>
    21. where>
    22. select>
    23. mapper>

    1.3.创建service层 

    1. @Service
    2. public class Customerservice implements Icustomer{
    3. @Autowired
    4. private ICustomerapper iCustomerapper;
    5. @Override
    6. public List queryCustomer(Customer customer) {
    7. return iCustomerapper.queryCustomer(customer);
    8. }
    9. }

    1.4.创建测试类

    效果展示

    1. //指定文件进行配置,用于生成spring上下文对象
    2. @RunWith(SpringJUnit4ClassRunner.class)
    3. @ContextConfiguration("classpath*:applicationContext*.xml")
    4. public class CustomerserviceTest {
    5. @Autowired
    6. private Customerservice customerservice;
    7. @Test
    8. public void queryCustomer() {
    9. List orders = customerservice.queryCustomer(null);
    10. orders.forEach(System.out::println);
    11. }
    12. }

    测试通过一对多的关联关系就完成了。

    1.5总结:

    一对多:一个客户对应多个订单
       private List orders=new ArrayList();

    多对一:多个订单对应一个客户(一个订单对应一个客户)
       private Customer customer;

    2.多对多(相当于两个一对多)

    多对多:相当于书籍分类,一本书可以属于多个分类,一个分类里面可以有多本书。

    比如:我们有两个被关联表查询结果

    t_category表

    t_news表

     

    t_news_category关联表 

    通过t_category表的名称查询当前信息及对应其他表详细信息

    1.  select t1.news_id,t1.title,t3.category_id,t3.category_name from t_news t1
    2. inner JOIN t_news_category t2 on t2.nid=t1.news_id
    3. inner JOIN t_category t3 on t2.cid=t3.category_id where category_name = '国际'

     运行结果

     通过t_news表的id查询当前信息及对应其他表详细信息

    1. select t1.news_id,t1.title,t3.category_id,t3.category_name from t_news t1
    2. inner JOIN t_news_category t2 on t2.nid=t1.news_id
    3.         inner JOIN t_category t3 on t2.cid=t3.category_id where news_id = 1

                     

    国际属于多个分类,一个分类里面可以有多国际。

    2.1创建model层

    t_category表

    1. //生成set,get方法
    2. @Data
    3. //表示无参构造器
    4. @NoArgsConstructor
    5. //表示有参构造器
    6. @AllArgsConstructor
    7. //生成toStirng方法
    8. @ToString
    9. public class Category {
    10. Integer categoryId;
    11. String careforyName;
    12. }

    t_news表

    1. //生成set,get方法
    2. @Data
    3. //表示无参构造器
    4. @NoArgsConstructor
    5. //表示有参构造器
    6. @AllArgsConstructor
    7. //生成toStirng方法
    8. @ToString
    9. public class New {
    10. int NewsId;
    11. String title;
    12. }
    t_news_category关联表 
    
    1. @Data
    2. //表示无参构造器
    3. @NoArgsConstructor
    4. //表示有参构造器
    5. @AllArgsConstructor
    6. //生成toStirng方法
    7. @ToString
    8. public class Newcategory {
    9. Integer id;
    10. List nid;
    11. List cid;
    12. }

    这里小编解释一下

    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层

    1. <resultMap id="NewcategoryMap" type="com.zking.mybatis.model.Newcategory">
    2. <id column="id" property="id" javaType="java.lang.Integer">id>
    3. <collection property="nid" ofType="com.zking.mybatis.model.New">
    4. <id column="news_id" property="NewsId" javaType="java.lang.Integer">id>
    5. <result column="title" property="title" javaType="java.lang.String">result>
    6. collection>
    7. <collection property="cid" ofType="com.zking.mybatis.model.Category">
    8. <id column="category_id" property="categoryId" javaType="java.lang.Integer">id>
    9. <result column="category_name" property="careforyName" javaType="java.lang.String">result>
    10. collection>
    11. resultMap>
    12. <select id="queryNewcategory" resultMap="NewcategoryMap">
    13. 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
    14. inner JOIN t_category t3 on t2.cid=t3.category_id
    15. <where>
    16. <if test="careforyName != null and careforyName != ''">
    17. and category_name #{careforyName}
    18. if>
    19. where>
    20. select>

    2.3collection与association的区别

    collection使用场景,一对多的一方(1——多),表示具体的实现类的对应关系用collection,对应关联属性用ofType

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

    2.4创建测试类

    效果展示

    测试demo 

    1. //指定文件进行配置,用于生成spring上下文对象
    2. @RunWith(SpringJUnit4ClassRunner.class)
    3. @ContextConfiguration("classpath*:applicationContext*.xml")
    4. public class CustomerserviceTest {
    5. @Test
    6. public void queryOrder() {
    7. List orders = customerservice.queryOrder(null);
    8. orders.forEach(System.out::println);
    9. }
    10. }

  • 相关阅读:
    【毕业设计】基于树莓派的指纹识别与RFID考勤系统 - 嵌入式 单片机 物联网
    人工智能与光伏发电:携手共创智能能源未来
    Linux·驱动中的异步
    数商云SCM系统订单收货场景介绍,探索采购新模式,提升汽车服务企业运营水平
    vscode篇---vscode连接docker环境
    Mac10.15.7上编译OpenJDK8u
    数字先锋 | 农业农村部大数据公共平台基座上线,天翼云擎起乡村振兴新希望!
    垃圾图像识别易语言代码
    ArcGIS 底图服务前端加载某些级别不显示问题
    Jmeter 监听器 配置
  • 原文地址:https://blog.csdn.net/Bugxiu_fu/article/details/126569082