• 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. }

  • 相关阅读:
    美国太阳能及电池存储设施运营商【 MN8 Energy】申请纳斯达克IPO上市
    JVM内存模型(JMM)
    eshop(商城管理系统)MySQL源码
    机器学习中岭回归、LASSO回归和弹性网络与损失函数
    【Azure 存储服务】访问Azure Blob File遇见400-Condition Headers not support错误的解决之路
    【UE5.3】笔记4-自定义材质蓝图
    Multitor:一款带有负载均衡功能的多Tor实例创建工具
    C++类和对象(上)
    wordpress搬家后,更改固定链接404文章无法打开,找不到网页与解决办法
    Ubuntu安装freeSwitch
  • 原文地址:https://blog.csdn.net/Bugxiu_fu/article/details/126569082