Mybatis配置信息浅析 MyBatis简介(二)

官方文档入门篇中有明确说明
每一个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。
SqlSessionFactory 的实例能够经过 SqlSessionFactoryBuilder 得到。
而 SqlSessionFactoryBuilder 则能够从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
配置文件是Mybatis应用的核心之一(另外一个核心为SQL映射)

因此配置文件的根元素为Configuration,如下为一个空的配置文件结构
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>



</configuration>

总览

Mybatis的配置模块主要分为9大类
image_5c5167af_3e08
每一个模块都是configuration的子元素
好比,第一个示例中使用到的environments 和mappers
image_5c5167af_31c7
每一个模块都有各自的职责以及配置方式,重点是要理解每个模块具体作了什么,具体如何设置就能够及时的翻阅官方文档。

properties

properties与其余地方咱们平时说的properties文件并无什么区别,就是为了引入、设置配置信息。
<propertiesresource="org/mybatis/example/config.properties"><propertyname="username"value="dev_user"/><propertyname="password"value="F2Fa3!33TYyg"/></properties>
引入的配置信息能够在配置文件中以${变量名}的形式使用,好比
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>

......

</dataSource>
使用properties时,须要注意的就是覆盖优先级
可使用resource指定一个properties文件
而且还能够在properties中设置
若是重名了怎么办?
会优先使用resource中指定的值
 
Mybatis应用的核心为SqlSessionFactory,而SqlSessionFactory又是能够经过SqlSessionFactoryBuilder得到
这些配置信息都是为了建立SqlSessionFactory而准备的
另外SqlSessionFactoryBuilder的建立方法中也能够显式的明确的传递参数
image_5c5167af_191b
简言之, 这些配置信息数据最终是给SqlSessionFactoryBuilder用来建立SqlSessionFactory的
显然若是此处显式的传递进入properties对象,那么则使用properties中的
  • 在 properties 元素体内指定的属性首先被读取。
  • 而后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
  • 最后读取做为方法参数传递的属性,并覆盖已读取的同名属性。
因此对于优先级,从高到低依次为:参数传递,resource指定,property指定
除非特殊状况,不然,没有必要利用这个优先级特性,能够直接使用外部的properties文件进行配置便可,所有安置于一个文件中,便于维护。

环境配置environments

MyBatis 能够配置成适应多种环境,也就是说你能够配置N个环境,而后选择其一使用。
好比开发、测试和生产环境须要有不一样的配置
尽管能够配置多个环境,可是每一个 SqlSessionFactory 实例只能选择其一
<environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"><propertyname="..."value="..."/></transactionManager><dataSourcetype="POOLED"><propertyname="driver"value="${driver}"/><propertyname="url"value="${url}"/><propertyname="username"value="${username}"/><propertyname="password"value="${password}"/></dataSource></environment></environments>

 

注意点:
每一个environment都有一个ID
environments中有一个default值<environments default="development">
 
从方法能够看得出来,环境信息也是能够从方法传递的,若是传入将会使用指定的环境
不然,将会使用默认的
image_5c5167af_3998
 
在第一个示例程序中,若是使用带有环境变量的参数的build方法,传入存在的environment的id信息,一切都照往常通常
image_5c5167af_3a23

映射器mappers

去哪里找咱们定义好的mapper文件?这就是映射器mappers的做用
 
有四种方式能够设置
第一个为基于类路径的一个相对路径,使用resource
第二个是物理路径,使用 url
第三个是对应接口的彻底限定名,使用 class
第四个是将一个包下面全部的所有注册,使用 name
image_5c5167af_2231
无论使用哪一种方式形式都是下面的形式, 指定符号为resource、url、class、name
<mappers>
<mapper 指定符号="指定符号对应格式的字符串"/>

......

</mappers>

settings

设置信息是Mybatis的核心调整参数,上面的数据库链接信息是属于必备的基础信息,而settings的配置项目则侧重于细节,行为的调整
一个很直观的例子就是音乐播放器的音效调整
image_5c5167b0_3de9
若是不对这些项目进行设置,通常都有一个默认的值,能够认为是软件的推荐设置,音乐播放器也能够彻底正常的进行工做,不会由于未设置而没法运行或者出现问题。 
可是,若是进行设置,这些设置项目可能会对你的音质音效产生很大的影响。
Mybatis的settings选项中的各个参数就很是相似音乐播放器中音效的设置。
好比
cacheEnabled
表示:全局地开启或关闭配置文件中的全部映射器已经配置的任何缓存。 
值为 true或者false ,默认值为true
 
对于全部的项目官方文档中均有明确的说明,使用时务必参照文档

别名 typeAliases

别名相似于数据库查询的别名,只是一个名字,仅此而已。
alias后面是别名,type是彻底限定名
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>

......

</typeAliases>

 

他只和 XML 配置有关,存在的意义仅在于用来减小类彻底限定名的冗余
可使用上面的方式逐个指定
还能够指定一个包,这样的话包下面全部的类将会有自动的别名,会使用 Bean 的首字母小写的非限定类名来做为它的别名
好比 domain.blog.Author 的别名为 author;如有注解,则别名为其注解值。看下面的例子:
@Alias("author")publicclassAuthor{...}

 

若是一个具备必定规模的项目,多人开发每一个人都指定别名,不知道这究竟是好事仍是坏事?
 
对于一些内建的类型也创建了相应的别名结构,能够参考官方文档
好比:
别名        映射的类型
_byte        byte  

类型处理 typeHandlers

类型处理器尽管平时老是用不到,可是却无时无刻再也不被使用
不管是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,仍是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
由于Mybatis内置了默认的类型处理器,不少时候咱们并不须要对他进行处理
在JDBC中对于一个字段咱们须要setInt 或者getString这种形式的方法对字段进行处理,在Mybatis中,这些都是自动的
Mybatis之因此可以将字段与Java类型进行对应,依靠的就是typeHandler
简言之,能够认为是一个中间层方法
image_5c5167b0_7c4a
好比
IntegerTypeHandler,Java类型为java.lang.Integer, int,数据库兼容 NUMERIC 或 INTEGER
细节此处不介绍,简单说就是:当遇到Java Integer类型的数据时,就调用IntegerTypeHandler,这个类型处理器就至关于完成了setInt的工做
Mybatis内置了不少的类型处理器,因此一般咱们并不须要作什么,Mybatis老是可以将类型与字段进行正确的映射
当须要更高级深层的处理时,能够考虑自定义typeHandler,他就是字段与Java类型之间的一个转接头

插件  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)
 
能够这么理解,在Mybatis的整个处理过程当中,有一些过程的调用中,容许用户插入自定义的执行逻辑
假设有一个对象a,调用了对象b的方法function,容许在b方法调用前添加必定的逻辑
这含义是否是很是的相似代理呢?调用真实对象以前添加方法?
事实上插件的逻辑就是代理。
简言之,能够认为插件就是在某些方法调用时植入逻辑。

数据库厂商标识符  databaseIdProvider

一个项目,可能配置了不一样的数据库映射文件,好比一个项目可使用MYSQL或者ORACLE
对于不一样的数据库,部分SQL可能会有所不一样,这很正常,如何灵活的配置这两套SQL执行方案?
在Mybatis中使用的是数据库厂商标识符
每一个数据库都有一个名称字符串,能够经过方法进行获取,假设MYSQL 返回的字符串标识符为 mysql
如今我知道了目标数据库的名称,我若是知道哪些SQL是这个数据库的不就行了么
那么,如何标记每一个SQL都是属于哪一个数据库的呢?
以下图所示,每个SQL中,有一个databaseId属性能够设置,经过他能够配置这个SQL映射属于哪一个数据库
image_5c5167b0_24f6
有了数据库的标识符,再有了每一个SQL的标识符,天然就能够完成匹配了
好比上面的SQL databaseId的值为“mysql”,当遇到数据库的名称标识符为“mysql”时,仅仅加载databaseId的值为“mysql”的映射便可。
 
可是还有一个问题:
因为一般状况下这个数据库名称的标识符字符串都很是长并且相同产品的不一样版本会返回不一样的值
因此最好经过设置属性别名来使其变短,并且经过别名作中转,当更换版本时,项目中不须要变动
 
因此数据库厂商标识符的完整的用法就是借助于databaseIdProvider模块
第一步配置须要的数据库名称信息
value的值为别名,name的值为所须要匹配的字符串
也就是说若是获取到的数据库名称标识符中包含name中设置的值,那么当前的databaseId就是value的值
总之,value的值才是项目中使用的,name的值是须要进行匹配的
匹配键,使用值
<databaseIdProvidertype="DB_VENDOR"><propertyname="SQL Server"value="sqlserver"/><propertyname="DB2"value="db2"/><propertyname="Oracle"value="oracle"/></databaseIdProvider>
第二步就是配置每一个SQL映射的databaseId属性值
 
最终,若是配置了 databaseIdProvider,MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的全部语句。  
若是同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。

对象工厂 objectFactory

MyBatis是咱们仅仅专一于SQL的编写,完成了字段到Java类型对象的转换
既然是ORM框架,从关系型数据库中检索到的信息终归是要建立对象的
在Mybatis中,使用一个对象建立工厂ObjectFactory的实例来完成
默认的对象工厂须要作的仅仅是实例化目标类,要么经过默认构造方法,要么在参数映射存在的时候经过参数构造方法来实例化。一个无参一个有参
对应代码的话就是其中的两个create方法,一个是处理默认构造方法的,另一个是处理带参数的构造方法的
image_5c5167b0_7c8a
想要实现本身的对象建立工厂,能够经过 继承 DefaultObjectFactory
image_5c5167b0_2772
继承了DefaultObjectFactory以后,将本身的ObjectFactory配置便可
以下图所示
image_5c5167b0_28a1

总结

以上为Mybatis配置文件中各个模块的简单介绍,重在介绍模块的功能,具体用法还须要参考官方文档
从配置文件也能够看得出来,Mybatis的配置条理清晰,各个模块各司其职,并且很是的灵活
  • 经过properties能够对元素进行设置
  • 经过environments对环境进行指定
  • 经过mappers对映射文件进行定位
  • 经过settings设置能够对Mybatis进行高级调优
  • 经过typeAliases别名能够简化名称,简捷使用
  • 经过typeHandlers类型处理能够对数据与Java类型的转换进行高级设置
  • 经过plugins插件能够在Mybatis执行逻辑中植入逻辑功能
  • 经过databaseIdProvider数据库厂商标识符 能够灵活应用部署多数据库
  • 经过objectFactory对象工厂能够个性化对象的建立
以上各个模块都是configuration的子元素,放置于configuration内
须要注意的是各个元素之间也是有顺序的,有顺序的,在DTD文件中能够看到
image_5c5167b0_2d0c
若是顺序不当是会报错的
image_5c5167b0_1ed0
相关文章
相关标签/搜索