mybatis关联关系映射

5 篇文章 0 订阅
3 篇文章 0 订阅

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

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

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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值