在前面两篇文章中,大体与你们分享了基于Java的ORM框架,Mybatis基本架构和Mybatis实现CRUD的基本原理与流程,在本篇文章中,继续与你们分享Mybatis配置文件。html
经过研究Mybatis官网配置文件,不可贵出以下两个结论:java
结论一:Mybatis配置文件结构是固定的数据库
结论二:Mybatis配置文件有九大类全局配置节点,且它们之间存在前后顺序关系apache
本篇文章重点,也是为了解决如上两个结论问题。缓存
一 Mybatis九大类全局配置节点服务器
(一)propertiessession
properties为属性配置文件,它为上下文提供相关的资源,properties有三种配置资源的方式:mybatis
方式一:经过properties子元素配置架构
经过properties子元素property配置username和password变量,而后在properties下文environment节点中引用这些变量并发
<properties> <property name="username" value="root"/> <property name="password" value="root"/> </properties>
在environments节点中引用username和password变量
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
方式二:经过properise的属性配置
<properties resource="demo/mybatis/resources/jdbc.properties"/>
方式三:经过属性参数传递配置
即把属性传递到SqlSessionFactoryBuilder.build()中
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);
// ... or ...
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
Tip:当在mybatis配置文件中同时存在三种方式时,优先级顺序以下:
(1)首先读取properties子元素属性
(2)其次读取properties元素的属性(resource和url)
(3)最后读取做为方法参数传递的属性,并覆盖以读取的同名属性
三种方式,存在优先级,且排在后面的配置覆盖排在前面同名属性的配置,鉴于此,建议在配置时,不要使用混合方式。
(二)settings
settings决定mybatis运行时行为,均有不少可配置的行为,以下为一个较完整的settings配置
<settings> <!--全局全局地开启或关闭配置文件中的全部映射器已经配置的任何缓存,默认为true--> <setting name="cacheEnabled" value="true"/> <!--延迟加载的全局开关。当开启时,全部关联对象都会延迟加载。 特定关联关系中可经过设置 fetchType属性来覆盖该项的开关状态。默认值为false --> <setting name="lazyLoadingEnabled" value="false"/> <!--当开启时,任何方法的调用都会加载该对象的全部属性。不然,每一个属性会按需加载,默认值false--> <setting name="aggressiveLazyLoading" value="false"/> <!--是否容许单一语句返回多结果集,默认值为true --> <setting name="multipleResultSetsEnabled" value="true"/> <!--使用列标签代替列名,默认值为true --> <setting name="useColumnLabel" value="true"/> <!--容许 JDBC 支持自动生成主键,须要驱动兼容,默认值为false --> <setting name="useGeneratedKeys" value="false"/> <!--指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集 (不管是否嵌套),默认值为PARTIAL--> <setting name="autoMappingBehavior" value="PARTIAL"/> <!--指定发现自动映射目标未知列(或者未知属性类型)的行为。NONE: 不作任何反应; ARNING: 输出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN);FAILING: 映射失败 (抛出 SqlSessionException),默认值为NONE --> <setting name="autoMappingUnknownColumnBehavior" value="NONE"/> <!--配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。默认值为SIMPLE --> <setting name="defaultExecutorType" value="SIMPLE"/> <!--设置超时时间,它决定驱动等待数据库响应的秒数。参数为任意正整数,未设置默认值--> <setting name="defaultStatementTimeout" value="25"/> <!--为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只能够在查询设置中被覆盖。参数为任意正整数, 未设置默认值 --> <setting name="defaultFetchSize" value="100"/> <!--容许在嵌套语句中使用分页(RowBounds)。若是容许使用则设置为false,默认值未false --> <setting name="safeRowBoundsEnabled" value="false"/> <!--容许在嵌套语句中使用分页(ResultHandler)。若是容许使用则设置为false。默认值为true --> <setting name="safeResultHandlerEnabled" value="true"/> <!--是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的相似映射,默认值为false --> <setting name="mapUnderscoreToCamelCase" value="false"/> <!--MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种状况下会缓存一个会话中执行的全部查询。 若设置值为 STATEMENT,本地会话仅用在语 句执行上,对相同 SqlSession 的不一样调用将不会共享数据。--> <setting name="localCacheScope" value="SESSION"/> <!--当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动须要指定列的 JDBC 类型,多数情 况直接用通常类型便可,好比 NULL、VARCHAR 或 OTHER。默认值为OTHER --> <setting name="jdbcTypeForNull" value="OTHER"/> <!--指定哪一个对象的方法触发一次延迟加载。 --> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <!--指定动态 SQL 生成的默认语言。--> <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/> <!--指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。--> <setting name="callSettersOnNulls" value="false"/> <!--当返回行的全部列都是空时,MyBatis默认返回null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的 结果集 (i.e. collectioin and association)。(从3.4.2开始--> <setting name="returnInstanceForEmptyRow" value="false"/> <!--指定 MyBatis 增长到日志名称的前缀--> <setting name="logPrefix" value="log"/> <!--指定 MyBatis 所用日志的具体实现,未指定时将自动查找 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING。 --> <setting name="logImpl" value="LOG4J"/> <!--指定 Mybatis 建立具备延迟加载能力的对象所用到的代理工具。CGLIB | JAVASSIST--> <setting name="proxyFactory" value="JAVASSIST"/> <!--指定VFS的实现--> <setting name="vfsImpl" value="vfs"/> <!--容许使用方法签名中的名称做为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,而且加上-parameters选项。 (从3.4.1开始)--> <setting name="useActualParamName" value="true"/> <!--指定一个提供Configuration实例的类。 这个被返回的Configuration实例用来加载被反序列化对象的懒加载属性值。 这个类必须包含一个签名方法static Configuration getConfiguration(). (从 3.2.3 版本开始)--> <setting name="configurationFactory" value="configClass"/> </settings>
(三)typeAliases
类型别名为Java类型设置一个简短名字,它只与xml有关,用来减小类彻底限定名的冗余
<typeAliases> <typeAlias type="demo.mybatis.entity.UserInfo" alias="UserInfo"/> </typeAliases>
这样配置后,任何使用demo.mybatis.entity.UserInfo的地方,均可用UserInfo来代替
除此以外,还能够指定一个包名,mybatis会在包名下搜索须要的Java Bean,好比:
<typeAliases> <package name="demo.mybatis.entity"/> </typeAliases>
在没注解的状况下,每一个在demo.mybatis.entity中的Java Bean,会使用 Bean 的首字母小写的非限定类名来做为它的别名。 好比demo.mybatis.entity.UserInfo的别名为userInfo.
若存在注解,则别名为注解名。
POJO设置别名
@Alias("Users") public class User{ }
Mapper.xml
<select id="getUserInfoById" resultType="Users"> SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id} </select>
(四)typeHandlers
typeHandlers主要将获取的值合理地转化为java类型,能够转换预处理阶段(PreparedStatement)的参数和结果集中的值。mybatis提供了标准的类型处理,
详细请参照官网:http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers
同时,mybatis也支持之定义处理类型,在自定义处理类型时,只需实现org.apache.ibatis.type.TypeHandler接口,或继承org.apache.ibatis.type.BaseTypeHandler
(五)obejctFactory
后续文章讲解...
(六)plugins
后续文章讲解...
(七)environments
environments环境配置,mybatis支持多种配置,从而有助于适应多种数据库。但须要注意的是,尽管能够配置多个环境,但每一个SqlSessionFactory实例只能选择其一。
接受环境配置的两个方法签名:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
忽略环境参数,则加载默认环境
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
以下为一个环境配置示例
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
注释:
默认的环境和环境 ID 是自解释的,所以一目了然。你能够对环境随意命名,但必定要保证默认的环境 ID 要匹配其中一个环境 ID。
事务管理器:
Mybatis支持两种类型的事务管理器:
jdbc:依赖于从数据源获得的链接来管理事务做用域
managed:这个配置几乎没作什么。它历来不提交或回滚一个链接,而是让容器来管理事务的整个生命周期(好比 JEE 应用服务器的上下文)。
默认状况下它会关闭链接,然而一些容器并不但愿这样,所以须要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
dataSource:
dataSource元素使用标准的JDBC数据源接口来配置JDBC链接对象的资源,有三种内建的数据源类型:
UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭链接
POOLED:这种数据源的实现利用“池”的概念将 JDBC 链接对象组织起来,避免了建立新的链接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式
JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器能够集中或在外部配置数据源,而后放置一个 JNDI 上下文的引用
(八)databaseIdProvider
databaseIdProvider主要功能是支持多厂商数据库,它的实现原理是基于映射语句中的databaseId属性。MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库
databaseId 属性的全部语句。 若是同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 为支持多厂商特性只要像下面这样在 mybatis-config.xml
文件中加入 databaseIdProvider
<databaseIdProvider type="DB_VENDOR" />
(九)mappers
mappers关联映射配置文件,即告诉mybatis到哪里去找映射配置文件。有四种基本方式能够关联映射配置文件:
方式一:使用相对于类路径的资源引用
<!--类路径方式--> <mapper resource="demo/mybatis/resources/userInfo-config.xml"/>
表示的程序目录结构以下:
方式二:使用彻底限定资源定位符URL
假设映射文件路径为:E:\userInfo-config.xml
则采用url方式以下:(格式为file:///url)
<mapper url="file:///E:/userInfo-config.xml"/>
方式三:使用映射器接口实现类的彻底限定名
定义映射接口:
package demo.mybatis.service; import demo.mybatis.entity.UserInfo; import org.apache.ibatis.annotations.Select; public interface UserInfoAnnotation { @Select("SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id}") public UserInfo getUserInfoById(int user_id); }
配置映射
<mapper class="demo.mybatis.service.UserInfoAnnotation"/>
方式四:将包内的映射器接口实现所有注册为映射器
<package name="demo.mybatis.service"/>
二 Mybatis九大类全局配置节点顺序
Mybatis九大类全局配置节点按照以下顺序排序,位置不能颠倒。
properties=>settings=>typeAliases=>typeHandlers=>objectFactory=>plugins=>environment=>databaseIdProvider=>mappers
三 Mybatis系列文章
四 参考文献
【01】http://www.mybatis.org/mybatis-3/zh/configuration.html#
五 版权区