Java:Mybatis拓展

一、动态Sql

1、if和where标签

多条件查询使用if标签,

where标签的作用:让where子句更加动态智能。

所有条件都为空时,where标签保证不会生成where子句;自动去除某些条件前面多余的and或or。

    

2、set标签

主要使用在update语句当中,用来生成set关键字,同时去掉最后多余的“,”

     
        update banner
        
            
                banner_img = #{bannerImg},
            
            
                banner_dec = #{bannerDec},
            
            
                banner_status = #{bannerStatus},
            
        
        where banner_id = #{bannerId}
    

3、choose when otherwise


  
           
  
              

相当于if(){}else{}if(){}

4、foreach标签

循环数组或集合,动态生成sql;多数用在批量删除和添加


  delete from banner where id in
  
    #{id}
  

  insert into banner values 
  
    (null,#{bannerDec}, #{bannerStatus})
  

5、sql标签和incluede标签

sql标签用来声明sql片段、include标签用来将声明的sql片段包含到某个sql语句当中

作用:代码复用、易维护。

二、Mybatis高级映射与延迟加载

1、多对一

①:级联属性映射、

②:association(关联)---修改resultMap中的配置:association即可。


  
  
  
    
    
  

③:分布查询(用的多) ----可以实现延迟加载



2、一对多

一对多的实现,通常是在一的一方中有List集合属性。

①:collection


  
  
  
    
    
  

②:分布查询----可以实现延迟加载



3、多对一延迟加载

延迟加载:需要在association标签中添加fetchType="lazy"

 

全局延迟加载:开启全局延迟加载之后,所有的sql都会支持延迟加载。


  

不想全局加载,需要单独配置fetchType="eager",针对某个特定的sql,就关闭了延迟加载机制。

三、缓存机制

1、缓存的作用:

通过减少IO的方式,来提高程序的执行效率。

2、mybatis的缓存:

将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取,不再查数据库。一方面是减少了IO。另一方面不再执行繁琐的查找算法。效率大大提升。

3、mybatis缓存包括:

①一级缓存:将查询到的数据存储到SqlSession中。

一级缓存默认是开启的。不需要做任何配置。

原理:只要使用同一个SqlSession对象执行同一条SQL语句,就会走缓存。

②二级缓存:将查询到的数据存储到SqlSessionFactory中。

二级缓存的范围是SqlSessionFactory。

使用二级缓存需要具备以下几个条件:

全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。默认就是true,无需设置。

在需要使用二级缓存的SqlMapper.xml文件中添加配置:

使用二级缓存的实体类对象必须是可序列化的,也就是必须实现java.io.Serializable接口。

SqlSession对象关闭或提交后,一级缓存中的数据才会被写入到二级缓存中,二级缓存才可用。

4、一级缓存失效

①不同的SqlSession对象。

第一次查询和第二次查询之间,手动清空了一级缓存。

②:查询条件变化了。

第一次查询和第二次查询之间,执行了增删改操作。

这个增删改和哪张表没有关系,只要有insert delete update操作,一级缓存就失效。

缓存只针对于DQL语句,也就是说缓存机制只对应select语句

5、二级缓存失效

二级缓存的失效:只要两次查询之间出现了增删改操作。二级缓存就会失效。一级缓存也会失效。

6、缓存顺序

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
如果二级缓存没有命中,再查询一级缓存;
如果一级缓存也没有命中,则查询数据库;
SqlSession 关闭之后,一级缓存中的数据会写入二级缓存。

四、分页功能

1、添加依赖

        
            com.github.pagehelper
            pagehelper
            5.3.0
        

2、在mybatis-config.xml里面添加组件


    
    

3、分页插件的使用

a> 在查询功能之前使用 PageHelper.startPage(int pageNum, int pageSize) 开启分页功能
pageNum :当前页的页码 、pageSize:每页显示的条数
b> 在查询获取 list 集合之后,使用 PageInfo pageInfo = new PageInfo<>(List list, int
navigatePages) 获取分页相关数据
list :分页之后的数据 、navigatePages:导航分页的页码数
c> 分页相关数据
PageInfo{
pageNum=8, pageSize=4, size=2, startRow=29, endRow=30, total=30, pages=8,
list=Page{count=true, pageNum=8, pageSize=4, startRow=28, endRow=32, total=30,
pages=8, reasonable=false, pageSizeZero=false},
prePage=7, nextPage=0, isFirstPage=false, isLastPage=true, hasPreviousPage=true,
hasNextPage=false, navigatePages=5, navigateFirstPage4, navigateLastPage8,
navigatepageNums=[4, 5, 6, 7, 8]
}
pageNum :当前页的页码、pageSize:每页显示的条数、size:当前页显示的真实条数、
total:总记录数、pages:总页数、prePage:上一页的页码、nextPage:下一页的页码isFirstPage/isLastPage:是否为第一页 / 最后一页、hasPreviousPage/hasNextPage:是否存在上一页 / 下一页、navigatePages:导航分页的页码数、navigatepageNums:导航分页的页码, [1,2,3,4,5]

你可能感兴趣的:(mybatis,mysql,sql)