JavaEE高级-MyBatis学习笔记

1、MyBatis简介
  - MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
  - MyBatis 避免了几乎全部的 JDBC 代码和手动设置参数以及获取结果集。
  - MyBatis可使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old JavaObjects,普通的Java对象)映射成数据库中的记录.
  - MyBatis历史:
    > 原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下, iBatis3.x正式改名为MyBatis ,
     代码于2013年11月迁移到Github(下载地址见后)。
    > iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
 
为何要使用MyBatis?
  - MyBatis是一个半自动化的持久化层框架。
  - JDBC:
    > SQL夹在Java代码块里,耦合度高致使硬编码内伤
    > 维护不易且实际开发需求中sql是有变化,频繁修改的状况多见
  - Hibernate和JPA:
    > 长难复杂SQL,对于Hibernate而言处理也不容易
    > 内部自动生产的SQL,不容易作特殊优化。
    > 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。致使数据库性能降低。 
  - 对开发人员而言,核心sql仍是须要本身优化
  - sql和java编码分开,功能边界清晰,一个专一业务、一个专一数据。
 
去哪里找MyBatis? 
  https://github.com/mybatis/mybatis-3/
 
 
2、MyBatis-HelloWorld
  - HelloWorld简单版
    > 建立一张测试表
    > 建立对应的javaBean
    > 建立mybatis配置文件,sql映射文件
    > 测试
 
MyBatis操做数据库
  一、建立MyBatis全局配置文件
    - MyBatis 的全局配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息、如数据库链接池信息等。指导着MyBatis进行工做。咱们能够参照官方文件的配置示例。 
  二、建立SQL映射文件
    - 映射文件的做用就至关因而定义Dao接口的实现类如何工做。这也是咱们使用MyBatis时编写的最多的文件。
  - 测试:
    > 一、根据全局配置文件,利用SqlSessionFactoryBuilder建立SqlSessionFactory
        

    > 二、使用SqlSessionFactory获取sqlSession对象。一个SqlSession对象表明和数据库的一次会话。java

        

    > 三、使用SqlSession根据方法id进行操做mysql

        

 
HelloWorld-接口式编程
  - 建立一个Dao接口
  - 修改Mapper文件
  - 测试:
    > 使用SqlSession获取映射器进行操做
      

 

SqlSession
  - SqlSession 的实例不是线程安全的,所以是不能被共享的。 
  - SqlSession每次使用完成后须要正确关闭,这个关闭操做是必须的
  - SqlSession能够直接调用方法的id进行数据库操做,可是咱们通常仍是推荐使用SqlSession获取到Dao接口的代理类,执行代理对象的方法,能够更安全的进行类型检查操做
 
 
3、MyBatis-全局配置文件
  - MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。文档的顶层结构以下: 
    > configuration 配置:
      >> properties 属性
      >> settings 设置
      >> typeAliases 类型命名
      >> typeHandlers 类型处理器
      >> objectFactory 对象工厂
      >> plugins 插件
      >> environments 环境
          environment 环境变量
              transactionManager 事务管理器
              dataSource 数据源
      >> databaseIdProvider 数据库厂商标识
      >> mappers 映射器
  - 在Eclipse中引入XML的dtd约束文件,方便编写XML的时候有提示
 
properties属性
   

  

  - 若是属性在不仅一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载: git

    > 在 properties 元素体内指定的属性首先被读取。github

    > 而后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。spring

    > 最后读取做为方法参数传递的属性,并覆盖已读取的同名属性。sql

 

settings设置
  - 这是 MyBatis 中极为重要的调整设置,它们会改变MyBatis 的运行时行为。
    

    

 

 
typeAliases别名处理器
  - 类型别名是为 Java 类型设置一个短的名字,能够方便咱们引用某个类。
    

  - 类不少的状况下,能够批量设置别名这个包下的每个类建立一个默认的别名,就是简单类名小写。数据库

    

  - 也可使用@Alias注解为其指定一个别名express

    

  - 值得注意的是,MyBatis已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,咱们在起别名的时候千万不要占用已有的别名。apache

    

 

 
typeHandlers类型处理器
  - 不管是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,仍是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
    

 

日期类型的处理
  - 日期和时间的处理,JDK1.8之前一直是个头疼的问题。咱们一般使用JSR310规范领导者StephenColebourne建立的Joda-Time来操做。1.8已经实现所有的JSR310规范了。
  - 日期时间处理上,咱们可使用MyBatis基于JSR310(Date and Time API)编写的各类日期时间类型处理器。
  - MyBatis3.4之前的版本须要咱们手动注册这些处理器,之后的版本都是自动注册的
    

 

 
自定义类型处理器
  - 咱们能够重写类型处理器或建立本身的类型处理器来处理不支持的或非标准的类型。 
  - 步骤:
    1)、实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler
    2)、指定其映射某个JDBC类型(可选操做)
    3)、在mybatis全局配置文件中注册
 
plugins插件
  - 插件是MyBatis提供的一个很是强大的机制,咱们能够经过插件来修改MyBatis的一些核心行为。插件经过动态代理机制,能够介入四大对象的任何一个方法的执行。后面会有专门的章节咱们来介绍mybatis运行原理以及插件
  - Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)
  - ParameterHandler (getParameterObject, setParameters) 
  - ResultSetHandler (handleResultSets, handleOutputParameters) 
  - StatementHandler (prepare, parameterize, batch, update, query)
 
environments环境
  - MyBatis能够配置多种环境,好比开发、测试和生产环境须要有不一样的配置。 
  - 每种环境使用一个environment标签进行配置并指定惟一标识符
  - 能够经过environments标签中的default属性指定一个环境的标识符来快速的切换环境
  - environment-指定具体环境:
    > id:指定当前环境的惟一标识
    > transactionManager、和dataSource都必须有
      

 

transactionManager
  - type: JDBC | MANAGED | 自定义:
    > JDBC:使用了 JDBC 的提交和回滚设置,依赖于从数据源获得的链接来管理事务范围。JdbcTransactionFactory
    > MANAGED:不提交或回滚一个链接、让容器来管理事务的整个生命周期(好比 JEE 应用服务器的上下文)。 ManagedTransactionFactory
    > 自定义:实现TransactionFactory接口,type=全类名/别名
 
dataSource
  - type: UNPOOLED | POOLED | JNDI | 自定义
    > UNPOOLED:不使用链接池,UnpooledDataSourceFactory
    > POOLED:使用链接池, PooledDataSourceFactory
    > JNDI: 在EJB 或应用服务器这类容器中查找指定的数据源
    > 自定义:实现DataSourceFactory接口,定义数据源的获取方式。
  - 实际开发中咱们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置
 
databaseIdProvider环境
  - MyBatis 能够根据不一样的数据库厂商执行不一样的语句。
    

  - Type: DB_VENDOR编程

    > 使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识。也能够实现DatabaseIdProvider接口来自定义。

  - Property-name:数据库厂商标识

  - Property-value:为标识起一个别名,方便SQL语句使用databaseId属性引用

    

  - DB_VENDOR

    > 会经过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。因为一般状况下这个字符串都很是长并且相同产品的不一样版本会返回不一样的值,因此最好经过设置属性别名来使其变短 

  - MyBatis匹配规则以下:

    一、若是没有配置databaseIdProvider标签,那么databaseId=null

    二、若是配置了databaseIdProvider标签,使用标签配置的name去匹配数据库信息,匹配上设置databaseId=配置指定的值,不然依旧为null
    三、若是databaseId不为null,他只会找到配置databaseId的sql语句
    四、MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库databaseId 属性的全部语句。若是同时找到带有 databaseId 和不带databaseId 的相同语句,则后者会被舍弃。
 
mapper映射
  - mapper逐个注册SQL映射文件
    

  - 或者使用批量注册: 这种方式要求SQL映射文件名必须和接口名相同而且在同一目录下

    

 

 

4、MyBatis-映射文件
  - 映射文件指导着MyBatis如何进行数据库增删改查,有着很是重要的意义;
    > cache –命名空间的二级缓存配置
    > cache-ref – 其余命名空间缓存配置的引用。
    > resultMap – 自定义结果集映射
    > parameterMap – 已废弃!老式风格的参数映射
    > sql –抽取可重用语句块。
    > insert – 映射插入语句
    > update – 映射更新语句
    > delete – 映射删除语句
    > select – 映射查询语句
    

  - 主键生成方式

    > 若数据库支持自动生成主键的字段(好比 MySQL和 SQL Server),则能够设置useGeneratedKeys=”true”,而后再把keyProperty 设置到目标属性上。

    > 而对于不支持自增型主键的数据库(例如Oracle),则可使用 selectKey 子元素:selectKey 元素将会首先运行,id 会被设置,而后插入语句会被调用

  - selectKey

    

  - 参数(Parameters)传递

    > 单个参数– 能够接受基本类型,对象类型,集合类型的值。这种状况MyBatis可直接使用这个参数,不须要通过任何处理。   

    > 多个参数– 任意多个参数,都会被MyBatis从新包装成一个Map传入。Map的key是param1,param2,0,1…,值就是参数的值。

    > 命名参数– 为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是咱们本身指定的名字

    > POJO– 当这些参数属于咱们业务POJO时,咱们直接传递POJO

    > Map– 咱们也能够封装多个参数为map,直接传递

  - 参数处理

    > 参数也能够指定一个特殊的数据类型: 

      

    > javaType 一般能够从参数对象中来去肯定

    > 若是 null 被看成值来传递,对于全部可能为空的列,jdbcType 须要被设置
    > 对于数值类型,还能够设置小数点后保留的位数:
    > mode 属性容许指定 IN,OUT 或 INOUT 参数。若是参数为 OUT 或 INOUT,参数对象属性的真实值将会被改变,就像在获取输出参数时所指望的那样。
    > 参数位置支持的属性– javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName、expression
    > 实际上一般被设置的是:可能为空的列名指定 jdbcType
    > #{key}:获取参数的值,预编译到SQL中。安全。
    > ${key}:获取参数的值,拼接到SQL中。有SQL注入问题。ORDER BY ${name}

  - select元素

    > Select元素来定义查询操做。

    > Id:惟一标识符。– 用来引用这条语句,须要和接口的方法名一致

    > parameterType:参数类型。– 能够不传,MyBatis会根据TypeHandler自动推断

    > resultType:返回值类型。– 别名或者全类名,若是返回的是集合,定义集合中元素的类型。不能和resultMap同时使用

      

  - 自动映射:

    一、全局setting设置

      > autoMappingBehavior默认是PARTIAL,开启自动映射的功能。惟一的要求是列名和javaBean属性名一致

      > 若是autoMappingBehavior设置为null则会取消自动映射

      > 数据库字段命名规范,POJO属性符合驼峰命名法,如A_COLUMNaColumn,咱们能够开启自动驼峰命名规则映射功能,mapUnderscoreToCamelCase=true。 

    二、自定义resultMap,实现高级结果集映射。

  - resultMap

    > constructor

      >> 类在实例化时, 用来注入结果到构造方法中

      >> idArg - ID 参数; 标记结果做为 ID 能够帮助提升总体效能

      >> arg - 注入到构造方法的一个普通结果

    > id – 一个 ID 结果; 标记结果做为 ID 能够帮助提升总体效能

    > result – 注入到字段或 JavaBean 属性的普通结果

    > association

      >> 一个复杂的类型关联;许多结果将包成这种类型

      >> 嵌入结果映射 – 结果映射自身的关联,或者参考一个

    > collection

      >> 复杂类型的集

      >> 嵌入结果映射 – 结果映射自身的集,或者参考一个

    > discriminator

      >> 使用结果值来决定使用哪一个结果映射

      >> case – 基于某些值的结果映射:嵌入结果映射 – 这种情形结果也映射它自己,所以能够包含不少相同的元素,或者它能够参照一个外部的结果映射。

  - id & result

    > id 和 result 映射一个单独列的值到简单数据类型(字符串,整型,双精度浮点数,日期等)的属性或字段。

      

  - association

    > 复杂对象映射

    > POJO中的属性可能会是一个对象

    > 咱们可使用联合查询,并以级联属性的方式封装对象。

      

    > 使用association标签订义对象的封装规则

    > association-嵌套结果集

        

    > association-分段查询

        

      >> select:调用目标的方法查询当前属性的值

      >> column:将指定列的值传入目标方法

    > association-分段查询&延迟加载::开启延迟加载和属性按需加载

        

    > 旧版本的MyBatis须要额外的支持包: asm-3.3.1.ja、 cglib-2.2.2.jar

  - Collection-集合类型&嵌套结果集

      

      

  - Collection-分步查询&延迟加载

       

  - 扩展-多列值封装map传递

    > 分步查询的时候经过column指定,将对应的列的数据传递过去,咱们有时须要传递多列数据。

    > 使用{key1=column1,key2=column2…}的形式

      

  - association或者collection标签的fetchType=eager/lazy能够覆盖全局的延迟加载策略,指定当即加载(eager)或者延迟加载(lazy)

 

 

5、MyBatis-动态SQL
  - 动态 SQL是MyBatis强大特性之一。极大的简化咱们拼装SQL的操做。
  - 动态 SQL 元素和使用 JSTL 或其余相似基于 XML 的文本处理器类似。
  - MyBatis 采用功能强大的基于 OGNL 的表达式来简化操做。 if、choose (when, otherwise)、 trim (where, set)、foreach
  - if
    

  - choose (when, otherwise)

    

  - trim (where, set)

    > where

        

    > set

        

    > trim

        

  - foreach:动态 SQL 的另一个经常使用的必要操做是须要对一个集合进行遍历,一般是在构建 IN 条件语句的时候。 

      

    > 当迭代列表、集合等可迭代对象或者数组时– index是当前迭代的次数,item的值是本次迭代获取的元素

    > 当使用字典(或者Map.Entry对象的集合)时– index是键,item是值

  - bind

    > bind 元素能够从 OGNL 表达式中建立一个变量并将其绑定到上下文。好比:

      

  - Multi-db vendor support

    > 若在 mybatis 配置文件中配置了 databaseIdProvider , 则可使用 “_databaseId”变量,这样就能够根据不一样的数据库厂商构建特定的语句

        

        

  - OGNL( Object Graph Navigation Language )对象图导航语言,这是一种强大的表达式语言,经过它能够很是方便的来操做对象属性。 相似于咱们的EL,SpEL等

      

 

 

6、MyBatis-缓存机制
  - MyBatis 包含一个很是强大的查询缓存特性,它能够很是方便地配置和定制。缓存能够极大的提高查询效率。
  - MyBatis系统中默认定义了两级缓存。 
  - 一级缓存和二级缓存。 
    一、默认状况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启。
    二、二级缓存须要手动开启和配置,他是基于namespace级别的缓存。
    三、为了提升扩展性。MyBatis定义了缓存接口Cache。咱们能够经过实现Cache接口来自定义二级缓存
  - 一级缓存
    > 一级缓存(local cache), 即本地缓存, 做用域默认为sqlSession。当 Session flush 或 close 后, 该Session 中的全部 Cache 将被清空。
    > 本地缓存不能被关闭, 但能够调用 clearCache()来清空本地缓存, 或者改变缓存的做用域. 
    > 在mybatis3.1以后, 能够配置本地缓存的做用域.在 mybatis.xml 中配置  
        

    > 一级缓存演示&失效状况

      >> 同一次会话期间只要查询过的数据都会保存在当前SqlSession的一个Map中、 key:hashCode+查询的SqlId+编写的sql查询语句+参数

      >> 一级缓存失效的四种状况

        一、不一样的SqlSession对应不一样的一级缓存

        二、同一个SqlSession可是查询条件不一样

        三、同一个SqlSession两次查询期间执行了任何一次增删改操做

        四、同一个SqlSession两次查询期间手动清空了缓存

    > 二级缓存

      >> 二级缓存(second level cache),全局做用域缓存

      >> 二级缓存默认不开启,须要手动配置

      >> MyBatis提供二级缓存的接口以及实现,缓存实现要求POJO实现Serializable接口

      >> 二级缓存在 SqlSession 关闭或提交以后才会生效

      >> 使用步骤:

        一、全局配置文件中开启二级缓存 <setting name="cacheEnabled" value="true"/>

        二、须要使用二级缓存的映射文件处使用cache配置缓存 <cache />

        三、注意:POJO须要实现Serializable接口

  - 缓存相关属性

    > eviction=“FIFO”:缓存回收策略:

      >> LRU – 最近最少使用的:移除最长时间不被使用的对象

      >> FIFO – 先进先出:按对象进入缓存的顺序来移除它们。

      >> SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

      >> WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象

      >> 默认的是 LRU。 

    > flushInterval:刷新间隔,单位毫秒

      >> 默认状况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

    > size:引用数目,正整数

      >> 表明缓存最多能够存储多少个对象,太大容易致使内存溢出

    > readOnly:只读,true/false

      >> true:只读缓存;会给全部调用者返回缓存对象的相同实例。所以这些对象不能被修改。这提供了很重要的性能优点。

      >> false:读写缓存;会返回缓存对象的拷贝(经过序列化)。这会慢一些,可是安全,所以默认是 false。

  - 缓存有关设置

    一、全局setting的cacheEnable: 配置二级缓存的开关。一级缓存一直是打开的。

    二、select标签的useCache属性: 配置这个select是否使用二级缓存。一级缓存一直是使用的 

    三、sql标签的flushCache属性: 增删改默认flushCache=true。sql执行之后,会同时清空一级和二级缓存。查询默认flushCache=false。 

    四、sqlSession.clearCache(): 只是用来清除一级缓存。 

    五、当在某一个做用域 (一级缓存Session/二级缓存Namespaces) 进行了 C/U/D 操做后,默认该做用域下全部 select 中的缓存将被clear。

  - 第三方缓存整合

    > EhCache 是一个纯Java的进程内缓存框架,具备快速、精干等特色,是Hibernate中默认的CacheProvider。 

    > MyBatis定义了Cache接口方便咱们进行自定义扩展。

    > 步骤:

      一、导入ehcache包,以及整合包,日志包:ehcache-core-2.6.8.jar、mybatis-ehcache-1.0.3.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.2.jar

      二、编写ehcache.xml配置文件

      三、配置cache标签 <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

    > 参照缓存:若想在命名空间中共享相同的缓存配置和实例。可使用 cache-ref 元素来引用另一个缓存。

        

      

 

 

7、MyBatis-Spring整合
  一、查看不一样MyBatis版本整合Spring时使用的适配包:http://www.mybatis.org/spring/ 
  二、下载整合适配包:https://github.com/mybatis/spring/releases
  三、官方整合示例,jpetstore:https://github.com/mybatis/jpetstore-6
  - 整合关键配置:
    

 

 

8、MyBatis-逆向工程
  - MyBatis Generator: 
  - 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,能够快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。可是表链接、存储过程等这些复杂sql的定义须要咱们手工编写
  - 官方文档地址:http://www.mybatis.org/generator/ 
  - 官方工程地址:https://github.com/mybatis/generator/releases
 
MBG使用
  - 使用步骤:  
    1)编写MBG的配置文件(重要几处配置)
      1)jdbcConnection配置数据库链接信息
      2)javaModelGenerator配置javaBean的生成策略
      3)sqlMapGenerator 配置sql映射文件生成策略
      4)javaClientGenerator配置Mapper接口的生成策略
      5)table 配置要逆向解析的数据表
        tableName:表名
        domainObjectName:对应的javaBean名
    2)运行代码生成器生成代码
  - 注意:

     > Context标签

      >> targetRuntime=“MyBatis3“能够生成带条件的增删改查

      >> targetRuntime=“MyBatis3Simple“能够生成基本的增删改查若是再次生成,建议将以前生成的数据删除,避免xml向后追加内容出现的问题。

  - MBG配置文件   

    <generatorConfiguration>
     <context id="DB2Tables" targetRuntime="MyBatis3">
      //数据库链接信息配置
      <jdbcConnection driverClass="com.mysql.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost:3306/bookstore0629"
        userId="root" password="123456">
      </jdbcConnection>
      //javaBean的生成策略
      <javaModelGenerator targetPackage="com.atguigu.bean" targetProject=".\src">
        <property name="enableSubPackages" value="true" />
        <property name="trimStrings" value="true" />
      </javaModelGenerator>
      //映射文件的生成策略
      <sqlMapGenerator targetPackage="mybatis.mapper" targetProject=".\conf">
        <property name="enableSubPackages" value="true" />
      </sqlMapGenerator>
      //dao接口java文件的生成策略
      <javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.dao"
        targetProject=".\src">
        <property name="enableSubPackages" value="true" />
      </javaClientGenerator>
      //数据表与javaBean的映射
      <table tableName="books" domainObjectName="Book"></table>
    </context>
   </generatorConfiguration>
  
  - 生成器代码
    

  - 测试查询:QBC风格的带条件查询

    

 

  

9、MyBatis-工做原理
  

 

 
10、MyBatis-插件开发
  - MyBatis在四大对象的建立过程当中,都会有插件进行介入。插件能够利用动态代理机制一层层的包装目标对象,而实如今目标对象执行目标方法以前进行拦截的效果。
  - MyBatis 容许在已映射语句执行过程当中的某一点进行拦截调用。
  - 默认状况下,MyBatis 容许使用插件来拦截的方法调用包括:
    > Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed) 
    > ParameterHandler (getParameterObject, setParameters) 
    > ResultSetHandler (handleResultSets, handleOutputParameters) 
    > StatementHandler (prepare, parameterize, batch, update, query) 
  - 插件开发
    > 插件开发步骤:
      1)、编写插件实现Interceptor接口,并使用@Intercepts注解完成插件签名
        

      2)、在全局配置文件中注册插件

        

  - 插件原理

    1)、按照插件注解声明,按照插件配置顺序调用插件plugin方法,生成被拦截对象的动态代理

    2)、多个插件依次生成目标对象的代理对象,层层包裹,先声明的先包裹;造成代理链

    3)、目标方法执行时依次从外到内执行插件的intercept方法。 

    4)、多个插件状况下,咱们每每须要在某个插件中分离出目标对象。能够借助MyBatis提供的SystemMetaObject类来进行获取最后一层的h以及target属性的值

  - Interceptor接口

    > Intercept:拦截目标方法执行

    > plugin:生成动态代理对象,可使用MyBatis提供的Plugin类的wrap方法

    > setProperties:注入插件配置时设置的属性

 

 

扩展:MyBatis实用场景
  - PageHelper插件进行分页
    > PageHelper是MyBatis中很是方便的第三方分页插件。
    > 官方文档:https://github.com/pagehelper/MybatisPageHelper/blob/master/README_zh.md

    > 咱们能够对照官方文档的说明,快速的使用插件

    > 使用步骤:

      一、导入相关包pagehelper-x.x.x.jar 和 jsqlparser-0.9.5.jar。 

      二、在MyBatis全局配置文件中配置分页插件。 

        

      三、使用PageHelper提供的方法进行分页

      四、可使用更强大的PageInfo封装返回结果

  - 批量操做

    > 默认的 openSession() 方法没有参数,它会建立有以下特性的:

      >> 会开启一个事务(也就是不自动提交)

      >> 链接对象会从由活动环境配置的数据源实例获得。

      >> 事务隔离级别将会使用驱动或数据源的默认设置。

      >> 预处理语句不会被复用,也不会批量处理更新。

    > openSession 方法的 ExecutorType 类型的参数,枚举类型: 

      >> ExecutorType.SIMPLE: 这个执行器类型不作特殊的事情(这是默认装配的)。它为每一个语句的执行建立一个新的预处理语句。

      >> ExecutorType.REUSE: 这个执行器类型会复用预处理语句。 

      >> ExecutorType.BATCH: 这个执行器会批量执行全部更新语句

    > 批量操做咱们是使用MyBatis提供的BatchExecutor进行的,他的底层就是经过jdbc攒sql的方式进行的。咱们可让他攒够必定数量后发给数据库一次。

    > 与Spring整合中,咱们推荐,额外的配置一个能够专门用来执行批量操做的sqlSession

      

    > 须要用到批量操做的时候,咱们能够注入配置的这个批量SqlSession。经过他获取到mapper映射器进行操做。

    > 注意:

      一、批量操做是在session.commit()之后才发送sql语句给数据库进行执行的

      二、若是咱们想让其提早执行,以方便后续可能的查询操做获取数据,咱们可使用sqlSession.flushStatements()方法,让其直接冲刷到数据库进行执行。

  - 存储过程

    > 实际开发中,咱们一般也会写一些存储过程,MyBatis也支持对存储过程的调用

    > 一个最简单的存储过程

      

    > 存储过程的调用:

      一、select标签中statementType=“CALLABLE”

      二、标签体中调用语法:{call procedure_name(#{param1_info},#{param2_info})}

    > 存储过程-游标处理

      >> MyBatis对存储过程的游标提供了一个JdbcType=CURSOR的支持,能够智能的把游标读取到的数据,映射到咱们声明的结果集中

      >> 调用实例:

          

          

          

          

  - 自定义TypeHandler处理枚举

    > 咱们能够经过自定义TypeHandler的形式来在设置参数或者取出结果集的时候自定义参数封装策略。 

    > 步骤: 

      一、实现TypeHandler接口或者继承BaseTypeHandler

      二、使用@MappedTypes定义处理的java类型、使用@MappedJdbcTypes定义jdbcType类型

      三、在自定义结果集标签或者参数处理的时候声明使用自定义TypeHandler进行处理或者在全局配置TypeHandler要处理的javaType

    > 测试实例

      >> 一个表明部门状态的枚举类

          

      一、测试全局配置EnumOrdinalTypeHandler

          

      二、测试全局配置EnumTypeHandler

          

      三、测试参数位置设置自定义TypeHandler

           

    > 自定义TypeHandler

        

相关文章
相关标签/搜索