MyBatis知识点详解

 一:概述

    一、概念

       1. MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。

       2. MyBatis 可以使用XML或注解将接口和Java的POJO映射成数据库中的记录。

    二、特点

       1. 优点

           1. 简单易学切灵活:自身很小,不会对应用程序或者数据库的现有设计强加任何影响。

           2. 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。

       2. 缺点

           1. 编写SQL语句时工作量很大,尤其是字段多、关联表多时。

           2. SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。

           3. 二级缓存机制不佳。

    三、架构

       1. 功能架构

           1. API接口层:通过提供给外部使用的接口AP操作数据库I,接收到调用请求就会调用数据处理层来完成具体的数据处理。

           2. 数据处理层:根据请求完成数据库操作,包括SQL查找、SQL解析、SQL执行和执行结果映射处理等。

           3. 基础支撑层:提供数据处理层基础功能支持,包括连接管理、事务管理、配置加载和缓存处理等。

               

       2. 框架架构

           1. 加载配置:将SQL的配置信息(配置文件和注解)加载成为一个个MappedStatement对象并存储在内存。

           2. SQL解析:当API接口层接收到调用请求时,Mybatis会根据SQL的ID和传入参数对象找到并解析对应的MappedStatement,得到可执行SQL。

           3. SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。

           4. 结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

               

    四、下载安装

       1. 最新版本

           

       2. 所有版本

           

       3. 官方文档

           

二:全局配置文件

       

    一、<properties>:属性配置文件

       1. 通过properties子元素(environment中引用)配置

          

       2. 通过properties的属性配置

          

       3. 通过属性参数传递配置

          

    二、<settings>:设置运行时行为

           

    三、 <typeAliases>:类型别名,减少全限定类名的冗余

       1. 单个类:使用别名代替全限定类路径

           1. 配置文件

              

           2. 注解

              

       2. 一个包:自动搜索指定包下的Java bean

           

    四、<typeHandlers>:类型处理器

       1. 定义枚举类型

          

       2. 实现TypeHandler接口

           

       3. 自定义类型处理器

           

     五、<environments>:运行环境

           

           1. <transactionManager>:事务管理器

               1. JDBC:依赖于从数据源得到的连接来管理事务作用域。

               2. MANAGED:不提交或回滚。

           2. <dataSource>:数据源

               1. UNPOOLED:每次被请求时打开和关闭连接

               2. POOLED:请求从池中连接

               3. JNDI:请求从容器中连接

    六、<databaseIdProvider>:多数据库支持

       1. 配置多个数据库

          

       2. 操作标签中使用

           

   七、<mappers>:注册SQL映射文件

        1. 使用相对于类路径的资源引用

           

        2. 使用完全限定资源定位符

           

        3. 使用映射器接口的全限定类路径

           

             

        4. 批量注册

           

二、SQL映射文件

    一、定义SQL映射关系

       1. resultType和resultMap的区别

            1. resultType(自动结果集映射):只有查询出来的列名和pojo中的属性名一致,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性,该列才可以映射成功

            2. resultMap(自定义结果集映射):可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中,是mybatis最强大的元素。

              3. resultType和resultMap不能同时存在

        2. resultMap的使用

           

            1. 配置映射关系

               

            2. 配置表主键和POJO的主键属性对应

                

            3. 配置表其他列和POJO的其他属性

                

            4. 配置关联关系

                1. 关联对象

                   

                2. 关联集合

                  

        3. 查询

            1. 普通查询

               

            2. 关联查询

                1. 关联对象(多对一)

                     

                    1. 多表联查

                           

                           

                            

                    2. 延迟加载(不开启就是分步查询)

                       

                        

                        

                           

                            

                           

                2. 关联集合(一对多)

                   

                    1. 多表联查

                       

                           

                           

                           

                    2. 延迟加载(不开启就是分步查询)

                       

                        

                           

                            

                            

                            

    二、定义SQL语句

       1. 增删改

           1. 增

               

                 

           2. 删

               

                 

                 

            3. 改

               

                       

                       

         2. 获取自增主键

            1. MySQL:增删改标签增加属性

               

            2. Oracle:将查询到的id封装后传递给增删改语句

               

       3. 返回值

           1. 返回list集合

              

                

                 

                 

           2. 返回map集合

               1. 返回一条

                  

                   

                      

                    

               2. 返回多条

                  

                      

                      

                       

    三、参数处理

       1. 单个参数:不做任何处理

          

          

       2. 多个参数:将多个参数封装成Map,通过索引或param1...paramN获取

          

             

             

              

       3. 命名参数:将多个参数封装成Map,使用@Param指定key

           

             

             

             

       4. POJO:业务对象模型

          

           

            

            

       5. Map:将多个参数封装成map  

          

            

            

             

        6. #{ } 和 ${ }的区别

           1. #{ }:预编译处理,防止SQL注入,安全性高。

           2. ${ }:字符串替换,拼接或替换原生JDBC不支持占位符的地方(例如按照年份分表)

四:Java API(运行原理)

    一、SqlSessionFactoryBuilder

       1. 作用:从不同的资源中创建一个 SqlSessionFactory 实例

       2. 创建SqlSessionFactory 的过程(DefaultSqlSessionFactory类

           

            1. 通过数据源获取数据库连接,并创建Executor对象以及DefaultSqlSession对象

               

            2. 通过用户提供数据库连接对象,并创建相应的Executor对象以及DefaultSqlSession对象

                 
 

       3. 使用

           1. 通过全局配置文件创建

              

           2. 通过自定义创建

              

    二、SqlSessionFactory

       

       1. 作用:创建 SqlSession 实例

        2. 创建SqlSession的过程(DefaultSqlSession类)

            

            1. DefaultSqlSession:SqlSession接口的主要实现类,使用策略模式将数据库相关的操作全部封装到了Executor接口并通过executor字段选择不同的Executor实现类。

               

        3. 使用

           

    三、SqlSession

        1. 作用:数据库操作

        2. 创建Mapper的过程

        

                  根据sqlsession返回一个Mapper代理对象

                 

                 

        3. 使用

           

     四、crud的过程

            

       Executor接口:封装数据库操作的基本方法

       

           1. BaseExecutor:Executor接口的抽象实现类,使用模板方法模式,提供了缓存管理和事物管理的基本功能并定义doUpdate、doQuery、doQueryCursor、doFlushStatement方法

                
 
           2. SimpleExecutor:每一次创建新的Statement连接对象(执行一次SQL)

              

           3. ReuseExecutor:从StatementMap中获取Statement对象(执行多次SQL)

              1. ReuseExecutor通过StatementMap字段缓存使用过的Statement对象,key是sql语句,value是对应的Statement对象。

              2. 和SimpleExecutor的区别是在prepareStatement方法会尝试重用StatementMap中的缓存的Statement对象。

                

           4. BatchExecutor:批量操作sql语句的功能(一级缓存机制)

               

    五、MybatisUtil

          

                

                 

                  

    六、mybatis的四大对象

            1. ParameterHandler:处理SQL的参数对象

            2. ResultSetHandler:处理SQL的返回结果集

            3. StatementHandler:数据库的处理对象,用于执行SQL语句

            4. Executor:MyBatis的执行器,用于执行增删改查操作

五:动态SQL

    一、if + where:条件判断

            

               

              

              

    二、if + set:更新

           

            

             

    三、choose:多条件选择(相当于switch)

            

              

               

               

    四、trim:替换和添加

        1. 属性作用

            prefix:前缀

            suffix:后缀

            prefixOverrides:忽略第一个

            suffixOverrides:忽略最后一个

        2. 替换where:忽略where后直接跟的And或Or

           

            

              

              

        3. 替换set:忽略最后一个逗号

           

           

           

    五、foreach:遍历,使用在IN语句后

        1. 属性作用

            item:表示集合中每一个元素进行迭代时的别名

            index:指定索引名

            open:表示以什么开始

            separator:表示在每次进行迭代之间以什么符号作为分隔符

            close:表示以什么结束

        2. 遍历

            1. 遍历数组

                1. 不用注解

                   

                      

                      

                       

                2. 使用注解

                   

                      

                       

                       

            2. 遍历集合

                1. 不用注解

                   

                      

                     

                     

                2. 使用注解

                   

                      

                     

                     

        3. 批量插入

           

             

              

    六、内置参数

        1. _parameter:代表整个参数

           1. 单个参数:_parameter就是这个参数

           2. 多个参数:_parameter就是代表封装参数的map                           

        2. _databaseId:如果配置了databaseIdProvider标签, _databaseId就是代表当前数据库的别名

      

         

六:缓存

    一、一级缓存(SqlSession缓存)

       1. 工作流程

            1. 查询一级缓存

                1. 有:直接返回缓存中的数据

                2. 没有:去数据库查询信息输出,同时保存到一级缓存中

 

       2. 特点

           1. 一级缓存是默认打开的
           2. 一级缓存的生命周期是从SqlSession创建到SqlSession关闭
           3. 一级缓存读取数据的依据是Sql的id和Sql语句
           4. 增删改都会清空一级缓存,无论是否提交

    二、二级缓存(namespace缓存)

       1. 开启

           1. 开启全局二级缓存

                

           2. POJO类进行序列化

              

           3. 开启namespace二级缓存
              

               1. eviction:缓存回收策略

                   1. LRU(Least Recently Used):最近最少使用策略,最长时间不用的对象。

                   2. FIFO(First In First Out):先进先出策略,按对象进入缓存的顺序来移除他们

                   3. SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象

                   4. WEAK:弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。                

               2. flushInterval:刷新间隔时间

               3. size:引用数目

               4. readOnly:只读

        2. 关闭
            1. 全部关闭:设置为false或者删除

               

            2. 局部关闭:select标签的useCache属性值设置为false
               

             3. 刷新缓存:select标签的flushCache属性设置为true

                 

        3. 特点
            1. 二级缓存是为了解决相同查询重复出现的问题
            2. 增删改都会清空二级缓存,但只将key对应的value置为null
            3. 二级缓存进行select查询的条件
                1. 缓存中不存在key
                2. 存在key,但是value值为null                 
                             
         4. 使用原则
             1. 多个namespace不要操作同一张表
             2. 不要在关联关系表上执行增删改操作
             3. 查询多于修改时使用二级缓存
    

    三、第三方缓存

       1. ehcache

           1. 下载jar包并导入

                  

               1. 下载ehcache源码包

                      或者maven配置

                     

               2. 下载其依赖的日志包sl4j

                    1. 下载slf4j-api.jar包

                        或者maven配置

                       

                    2. 下载slf4j-log4j12.jar包

                        或者maven配置

                       

               4. 下载mybatis和ehcache的适配包

                   或者maven配置

                  

           2. 编写ehcache.xml配置文件

              

           3. mapper.xml中使用自定义缓存

              

                  如果共享缓存

                

原文地址:https://www.cnblogs.com/mh20131118/p/12261604.html