即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

Mybatis(2、关系映射一对一、一对多、多对多)

编程语言 www1056481167 22℃ 0评论
本文目录
[隐藏]

本章为第二章节。主要介绍关联关系的映射。一对一,一对多,多对多的配置使用。resultType、resultMap,自定义resultMap、association、collection……的简单使用.

mybatis查询关系映射对应的配置:

表的关联关系:

表:user、orders、items、orderdetail

1.一对一映射

需求:查询订单信息,关联查询创建订单的用户的信息

主表:订单表,查询的关联表:用户表

1.1.ResultType结果显示

1.1.1.sql语句

SELECT
 orders.*, 
 USER .username,
 USER .sex,
 USER .address
FROM
 orders,
 USER
WHERE
 orders.user_id = USER .id


1.1.2.创建pojo

将上边的查询结果映射到pojo中

//通过此类映射订单和用户查询的结果,让此类继承包括 字段较多的pojo类
public class OrdersCustom extends Orders{
 //添加用户属性
 /*USER.username,
   USER.sex,
   USER.address */
 private String username;
 private String sex;
 private String address;

1.1.3.mapper.xml

1.1.4.mapper.java

//查询订单关联查询用户信息
public List findOrdersUser()throws Exception;

1.2.resultMap返回结果显示

1.1.1.sql语句

和resultType一样。

1.2.2.需要在Orders类中添加user属性

使用resultMap映射的思路:使用resultMap将查询结果中的订单信息映射到Orders对象中,在Orders类中添加User属性,将关联查询来的用户信息映射到orders对象中的user属性中。


public class Orders {
    private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    //用户信息
    private User user;

1.2.3.Mapper.xml以及statement

         
 
  
  
  
  
  
  
  
                
  
   
   
   
   
  
 
        
        

1.2.4.Mapper.java

//查询订单关联查询用户使用resultMap
public List findOrdersUserResultMap() throws Exception;

1.2.5.ResultType和resultMap实现一对一查询小结

实现一对一:

      resulType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。

如果没有查询到结果的特殊要求建议使用resultType

    resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果又特殊的要求,使用resultMap即可完成将关联查询映射到pojo的二属性中。

resultMap可以实现延迟加载,resultType无法实现延迟加载。

2.一对多映射

需求:查询订单及订单明细的信息

主表:订单表

关联表:订单明细表


2.1.Sql语句

SELECT 
  orders.*, 
  USER .username,
 USER .sex,
 USER .address,
 orderdetail.id orderdetail_id,
 orderdetail.items_id,
 orderdetail.items_num,
 orderdetail.orders_id
FROM
 orders,
 USER,
 orderdetail
WHERE
 orders.user_id = USER .id
AND orderdetail.orders_id = orders.id



使用resultType将上边的结果映射到pojo中,订单信息就是重复的。



要求:

对orders映射不能出现重复的记录

在orders.java类中添加List orderDetails属性

最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails中





映射成的orders记录数为两条(orders信息不重复)

每个orders中的orderDetails属性存储了该 订单所对应的订单明细。


2.2.在orders中添加list订单明细属性

public class Orders {
    private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    //用户信息
    private User user;
    //订单明细
    private List orderdetails;

2.3.Mapper.xml

        
 

2.4.ResultMap定义


 
  
  
  
  
  
  
   
    
    
    
    
    
   
 


2.5.Mapper.java

//查询订单(关联用户)
public List findOrdersAndOrderDetailResultMap() throws Exception;

2.6.小结

mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。

使用resultType实现:

将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。

3.多对多映射

需求:查询用户及用户购买商品信息。

主表:用户表

查询的关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表是 orders,ordersdetail,items

3.1.sql语句

SELECT
 orders.*,
  USER .username,
 USER .sex,
 USER .address,
 orderdetail.id orderdetail_id,
 orderdetail.items_id,
 orderdetail.items_num,
 orderdetail.orders_id,
 items. NAME items_name,
 items.detail items_detail,
 items.price items_price
FROM
 orders,
 USER,
 orderdetail,
 items
WHERE orders.user_id = USER .id
AND orderdetail.orders_id = orders.id
AND orderdetail.items_id = items.id


将用过户信息映射到user中。

在user类中添加订单列表属性Listorderslist,将用户创建的订单映射到orderlist在Orders中添加明细列表属性List orderdetails,将订单的明细映射到orderdetails在OrderDetail中添加items属性,将订单明细所对应的商品映射到items。

2.3.Mapper.xml

3.3.ResultMap的定义

        
 
  
  
  
  
  
  
   
    
    
   
   
   
    
     
       
      
      
      
     
       
        
        
        
        
       
     
   
 

2.5.Mapper.java

// 查询用户购买商品信息
public List findUserAndItemsResultMap() throws Exception;

3.5.ResultType,resultMap,association,collection

resultType

作用:

         将查询结果按照sql列名pojo属性名一致性映射到pojo中。

场合:

         常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

resultMap

         使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。

association:

作用:

         将关联查询信息映射到一个pojo对象中。

场合:

         为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。

         使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。

collection

作用:

         将关联查询信息映射到一个list集合中。

场合:

         为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。

         如果使用resultType无法将查询结果映射到list集合中。

转载请注明:CodingBlog » Mybatis(2、关系映射一对一、一对多、多对多)

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情