Bootstrap

🐦【Mybatis开发指南】如何清晰的解决出现「多对一模型」和「一对多模型」的问题

前提介绍

在mybatis如何进行多对一、一对多(一对一)的多表查询呢?本章带你认识如何非常顺滑的解决!

基础使用篇

一对一

association

association通常用来映射一对一的关系,例如,有个类user,对应的实体类如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Student {
    private int id;
    private String name;
    /**
     * 学生要关联一个老师
     */
    private Teacher teacher;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Teacher {
    private int id;
    private String name;
}
Dao层进行Mapper查询操作
public interface TeacherMapper {
    Teacher getTeacher(@Param("tid") int id);
    Teacher getTeacher2(@Param("tid") int id);
}
Dao层进行Mapper.xml文件
 
        
        
        
    
    
    
    
        
        
        
            
        
    
    

  • assocication:可以指定联合的JavaBean对象

  • select:指定相关查询结果sqlid

  • property="role“:指定哪个属性是联合的对象

  • javaType:指定这个属性对象的类型

  • column="{javabean熟悉=数据库字段,Javabean属性=数据库字段}"

    
      
      
    

以上如果跨越命名空间的情况下:select:需要用namespace.selectId进行指定。

collection
@Alias("Student")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Student {
    private int id;
    private String name;
    private int tid;
}
@Alias("Teacher")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Teacher {
    private int id;
    private String name;
    /**
     * 一个老师包含多个学生
     */
    private List studentList;
}
Dao层进行Mapper查询操作
public interface TeacherMapper {
    Teacher getTeacher(@Param("tid") int id);
    Teacher getTeacher2(@Param("tid") int id);
}
Dao层进行Mapper.xml文件

        
        
        
            
            
            
        
    
    

    
        
    
    
    

注意:各个表之间尽量不要有重名字段,包括主键id,不然可能会造成数据混乱错误;

  • JavaType和ofType都是用来指定对象类型的

  • property="指的是对象内部(List类型)的属性信息字段名称"

  • JavaType是用来指定pojo中属性的类型

  • ofType指定的是映射到list集合属性中pojo的类型

  • column="{javabean熟悉=数据库字段,Javabean属性=数据库字段}"

  • select:指定相关查询结果sqlid

”特叔“使用篇

一对一映射

实体列 class Tb_blog/TbBlog
    private long blogId;
    private String blogTitle;
    private String blogContent;
    private Date createTime;
    private  String blogType;
    private String sId;

    private Tb_author author;
    List tbAuthorList;
实体类 class TbAuthor
    private long id;
    private String username;
    private String password;
    private String email;
    private String address;
    private String phone;
    private TbBlog tbBlog;
    private List tbBlogList;

resultMap标签配置

 
            
            
            
            
            
           
             
            
           
          

  

在sql加入别名alias与field属性字段一样,也可以自动注入进入。

association标签配置


            
            
            
            
            
            
            
                
                
                
                
                
            

    

collection标签配置

mapper接口定义

AuthorMapper.interface
//!通过id 和映射文件中 association的column属性的值sId关联 来嵌套查询     嵌套查询的第二条sql语句都要写条件来关联第一张表
List selectAuthorandBlogAssociation(int id); 
BlogMapper.interface
List selectBlogAndAuthorAssociation();
AuthorMapper.xml

 
        
        
        
        
        
        
        
        
    
    
BlogMapper.xml
    
总结

多表查询一对一映射

association标签

不嵌套 property=当前实体类中的第二种表的属性名 javaType=返回的实体类嵌套 多加两个属性 column=当前实体类 关联的 第二张表 的外键字段 select=“第二条查询语句” (必须给第二条sql语句写参数限制 不然会获得所有值)

多表查询一对多

collection标签

不嵌套 property=当前实体类中的第二种表的属性名 ofType=返回是实体类property=当前实体类中的第二种表的属性名 javaType=返回的实体类嵌套 多加两个属性 column=当前实体类 关联的 第二张表 的外键字段 select=“第二条查询语句” (必须给第二条sql语句写参数限制 不然会获得所有值)2.多表查询一对多collection标签

不嵌套 property=当前实体类中的第二种表的属性名 ofType=返回是实体类嵌套 多加一个属性 column=当前实体类 关联的 第二张表 的外键字段 select=“第二条查询语句” (必须给第二条sql语句写参数限制 不然会获得所有值) [ofType = collection一对多嵌套查询 嵌套查询所有结果 不需写返回类型因为 select已经映射]