• Mybatis基础学习(四)—关系映射


    一、模型分析

    image

    user和orders

    user---->orders

    一个用户可以创建多个订单,一对多。

    orders--->user

    一个订单只由一个用户创建,一对一。

    orders和orderdetail

    orders--->orderdetail

    一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系。

    orderdetail---> orders

    一个订单明细只能包括在一个订单中,一对一。

    orderdetail和items

    orderdetail--->itesms

    一个订单明细只对应一个商品信息,一对一。

    items---> orderdetail

    一个商品可以包括在多个订单明细 ,一对多。

    二、一对一查询

    1.使用resultType

         复杂查询时,单表对应的po类已不能满足输出结果集的映射。所以要根据需求建立一个扩展类来作为resultType的类型。

    User.java

    public class User implements Serializable{
    
    	private int id;
    
    	private String username;// 用户姓名
    
    	private String sex;// 性别
    
    	private Date birthday;// 生日
    
    	private String address;// 地址
    
    	public User(){
    	}
    
    	public User(String username,String sex,Date birthday,String address){
    		this.username = username;
    		this.sex = sex;
    		this.birthday = birthday;
    		this.address = address;
    	}
    
    	//get、set.....
    }

    Orders.java

    public class Orders implements Serializable{
    	
        private Integer id;
    
        private Integer userId;
    
        private String number;
    
        private Date createtime;
    
        private String note;
     
        //get、set.....
     } 

    我们要执行如下语句:

    image

    (1)编写PO类

    public class OrdersExt extends Orders{
    
    	private String username;
    
    	private String sex;
    
    	private String address;
    
    	//get、set......
    }

    (2)编写mapper接口 

    public interface OrdersMapper{
    
    	public List<OrdersExt> findOrderAndUser();
    }

    (3)编写映射文件

    image

    Test.java

    	@Test
    	public void testFindUsersByNameAndSex(){
    		
    		SqlSession sqlSession = sqlSessionFactory.openSession();
    		
    		OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
    		
    		List<OrdersExt> list = mapper.findOrderAndUser();
    		
    		for(OrdersExt orderExt : list){
    			
    			System.out.println(orderExt);
    		}
    		
    		sqlSession.close();
    	}

    2.使用resultMap

    (1)修改PO类,添加User对象

    image

    (2)编写mapper接口

    image

    (3)编写映射文件

    image

    image

    一对一查询

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

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

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

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

    三、一对多映射

    (1)需求

         查询订单信息及订单明细和用户信息。

    (2)Sql语句

    确定主查询表: 订单表

    确定关联查询表: 订单明细表、用户表

    在一对一查询基础上添加订单明细关联表即可。

    image

    (3)修改PO类

    image

    (4)编写mapper接口

    image

    (5)编写mapper配置文件

    image

    collection: 定义一个一对多关系。

    ofType: 指定该集合参数所映射的类型。

    四、多对多

    (1)需求

    查询用户信息及用户购买的商品信息,要求将关联信息映射到主pojo的pojo属性中。

    (2)Sql语句

    查询主表: user

    查询关联表: orders、orderdetail、items

    image

    (3)映射思路

    将用户信息映射到user中。

    在user类中添加订单列表属性List<Orders> orders,将用户创建的订单映射到orders。

    在Orders中添加订单明细列表属性List<Orderdetail> detailList,将订单的明细映射到detailList。

    在Orderdetail中添加Items属性,将订单明细所对应的商品映射到Items。

    (4)修改PO类

    image

    (5)编写mapper接口

    image

    (6)编写mapper配置文件

    image

    image

  • 相关阅读:
    解析HTTP协议六种请求方法
    金蝶
    普元
    中间件
    [CTSC2008] 网络管理
    【Uva 10498】满意值
    【SPOJ839】最优标号
    bzoj2879 [Noi2012]美食节
    bzoj3144 [Hnoi2013]切糕
    bzoj3112 [Zjoi2013]防守战线
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5641502.html
Copyright © 2020-2023  润新知