全文参考:http://www.mybatis.org/mybatis-3/zh/configuration.html#settings
前言
通过第一篇的介绍(传送门:https://blog.csdn.net/weixin_41381863/article/details/87885683)知道,操作Mybatis的核心对象是SqlSessionFactory,而SqlSessionFactory是根据配置文件创建的,由此可见,Mybatis的配置文件包含了影响Mybatis行为的信息。
Mybatis配置文件详解
a.配置文件示例:
<?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">
<!-- xml配置文件包含对mybatis系统的核心设置 -->
<configuration>
<!-- 为了能在控制台输出SQL语句,增加了log4j的日志配置 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!-- 环境配置:即连接的数据库 -->
<environments default="mysql">
<environment id="mysql">
<!-- 指定事务管理类型,指使用JDBC的提交和回滚设置 -->
<transactionManager type="JDBC"/>
<!-- database指数据源配置,POOLED是jdbc连接对象的数据源连接池的实现 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--amp;是xml中的转义符号,将&转义为连接符,jdbc高版本必须要加后面的参数 -->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- mappers告诉mybatis去哪里找持久化映射文件 -->
<!-- 不在此路径下请更改自己mapper文件所在的路径,注意/和.的区别 -->
<mappers>
<mapper resource="com/zepal/study/mapper/UserMapper.xml"/>
</mappers>
</configuration>
b.文档的结构和详解如下:
顶层<configuration>标签之前,都是声明此xml文件是mybatis的配置文件。
其它所有的属性配置都包含在<configuration>标签里面,自上而下包含了以下常用配置:
注意:以下属性的配置,在<configuration>标签里一定是自上而下的顺序,也就是说<typeHandlers><environments>等标签不能放在<settings>标签的前面,否则xml文件会报错。
properties | 属性配置 |
settings | 设置 |
typeAliases | 类型命名 |
typeHandlers | 类型处理器 |
objectFactory | 类型工厂 |
plugins | 插件 |
environments | mybatis运行环境 |
environment | environments子标签,mybatis运行环境变量 |
transactionManager | environments子标签,事务管理器 |
dataSource | environments子标签,数据源 |
databaseIdProvider | 数据库厂商标识 |
mappers | 映射器 |
1、properties属性配置标签
上面的示例文件没有配置此项,这个属性主要用来替换或者说是引入外部文件的,既可以在典型的Java属性文件中配置,也可以通过其子元素来传递,比如上述xml文件中的数据库信息,我们可以单独在mybatis配置文件外部配置,然后通过properties来引入,这样就为配置提供了诸多灵活选择。例如:
我们可以在项目中增减一个db.properties的Java属性文件用来存放数据库信息
#属性的key可以自定义
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username=root
password=root
然后在mybatis的配置文件增加<properties>属性配置引入db.properties。
<properties resource="db.properties"></properties>
其中db.properties中的属性值就可以像下面这样引入了。
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
2、settings标签(原文参考:http://www.mybatis.org/mybatis-3/zh/configuration.html#settings)
这是mybatis中极为重要的调整设置,它们会改变Mybatis的运行行为。
下表描述了settings标签中的各项参数、默认值等。
设置参数 | 描述 | 有效值 | 默认值 |
cacheEnabled | 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态 | true | false | false |
aggressiveLazyLoading | 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods). | true | false | false,3.4.1版本前是true |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集(需要兼容驱动) | true | false | true |
useColumnLabel | 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果 | true | false | true |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby) | true | false | False |
autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套) | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior |
NONE: 不做任何反应 WARNING: 输出提醒日志 FAILING: 映射失败 (抛出 SqlSessionException) |
NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定驱动等待数据库响应的秒数 | 任意正整数,Integer类型 | 没有设置则为null |
defaultFetchSize | 为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。 | 任意正整数,Integer类型 | 没有设置则为null |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false | true | false | False |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler)。如果允许使用则设置为false | true | false | True |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射 | true | false | False |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER | JdbcType 常量. 大多都为: NULL, VARCHAR and OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载 | 用逗号分隔的方法列表 | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定动态 SQL 生成的默认语言 | 一个类型别名或完全限定类名 |
org.apache.ibatis.scripting. xmltags.XMLLanguageDriver |
defaultEnumTypeHandler | 指定 Enum 使用的默认 TypeHandler 。 (从3.4.5开始) | 一个类型别名或完全限定类名 |
org.apache.ibatis. type.EnumTypeHandler |
callSettersOnNulls | 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的 | true | false | false |
returnInstanceForEmptyRow | 当返回行的所有列都是空时,MyBatis默认返回null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集 (i.e. collectioin and association)。(从3.4.2开始) | true | false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀 | 任何字符串 | 没有设置则为null |
logImpl(第一篇已经使用过) | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找 |
SLF4J、LOG4J、 JDK_LOGGING、 STDOUT_LOGGING、 NO_LOGGING
|
没有设置则为null |
proxyFactory | 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具 | CGLIB | JAVASSIST | JAVASSIST (MyBatis 3.3 or above) |
vfsImpl | 指定VFS的实现 | 自定义VFS的实现的类全限定名,以逗号分隔。 | 没有设置则为null |
useActualParamName | 允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项。(从3.4.1开始) | true | false | true |
configurationFactory | 指定一个提供Configuration实例的类。 这个被返回的Configuration实例用来加载被反序列化对象的懒加载属性值。 这个类必须包含一个签名方法static Configuration getConfiguration(). (从 3.2.3 版本开始) | 类型别名或者全类名 | 没有设置则为null |
一个完整的settings标签示例如下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
3、typeAliases类型命名(比如我们在第一篇的mapper文件中,指定User对象都是全路径,配置此项后,就可以直接使用别名了,但是不建议这么做,因为不好排错)
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:
<typeAliases>
<typeAlias alias="user" type="com.zepal.study.domain.User"/>
</typeAliases>
当这样配置时,对象User可以用在任何使用com.zepal.study.domain.User的地方。
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<package name="com.zepal.study.domain"/>
</typeAliases>
每一个在包 com.zepal.study.domain 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 com.zepal.study.domain.User 的别名为 user;若有注解,则别名为其注解值。看下面的例子:
@Alias("user")
public class User{
...
}
Mybatis已经为许多常见的Java类型内建了相应的类型别名(见下表),它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。
e.g.我们在mapper中传递的参数假如是String,按道理上说,在mapper文件中应该是java.lang.String。但由于mybatis已经为这些常见类型创建了别名,所以在mapper中直接使用string即可。
别名 | java数据类型 |
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
由上表可见,在PO(持久层对象)中,使用包装类的好处就是,别名中下划线是真的容易忘掉,强制使用包装类的其它原因上一篇已经提供,别扯什么基本数据类型自动拆装箱,请严谨一点。
4、typeHandlers类型处理器
类型处理器的作用就是将java中的数据类型转为数据库能识别的,从数据库获取数据类型的时候,将数据库的数据类型转换为java能识别的。
比如,mysql中有char、varchar,却没有String,这就要依赖typeHandlers类型处理器了。
有的朋友在使用mybatis的过程可能没注意过这个类型处理器,比如我们的第一篇也是没配置此项,针对userName属性,java中是String,mysql中是varchar,为什么就执行成功了呢。
原因就是,为了使Mybatis使用起来更加简便,Mybatis加入了一些默认的类型处理器(见下表)。
类型处理器 | Java类型 | JDBC类型 |
BooleanTypeHandler | java.lang.Boolean, boolean | 数据库兼容的 BOOLEAN,比如mysql中有tinyint |
ByteTypeHandler | java.lang.Byte, byte | 数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler | java.lang.Short, short | 数据库兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long, long | 数据库兼容的 NUMERIC 或 LONG INTEGER |
FloatTypeHandler | java.lang.Float, float | 数据库兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler | java.lang.Double, double | 数据库兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | 数据库兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
ClobReaderTypeHandler | java.io.Reader | -(数据库无此类型) |
ClobTypeHandler | java.lang.String | CLOB, LONGVARCHAR |
NStringTypeHandler | java.lang.String | NVARCHAR, NCHAR |
NClobTypeHandler | java.lang.String | NCLOB |
BlobInputStreamTypeHandler | java.io.InputStream | -(数据库无此类型) |
ByteArrayTypeHandler | byte[] | 数据库兼容的字节流类型 |
BlobTypeHandler | byte[] | BLOB, LONGVARBINARY |
DateTypeHandler | java.util.Date | TIMESTAMP |
DateOnlyTypeHandler | java.util.Date | DATE |
TimeOnlyTypeHandler | java.util.Date | TIME |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP |
SqlDateTypeHandler | java.sql.Date | DATE |
SqlTimeTypeHandler | java.sql.Time | TIME |
ObjectTypeHandler | Any | OTHER 或未指定类型 |
EnumTypeHandler | Enumeration Type | VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引) |
EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。 |
InstantTypeHandler | java.time.Instant | TIMESTAMP |
LocalDateTimeTypeHandler | java.time.LocalDateTime | TIMESTAMP |
LocalDateTypeHandler | java.time.LocalDate | DATE |
LocalTimeTypeHandler | java.time.LocalTime | TIME |
OffsetDateTimeTypeHandler | java.time.OffsetDateTime | TIMESTAMP |
OffsetTimeTypeHandler | java.time.OffsetTime | TIME |
ZonedDateTimeTypeHandler | java.time.ZonedDateTime | TIMESTAMP |
YearTypeHandler | java.time.Year | INTEGER |
MonthTypeHandler | java.time.Month | INTEGER |
YearMonthTypeHandler | java.time.YearMonth | VARCHAR or LONGVARCHAR |
JapaneseDateTypeHandler | java.time.chrono.JapaneseDate | DATE |
由上表可知,在大多数开发中,就基本可以忽略此项配置了,这就是很多实际项目中没有此项配置的原因了。
但是,在java中使用mybatis,有很多自定义的对象,比如在第一篇的User对象。假如说,我们的数据库中没有user表,我们想将User对象存到数据库也是可以的(虽然不建议这么做,也没人这么做)。
在自定义的类型处理器的时候,要注意,同一个持久层对象,假如做了类型转换处理,千万不要再将其做结果集映射,因为一定会失败,切记,切记。这一点正好验证第一篇中对持久层对象设计要保持低侵入性的说明。
做法一、注意上表标红的地方
数据库表结构(因为要靠序列化实现,序列化后的文件略大,所以data字段的数据类型是longblob)
java对象User,要实现序列化接口(属性任意,比如name、id、age、address...)
public class User implements Serializable {
//序列化版本,不添加此属性,如果在序列化之后,增加了属性,会反序列化失败
//有了序列化版本后,反序列化时会按序列化之前的属性反序列化,对新增的属性不会反序列化
private static final long serialVersionUID = 1L;
......
}
配置文件中配置类型处理器(注意,枚举类型应使用EnumTypeHandler或EnumOrdinalTypeHandler)
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.ObjectTypeHandler"
javaType="com.zepal.study.domain.User"/>
</typeHandlers>
mapper文件和测试类及测试结果
<insert id="saveUserWithTypeHandlers" parameterType="com.zepal.study.domain.User" useGeneratedKeys="true">
INSERT INTO tb_type_data (data)
VALUE
(#{user});
</insert>
public class TypeHandlersTest {
public static void main(String[] args) {
InputStream is = TypeHandlersTest.class.getResourceAsStream("/mybatis/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUserName("zepal");
user.setUserGender("男");
user.setUserAge(18);
int result = sqlSession.insert("com.zepal.study.dao.UserDao.saveUserWithTypeHandlers", user);
System.out.println(result);
sqlSession.commit();
sqlSession.close();
}
}
DEBUG [main] - ==> Preparing: INSERT INTO tb_type_data (data) VALUE (?);
DEBUG [main] - ==> Parameters: User [userId=null, userName=zepal, userGender=男, userAge=18](User)
DEBUG [main] - <== Updates: 1
1
做法二、我们可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型。比如:
同方法一的数据库表结构一样,也同样针对User对象。
不同的地方:
自定义类型处理器
@MappedJdbcTypes(JdbcType.BLOB)
public class MyTypeHandler extends BaseTypeHandler<User> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, User parameter, JdbcType jdbcType)
throws SQLException {
ps.setObject(i, parameter);
}
@Override
public User getNullableResult(ResultSet rs, String columnName) throws SQLException {
return (User) rs.getObject(columnName);
}
@Override
public User getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return (User) rs.getObject(columnIndex);
}
@Override
public User getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return (User) cs.getObject(columnIndex);
}
}
配置文件配置自定义处理器
<typeHandlers>
<typeHandler handler="com.zepal.study.typehandler.MyTypeHandler"/>
</typeHandlers>
说明:如果有多个自定义的处理器,一个一个配置肯定麻烦,可以配置扫描包。
<typeHandlers>
<package name="com.zepal.study.typehandler"/>
</typeHandlers>
5、objectFactory对象工厂(可以跳过,至今没发现有人用过这个功能)
先贴上官方介绍:
注意标红的地方,在我们做查询操作的时候,从数据库获取数据后,就交由DefaultObjectFactory做结果集处理,转为我们所定义的POJO对象。Mybatis的对象工厂已经提供了一个很好的对象创建工厂了。本着站在巨人肩膀上的思想,就没必要再去造轮子了。
而且在settings标签里面也提供了一些按需加载的设置。
所以,对于搬砖工人来说,我的愚见就是鸡肋。当然,对于我们去理解Mybatis对结果集处理的源码,是有很大的帮助的。
其实对于ObjectFactory,了解其本质作用,以及Mybatis的执行过程,对ObjectFactory的了解也基本差不多了。其它更高深的用法,就看Mybatis后续的更新吧。
6、plugins标签
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)
ParameterHandler(getParameterObject,setParameters)
ResultSetHandler(handleResultSets,handleOutputParameters)
StatementHandler(prepare,parameterize,batch,update,query)
其中,Executor 是 MyBatis 对外提供的一个操作接口类,其中包含了 query 查询、update 修改、commit 提交、rollback 回滚、clearLocalCache清空本地缓存等核心方法。ParameterHandler、ResultSetHandler 及 StatementHandler 分别是处理参数、结果集、预编译状态的接口,里面的一些方法也可以使用 plugin 进行拦截。
这个功能在日常开发中也几乎不会涉及,后面如果有博文使用到分页插件pageHelper的时候,我们再深入研究一下。
我们可以想象一下,假如把delete操作拦截下来,删掉后面的where部分^_^。
7、environments环境配置
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者多个生产数据库, 想使用相同的 SQL 映射。许多类似的用例。
提示:尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
一个标准的environments配置如下:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<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。像上面说的,哪怕是你在environments中配置了多个数据源,一定要把持其中有一个数据源的id与environments的id匹配。
那么多数据怎么切换呢?
为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。可以接受环境配置的两个方法签名是:
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);
--事务管理器transactionManager
在mybatis中有JDBC和MANAGED两种事务管理器。
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
假如使用JDBC,配置如下,因为JDBC没有属性配置,所以直接使用单闭合标签:
<transactionManager type="JDBC"/>
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。假如使用MANAGED,配置如下:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
说明:如果你开发者正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
--数据源dataSource。
在Mybatis中有UNPOOLED、POOLED、JNDI三种数据源。
UNPOOLED-这个数据源的实现只是每次被请求时打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。不同的数据库在性能方面的表现也是不一样的,对于某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性:
driver | 这是 JDBC 驱动的 Java 类的完全限定名(并不是 JDBC 驱动中可能包含的数据源类) |
url | 这是数据库的 JDBC URL 地址 |
username | 登录数据库的用户名 |
password | 登录数据库的密码 |
defaultTransactionIsolationLevel | 默认的连接事务隔离级别 |
POOLED-这种数据源的实现利用"池"的概念将JDBC连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。这是一种使得并发web应用快速请求的流行处理方式。除了上述UNPOOLED提到的5种属性外,还可以使用更多的属性来配置POOLED数据源:
poolMaximumActiveConnections | 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10 |
poolMaximumIdleConnections | 任意时间可能存在的空闲连接数 |
poolMaximumCheckoutTime | 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒) |
poolTimeToWait | 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒) |
poolMaximumLocalBadConnectionTolerance | 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程. 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3 (新增于 3.4.5) |
poolPingQuery | 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。 |
poolPingEnabled | 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。 |
poolPingConnectionsNotUsedFor | 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用) |
JNDI-这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这种数据源配置只需要两个属性:
initial_context | 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么 data_source 属性将会直接从 InitialContext 中寻找 |
data_source | 这是引用数据源实例位置的上下文的路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找 |
8、mappers映射器
Mybatis需要开发者自己写sql语句,mappers映射器正式告诉Mybatis到哪里去找映射器文件,进而找到这些SQL语句。实际开发中,可以使用相对于类路径的资源引用或完全限定资源定位符(包括 file:/// 的 URL),以及类名或包名,当然扫描包名是最方便的,不用一个mapper文件,写一个<mapper>映射器。例如:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
总结:
Mybatis最开发者提供了多种灵活配置,上面讲述到的一些配置,我们就可以根据自己实际需求,去决定是否需要某些配置,不需要则不配置。比如是否开启mybatis的缓存啊、是否开启自增策略啊、是否开启延迟加载啊、是否需要类型处理器啊等等。