MyBatis:resultMap详解以及一对一association、一对多collection查询结果映射(8)

  • Mybatis的SQL语句返回结果有两种

    就简单地说,你多表查出来的其它字段数据,而你接收的实体对象不存在这个属性,而你又需要映射这个数据,简单的做法就是实体对象你多加字段属性,或者是重复id单表操作然后映射成vo的类去返回前端

    • resultType

    • 查询出的字段在相应的pojo中必须有和它相同的字段对应,或者基本数据类型

  • 适合简单查询

    • resultMap

      • 需要自定义字段,或者多表查询,一对多等关系,比resultType更强大
      • 适合复杂查询

      下面的例子是没做关联查询 只做了字段和实体属性映射操作
      MyBatis:resultMap详解以及一对一association、一对多collection查询结果映射(8)_第1张图片

ResultMap复杂对象一对一查询结果映射之association

association:映射到POJO的某个复杂类型属性,比如订单order对象里面包含user对象

像一些傻子操作是,你sql查询两个表,它们肯定是有关联关系的啊,但还是正常先根据id查询一个表,查出来数据之后根据这个表关联应一个表的id去查另一张表,查出另一张表结果后再赋值到实体对象中的另一个对象里,虽然这种操作也是普遍的,但是会造成很多冗余代码,而且后期不好维护,你不如直接联表操作,然后将结果映射到里面。

Step1:User实体对象

省略了get、set和toString()方法 自己自行加上就好了

至于数据库字段名称我这写的都是对应的,没有改变,数据大家也可以自己加上

/**
 * 用户实体
 */
public class User {

    private int id;

    /**
     * 用户名称
     */
    private String username;

    /**
     * 密码
     */
    private String userpwd;

    /**
     * 手机号
     */
    private String phone;

    /**
     * 用户头像
     */
    private String head_img;

    /**
     * 用户创建时间
     */
    private Date usercreate_time;
}

Step2:订单实体对象(包含用户实体)

/**
 * 订单实体
 */
public class VideoOrder {

    private int id;

    /**
     * 订单流水号
     */
    private String out_trade_no;

    /**
     * 订单状态(1支付-0未支付)
     */
    private int state;

    /**
     * 订单创建时间
     */
    private Date create_time;

    /**
     * 订单金额
     */
    private int total_fee;

    /**
     * 视频主键id
     */
    private int video_id;

    /**
     * 标题字段冗余
     */
    private String video_title;

    /**
     * 图片字段冗余
     */
    private String video_img;

    /**
     * 用户主键id
     */
    private int user_id;

    /**
     * 用户实体
     */
    private User user;
}

Step3:新建VideoOrderMapper

public interface VideoOrderMapper {

    /**
     * 查询全部订单关联用户信息
     * @return
     */
    List queryVideoOrderList();
}

Step4:新建VideoOrderMapper.xml文件

不要忘记之前的mybatis-config.xml配置,不然映射不到对应的dao层。不懂得可以看我之前的博文

注意:两表之间映射字段不要有相同名称。要么就起别名 不然映射可能出问题



    
        

        
        
        
        
        
        
        
        
            
            
            
            
            
            
        
    
    
    


Step5:测试

这里直接使用main函数测试,并没有做service层之类的操作

public class SqlSessionDemo {
    public static void main(String [] args) throws IOException {

        String resouce = "config/mybatis-config.xml";

        InputStream inputStream = Resources.getResourceAsStream(resouce);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        try (SqlSession sqlSession = sqlSessionFactory.openSession()){


            VideoOrderMapper videoOrderMapper = sqlSession.getMapper(VideoOrderMapper.class);

            //一对一订单查询 包含用户信息
            List videoOrderList = videoOrderMapper.queryVideoOrderList();
            System.out.println(videoOrderList);
        }

    }
}

断点调试给大家看一下结果
可以看到一条订单信息,对应一条用户信息
MyBatis:resultMap详解以及一对一association、一对多collection查询结果映射(8)_第2张图片

ResultMap复杂对象一对多查询结果映射之collection

collection:一对多查询结果映射,诸多app中,你的订单里肯定是有多个订单的,也就是一个用户对应多个订单的关系

Step1:修改用户实体 加一个订单集合实体

/**
 * 用户实体
 */
public class User {

    private int id;

    /**
     * 用户名称
     */
    private String username;

    /**
     * 密码
     */
    private String userpwd;

    /**
     * 手机号
     */
    private String phone;

    /**
     * 用户头像
     */
    private String head_img;

    /**
     * 用户创建时间
     */
    private Date usercreate_time;

    /**
     * 订单集合实体对象
     */
    private List videoOrderList;
}

Step2:新建UserMapperDao层

public interface UserMapper {

    /**
     * 查询所有用户信息以及包含所有订单
     * @return
     */
    List queryOrderUser();
}

Step3:新建UserMapper.xml文件

一定要注意映射的id 我采用了起别名的方式



    
    
        
        
        
        
        
        
        
        
            
            
            
            
            
            
            
            
        
    
    
    

Step4:测试

和上面一对一测试同样,这里直接上调试结果

可以看到查询出了所有用户信息,以及用户所持有的订单信息
MyBatis:resultMap详解以及一对一association、一对多collection查询结果映射(8)_第3张图片

总结

以上的两个例子是解释association和collecion最好的例子

  • association 映射的是一个pojo类,处理一对一的关联关系。
  • collection 映射的一个集合列表,处理的是一对多的关联关系。

模板



  
  

  
    
    
  

  
  
    
      
  

你可能感兴趣的:(MyBatis-Plus,数据库,java,mysql,mybatis)