Web框架-Mybatis-配置文件
配置文件
结论一:Mybatis配置文件结构是固定的
结论二:Mybatis配置文件有九大类全局配置节点,且它们之间存在先后顺序关系
一、Mybatis九大类全局配置节点
<?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>
<properties/><!-- 属性 -->
<settings/><!-- 设置 -->
<typeAliases/><!-- 类型别名 -->
<typeHandlers/><!-- 类型处理器 -->
<objectFactory/><!-- 对象工厂 -->
<plugins/><!-- 插件 -->
<environments default="development"><!-- 配置环境 -->
<environment id="development"><!-- 环境变量 -->
<transactionManager type="JDBC"/><!-- 事物管理器 JDBC/MANAGED-->
<dataSource type="POOLED"><!-- 数据源 UNPOOLED/POOLED/JNDI-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<databaseIdProvider type=""/><!-- 数据库厂商标识 -->
<mappers/><!-- 映射器 -->
</configuration>
节点说明:
dataSource
dataSource
对应改的type的值为UNPOOLED/POOLED/JNDI
-
UNPOOLED
,非连接池数据库(UNPooledDataSource
) -
POOLED
,连接池数据库(PooledDataSource
) -
JNDI
, JNDI数据源(JNDIDataSource
)
transactionManager
transactionManager
对应改的type的值为JDBC/MANAGED
-
JDBC
,釆用JDBC
方式管理事务,在独立编码中我们常常使用。 -
MANAGED
,釆用容器方式管理事务,在JNDI
数据源中常用。 - 自定义,由使用者自定义数据库事务管理办法,适用于特殊应用。
databaseIdProvider
databaseIdProvider
主要功能是支持多厂商数据库,它的实现原理是基于映射语句中的databaseId
属性。MyBatis
会加载不带 databaseId
属性和带有匹配当前数据库
databaseId
属性的所有语句。 如果同时找到带有 databaseId
和不带 databaseId
的相同语句,则后者会被舍弃。 为支持多厂商特性只要像下面这样在 mybatis-config.xml
文件中加入 databaseIdProvider
配置项
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="MYSQL" value="mysql"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
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变量
- 方式二:通过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)最后读取作为方法参数传递的属性,并覆盖以读取的同名属性
三种方式,存在优先级,且排在后面的配置覆盖排在前面同名属性的配置,鉴于此,建议在配置时,不要使用混合方式。
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{ }
<select id="getUserInfoById" resultType="Users">SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id}</select>
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>
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);
}
配置映射
<mappers>
<mapper class="demo.mybatis.service.UserInfoAnnotation"/>
<mapper class="demo.mybatis.service.BlogMapper"/>
<mapper class="demo.mybatis.service.PostMapper"/>
</mappers>
方式四:将包内的映射器接口实现全部注册为映射器
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
二、Mybatis九大类全局配置节点顺序
Mybatis
九大类全局配置节点按照如下顺序排序,位置不能颠倒。
=>properties
=>settings
=>typeAliases
=>typeHandlers
=>objectFactory
=>plugins
=>environment
=>databaseIdProvider
=>mappers
再次示例:xml配置实例:
<?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>
<properties/><!-- 属性 -->
<settings/><!-- 设置 -->
<typeAliases/><!-- 类型别名 -->
<typeHandlers/><!-- 类型处理器 -->
<objectFactory/><!-- 对象工厂 -->
<plugins/><!-- 插件 -->
<environments default="development"><!-- 配置环境 -->
<environment id="development"><!-- 环境变量 -->
<transactionManager type="JDBC"/><!-- 事物管理器 JDBC/MANAGED-->
<dataSource type="POOLED"><!-- 数据源 UNPOOLED/POOLED/JNDI-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<databaseIdProvider type=""/><!-- 数据库厂商标识 -->
<mappers/><!-- 映射器 -->
</configuration>