Mybatis入门篇之结果映射,你射准了吗?

持续原创输出,点击上方蓝字关注我吧

image

目录

  • 前言
  • 什么是结果映射?
  • 如何映射?
    • 别名映射
    • 驼峰映射
      • 配置文件开启驼峰映射
      • 配置类中开启驼峰映射
    • resultMap映射
    • 总结
  • 高级结果映射
    • 关联(association)
      • 例子
      • 关联的嵌套 Select 查询
      • 关联的嵌套结果映射
      • 总结
    • 集合collection
      • 集合的嵌套 Select 查询
      • 集合的嵌套结果映射
  • 总结

前言

  • 上一篇文章介绍了Mybatis基础的CRUD操作、常用的标签、属性等内容,如果对部分不熟悉的朋友可以看Mybatis入门之基本操作。
  • 本篇文章继续讲解Mybatis的结果映射的内容,想要在企业开发中灵活的使用Mybatis,这部分的内容是必须要精通的。

什么是结果映射?

  • 简单的来说就是一条SQL查询语句返回的字段如何与Java实体类中的属性相对应。
  • 如下一条SQL语句,查询患者的用户id,科室id,主治医生id:
  
  • Java实体类PatientInfo如下:
@Data
public class PatientInfo{
  private String userId;
  private String deptId;
  private String docId;
}
  • 程序员写这条SQL的目的就是想查询出来的user_id,dept_id,doc_id分别赋值给实体类中的userId,deptId,docId。这就是简单的结果映射。

如何映射?

  • Myabtis中的结果映射有很多种方式,下面会逐一介绍。

别名映射

  • 这个简单,保持查询的SQL返回的字段和Java实体类一样即可,比如上面例子的SQL可以写成:

  • 这样就能和实体类中的属性映射成功了。

驼峰映射

  • Mybatis提供了驼峰命名映射的方式,比如数据库中的user_id这个字段,能够自动映射到userId属性。那么此时的查询的SQL变成如下即可:

  • 如何开启呢?与SpringBoot整合后开启其实很简单,有两种方式,一个是配置文件中开启,一个是配置类开启。

配置文件开启驼峰映射

  • 只需要在application.properties文件中添加如下一行代码即可:
mybatis.configuration.map-underscore-to-camel-case=true

配置类中开启驼峰映射【简单了解,后续源码章节着重介绍】

  • 这种方式需要你对源码有一定的了解,上一篇入门教程中有提到,Mybatis与Springboot整合后适配了一个starter,那么肯定会有自动配置类,Mybatis的自动配置类是MybatisAutoConfiguration,其中有这么一段代码,如下:
    image
  • @ConditionalOnMissingBean这个注解的意思就是当IOC容器中没有SqlSessionFactory这个Bean对象这个配置才会生效;applyConfiguration(factory)这行代码就是创建一个org.apache.ibatis.session.Configuration赋值给SqlSessionFactoryBean。源码分析到这,应该很清楚了,无非就是自己在容器中创建一个SqlSessionFactory,然后设置属性即可,如下代码:
    @Bean("sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //设置数据源
        sqlSessionFactoryBean.setDataSource(dataSource);
        //设置xml文件的位置
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATOIN));
        //创建Configuration
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        // 开启驼峰命名映射
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setDefaultFetchSize(100);
        configuration.setDefaultStatementTimeout(30);
        sqlSessionFactoryBean.setConfiguration(configuration);
        //将typehandler注册到mybatis
        sqlSessionFactoryBean.setTypeHandlers(typeHandlers());
        return sqlSessionFactoryBean.getObject();
    }
  • 注意:如果对SqlSessionFactory没有特殊定制,不介意重写,因为这会自动覆盖自动配置类中的配置。

resultMap映射

  • 什么是resultMap?简单的说就是一个类似Map的结构,将数据库中的字段和JavaBean中的属性字段对应起来,这样就能做到一一映射了。
  • 上述的例子使用resultMap又会怎么写呢?如下:



  
  
  




  • 其实很简单,就是创建一个,然后 SELECT * FROM user WHERE id = #{id}

    • 就是这么简单,两个select语句,一个用来加载员工,一个用来加载部门。
    • 这种方式虽然很简单,但在大型数据集或大型数据表上表现不佳。这个问题被称为N+1 查询问题。 概括地讲,N+1 查询问题是这样子的:
      • 你执行了一个单独的 SQL 语句来获取结果的一个列表(就是+1)。
      • 对列表返回的每条记录,你执行一个 select 查询语句来为每条记录加载详细信息(就是N)。
    • 这个问题会导致成百上千的 SQL 语句被执行。有时候,我们不希望产生这样的后果。

    关联的嵌套结果映射【重点】

    • 标签中还可以直接嵌套结果映射,此时的Mybatis的查询如下:
    
    
        
        
        
        
      
        
        
        
        
            
            
        
    
    
    
     
    

    总结

    • 至此有一个类型的关联已经完成了,学会一个使用即能完成。
    • 注意: 关联的嵌套 Select 查询不建议使用,N+1是个重大问题,虽说Mybatis提供了延迟加载的功能,但是仍然不建议使用,企业开发中也是不常用的。

    集合collection

    • 集合,顾名思义,就是处理有很多个类型的关联。
    • 其中的属性和association中的属性类似,不再重复了。
    • 比如这样一个例子:查询一个部门中的全部员工,查询SQL如何写呢?如下:
    select * from department d left join user u on u.department_id=d.id;
    
    • 此时的User实体类如下:
    @Data
    public class User {
     private Integer id;
     private String username;
     private String password;
     private Integer age;
     private Integer deptId; 
    }
    
    • 此时的Department实体类如下:
    @Data
    public class Department {
     private Integer id;
     private String name;
     private List users;
    }
    
    • association类似,同样有两种方式,我们可以使用嵌套 Select 查询,或基于连接的嵌套结果映射集合。

    集合的嵌套 Select 查询【可以忽略】

    • 不太重要,查询如下:
    
      
            
            
      
      
    
    
    
    
    
    
    • 注意:这里出现了一个不同于association的属性ofType,这个属性非常重要,它用来将 JavaBean(或字段)属性的类型和集合存储的类型区分开来。

    集合的嵌套结果映射【重点】

    • 现在你可能已经猜到了集合的嵌套结果映射是怎样工作的——除了新增的 ofType 属性,它和关联的完全相同。
    • 此时的Mybatis查询如下:
    
    
    
      
            
            
      
      
    
    
    
    
        
       
       
       
    
    
    
    

    总结

    • 至此Mybatis第二弹之结果映射已经写完了,如果觉得作者写的不错,给个在看关注一波,后续还有更多精彩内容推出,请关注WX公众号【码猿技术专栏】。

你可能感兴趣的:(Mybatis入门篇之结果映射,你射准了吗?)