详解mybatis配置文件
在前面两篇文章中,大致与大家分享了基于Java的ORM框架,Mybatis基本架构和Mybatis实现CRUD的基本原理与流程,在本篇文章中,继续与大家分享Mybatis配置文件。
通过研究Mybatis官网配置文件,不难得出如下两个结论:
结论一:Mybatis配置文件结构是固定的
结论二:Mybatis配置文件有九大类全局配置节点,且它们之间存在先后顺序关系
本篇文章重点,也是为了解决如上两个结论问题。
一 Mybatis九大类全局配置节点
(一)properties
properties为属性配置文件,它为上下文提供相关的资源,properties有三种配置资源的方式:
方式一:通过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(比如:default="development")。
- 每个 environment 元素定义的环境 ID(比如:id="development")。
- 事务管理器的配置(比如:type="JDBC")。
- 数据源的配置(比如:type="POOLED")。
默认的环境和环境 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#
五 版权区
- 转载博客,必须注明博客出处
- 博主网址:http://www.cnblogs.com/wangjiming/
- 如您有新想法,欢迎提出,邮箱:2098469527@qq.com
详解mybatis配置文件的更多相关文章
- 详解mybatis映射配置文件
一 mybatis 映射文件结构 mybatis映射配置文件存在如下顶级元素,且这些元素按照如下顺序被定义. cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的 ...
- 详解Mybatis拦截器(从使用到源码)
详解Mybatis拦截器(从使用到源码) MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能. 本文从配置到源码进行分析. 一.拦截器介绍 MyBatis 允许你在 ...
- Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...
- mybatis 学习笔记 -详解mybatis 及实例demo
快速入门1 要点: 首先明白mybatis 是什么 这是一个持久层的框架.之前叫做ibatis.所以,在它的代码中出现ibatis这个词的时候,不要感到惊讶.不是写错了,它确实就是这个样子的. 首先, ...
- Linux crontab 命令详解(含配置文件路径)
编辑/etc/crontab 文件配置cron cron 服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服 ...
- 详解Tomcat 配置文件server.xml
前言 Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛.server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的 ...
- Redis学习——详解Redis配置文件(三)
一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...
- [转]application.properties详解 --springBoot配置文件
本文转载:http://blog.csdn.net/lpfsuperman/article/details/78287265###; # spring boot application.propert ...
- application.properties详解 --springBoot配置文件【转载】
# spring boot application.properties配置的各个属性详解 # 该示例文件作为标准提供.(官方文档 翻译过来的) # 还是花了些功夫翻译,各位如果转发,请留下本文地址, ...
随机推荐
- BZOJ_1433_[ZJOI2009]假期的宿舍_二分图匹配
BZOJ_1433_[ZJOI2009]假期的宿舍_二分图匹配 题意: 学校放假了······有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如A 和B都是学校的学生,A要回 ...
- BZOJ_5301_[Cqoi2018]异或序列&&CF617E_莫队
Description 已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l.r ,问在 [l,r] 区间内,有多少连续子 序列满足异或和等于 k . 也就是说,对于所 ...
- iOS 社交化分享功能
iOS 开发过程中可能会遇到需要进行第三方分享的需求,比如向QQ,微信,微博等分享 如下图 我们今天要讲到的方式是使用了一个第三方工具: http://www.sharesdk.cn 一,注册账号 去 ...
- Java基础-抽象类和接口
抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象 ...
- ASP.NET Core的实时库: SignalR简介及使用
大纲 本系列会分为2-3篇文章. 第一篇介绍了SignalR的预备知识和原理 本文介绍SignalR以及ASP.NET Core里使用SignalR. 本文的内容: 介绍SignalR 在ASP.NE ...
- 深入理解java虚拟机之java内存区域
java虚拟机在执行java程序的时候会把它所管理的内存分为多个不同的区域,每个区域都有不同的作用,以及由各自的生命周期,有些随着虚拟机进行的启动而存在,有些区域则依赖于用户线程的启动或结束而建立或销 ...
- asp.net core系列 59 Ocelot 构建基础项目示例
一.入门概述 从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中.当客户端(web站点.ios. app 等)访问we ...
- 用Docker解决坑爹的环境搭建系列——PHP+Apache2
sudo docker pull eboraas/apache-php sudo docker run -p 9991:80 --name php -v /data/docker/php/www:/v ...
- Redis - NoSQL数据库技术(一)
NoSQL入门概述(一) 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 什么是NoSQL NoSQL(NoSQL - Not Only SQL),意“不仅仅是SQL”: 泛指非关系 ...
- java工作流引擎Jflow流程事件和流程节点事件设置
流程实例的引入和设置 关键词: 开源工作流引擎 Java工作流开发 .net开源工作流引擎 流程事件 工作流节点事件 应用场景: 在一些复杂的业务逻辑流程中需要在某个节点或者是流程结束后做一些 ...