mybatis-配置篇
Mybatis基础配置
Mybatis应用都是以一个SqlSessionFactory为核心。
SqlSessionFactory的实例通过SqlSessionFactoryBuilder获得。
SqlSessionFactoryBuilder可以通过Configuration或者xml文件配置而来。
Mybatis基本执行流程
实例化SqlSessionFactoryBuild--> 构建SqlSessionFactory--> 获取SqlSession对象--> 拿到Mapper映射器 --> 执行Sql
从XML中构建SqlSessionFactory
public class DemoSqlSessionFactory {
private static SqlSessionFactory sessionFactory() throws IOException {
// mybatis-config.xml配置文件目录,配置文件在resources目录下
String resource = "mybatis-config.xml";
// 获取文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过SqlSessionFactoryBuilder构建SqlSessionFactory
return new SqlSessionFactoryBuilder().build(inputStream);
}
}
从SqlSessionFactory中获取SqlSession
private static SqlSession sqlSession() throws IOException {
// 拿到SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sessionFactory();
// 获取SqlSession实例
return sqlSessionFactory.openSession();
}
利用SqlSession执行sql并获取返回结果
SqlSession sqlSession = sqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.get("zhangsan");
作用域以及生命周期说明
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory,就不再需要SqlSessionFactoryBuilder了。
因此SqlSessionFactoryBuilder的最佳作用域就是方法作用域(创建SqlSessionFactory的方法中的局部变量)。
SqlSessionFactory
SqlSessionFactory一旦被创建,在运行期间就一直存在。使用SqlSessionFactory就要保证在运行期间不要重复创建。
因此SqlSessionFactory的作用域为应用作用域(整个应用程序运行期间)。
SqlSession
每个线程都有自己的SqlSession实例。SqlSession的实例不是线程安全的,因此不能被共享,因此他的作用域是一个request或者方法作用域。
Mapper接口映射器
映射器为绑定Sql语句XML文件对应的接口。映射器的接口实例是在SqlSession中获取的,因此映射器的作用域与SqlSession的作用域相同。
不过方法作用域才是映射器实例的最佳作用域。也就是说映射器实例应该在调用他们的方法中获取,使用完即丢弃。
mybatis.xml基本配置说明
mybatis的xml文档配置结构如下
- configuration(配置,跟节点)
- properties(属性资源文件来源)
- settings(设置变量)
- typeAliases(返回类型别名定义)
- typeHandlers(返回结果类型处理器)
- objectFactory(对象工厂)
- plungins(插件)
- environments (环境配置)
- environment(dev/prod/test)
- transactionManager(事务管理器)
- datasource(数据源)
- datasourceProvider(数据库厂商标识)
- mappers(xml文件所在位置)
properties(属性)
可以在外部的properties文件中定义变量,在通过
properties文件中的变量,如下:
datasource.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=123455
mybatis-config.xml
<properties resource="datasource.properties"/>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver:com.mysql.cj.jdbc.Driver}"/>
<property name="url" value="${url:jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8}"/>
<property name="username" value="${username:root}"/>
<property name="password" value="${password:521741}"/>
</dataSource>
</environment>
</environments>
如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
- 首先读取在 properties 元素体内指定的属性。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
从MyBatis 3.4.2版本开始,支持使用占位符:来设置默认值,不过这个特性在默认情况下是关闭的,如果要使用,进行以下设置
<properties>
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 启用默认值特性 -->
</properties>
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: 输出警告日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN),FAILING: 映射失败 (抛出 SqlSessionException) | NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定数据库驱动等待数据库响应的秒数。 | 任意正整数 | 未设置 (null) |
defaultFetchSize | 为驱动的结果集获取数量(fetchSize)设置一个建议值。此参数只可以在查询设置中被覆盖。 | 任意正整数 | 未设置 (null) |
defaultResultSetType | 指定语句默认的滚动策略。(新增于 3.5.2) | FORWARD_ONLY / SCROLL_SENSITIVE / SCROLL_INSENSITIVE / DEFAULT(等同于未设置) | 未设置 (null) |
safeRowBoundsEnabled | 是否允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为 false。 | true / false | False |
safeResultHandlerEnabled | 是否允许在嵌套语句中使用结果处理器(ResultHandler)。如果允许使用则设置为 false。 | true / false | True |
mapUnderscoreToCamelCase | 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 | true / false | False |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。 默认值为 SESSION,会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。 | SESSION / STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 | JdbcType 常量,常用值:NULL、VARCHAR 或 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会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。(新增于 3.4.2) | true / false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀。 | 任何字符串 | 未设置 |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J / LOG4J / LOG4J2 / JDK_LOGGING / COMMONS_LOGGING / STDOUT_LOGGING / NO_LOGGING | 未设置 |
proxyFactory | 指定 Mybatis 创建可延迟加载对象所用到的代理工具。 | CGLIB / JAVASSIST | JAVASSIST (MyBatis 3.3 以上) |
vfsImpl | 指定 VFS 的实现 | 自定义 VFS 的实现的类全限定名,以逗号分隔。 | 未设置 |
useActualParamName | 允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项。(新增于 3.4.1) | true / false | true |
configurationFactory | 指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为static Configuration | getConfiguration() 的方法。(新增于 3.2.3) | 一个类型别名或完全限定类名。 |
shrinkWhitespacesInSql | 从SQL中删除多余的空格字符。请注意,这也会影响SQL中的文字字符串。 (新增于 3.5.5) | true / false | false |
typeAliases(类型别名)
可以为实体类设置一个别名,这样在xml文件中的resultType就不需要写类的全路径了,如下
<!-- 别名定义 -->
<typeAliases>
<typeAlias alias="User" type="com.ns.mybatis.domain.User"/>
</typeAliases>
<!-- 使用示例 -->
<select id="get" parameterType="User" resultType="User">
select * from user
</select>
typeHandlers(类型处理器)
用来处理预处理语句中的参数或者将执行结果的数据类型转换为Java类型。
mybatis自身提供的类型处理器如下:
类型处理器 | Java类型 | JDBC类型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean, boolean | 数据库兼容的 BOOLEAN |
ByteTypeHandler | java.lang.Byte, byte | 数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler | java.lang.Short, short | 数据库兼容的 NUMERIC 或 SMALLINT |
IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long, long | 数据库兼容的 NUMERIC 或 BIGINT |
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 类型,用来存储枚举的序数值(而不是名称)。 |
SqlxmlTypeHandler | java.lang.String | SQLXML |
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 或 LONGVARCHAR |
JapaneseDateTypeHandler | java.time.chrono.JapaneseDate | DATE |
如果要自定义类型处理器,继承BaseTypeHandler类,并重写相关方法即可,如下为自定义VARCHAR类型的处理器 |
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
// 将数据库中后去的非空的值后添加ns字符串
preparedStatement.setString(i, s+"ns");
}
@Override
public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
return resultSet.getString(s);
}
@Override
public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
return resultSet.getString(i);
}
@Override
public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return callableStatement.getString(i);
}
}
mybatis-config.xml文件添加处理器
<typeHandlers>
<typeHandler handler="com.ns.mybatis.basic.MyTypeHandler"/>
</typeHandlers>
objectFactory(对象工厂)
mybatis创建结果对象的实例时,会使用对象工厂来完成实例化工作。我们可以通过自定义的对象工厂来创建对象实例。
比如说有些对象需要设置默认值啥的,或者这个值为调用某段java代码获取的。
public class MyObjectFactory extends DefaultObjectFactory {
@Override
public <T> T create(Class<T> type) {
T result = super.create(type);
if (type == User.class) {
((User)result).setSex("girl");
}
return result;
}
}
mybatis-config.xml配置
<objectFactory type="com.ns.mybatis.basic.MyObjectFactory" />
plugins(插件)
mybatis允许再sql语句执行前后进行拦截,提供的插件有
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
如下,我们要对某一类用户权限进行限制,如果查询张三的信息,则抛异常,因为张三信息严格保密
@Intercepts({@Signature(
type = Executor.class,
method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
)})
public class MyPlugin implements Interceptor {
private static final String CURRENT_USER = "zhangsan";
@Override
public Object intercept(Invocation invocation) throws Throwable {
if (CURRENT_USER.equals(invocation.getArgs()[1])) {
throw new RuntimeException("权限不足,不能查询该用户信息");
}
return invocation.proceed();
}
}
mybatis-config.xml配置
<plugins>
<plugin interceptor="com.ns.mybatis.basic.MyPlugin" />
</plugins>
environments(环境)
mybatis支持多种环境配置,比如果开发、测试、生产
<!-- 默认的环境为dev -->
<environments default="dev">
<!-- 设置dev环境的各个属性值 -->
<environment id="dev">
<!-- 事务类型 -->
<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>
mybatis有三种内置的数据源类型 UNPOOLED、POOLED、JNDI
- UNPOOLED
这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。
性能表现则依赖于使用的数据库,对某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形,主要有以下参数:- driver – 这是 JDBC 驱动的 Java 类全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
- url – 这是数据库的 JDBC URL 地址。
- username – 登录数据库的用户名。
- password – 登录数据库的密码。
- defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
- defaultNetworkTimeout – 等待数据库操作完成的默认网络超时时间(单位:毫秒)
- POOLED
这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,
能使并发 Web 应用快速响应请求。除了上述提到 UNPOOLED 下的属性外,还有更多属性用来配置 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))。这是个可选属性,如果忽略,那么将会直接从 InitialContext 中寻找 data_source 属性。
- data_source – 这是引用数据源实例位置的上下文路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
databaseIdProvider(数据库厂商标识)
使用前提:多数据源的情况,不同数据源sql函数不同。
mybatis可以根据不同的数据库厂商执行不同的sql语句,多厂商的支持是在xml映射语句中通过设置databaseId属性。
如下为设置示例,name为数据库厂商标识,value为别名,使用时,databaseId使用value即可
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
mappers(映射器)
sql映射语句,对应每个mapper接口。
完整的mybatis-config配置
<?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 resource="datasource.properties">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
</properties>
<settings>
<!-- 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态,默认false -->
<setting name="lazyLoadingEnabled" value="false"/>
<!-- 开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载,默认false -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 是否允许单个语句返回多结果集(需要数据库驱动支持) -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 使用列标签代替列名 -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许 JDBC 支持自动生成主键 -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 指定发现自动映射目标未知列(或未知属性类型)的行为
NONE: 不做任何反应
WARNING: 输出警告日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN)
FAILING: 映射失败 (抛出 SqlSessionException)-->
<setting name="autoMappingUnknownColumnBehavior" value="NONE"/>
<!-- 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 设置超时时间,它决定数据库驱动等待数据库响应的秒数 -->
<!-- <setting name="defaultStatementTimeout" value=""/>-->
<!-- 为驱动的结果集获取数量(fetchSize)设置一个建议值。此参数只可以在查询设置中被覆盖 -->
<!-- <setting name="defaultFetchSize" value=""/>-->
<!-- 指定语句默认的滚动策略 -->
<!-- <setting name="defaultResultSetType" value=""/>-->
<!-- 是否允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为 false。 -->
<setting name="safeRowBoundsEnabled" value="false"/>
<!-- 是否允许在嵌套语句中使用结果处理器(ResultHandler)。如果允许使用则设置为 false。 -->
<setting name="safeResultHandlerEnabled" value="true"/>
<!-- 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 -->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!-- MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。 默认值为 SESSION,会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。 -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER -->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!-- 指定对象的哪些方法触发一次延迟加载。 逗号分隔的方法列表 -->
<!-- <setting name="lazyLoadTriggerMethods" value=""/>-->
<!-- 指定动态 SQL 生成使用的默认脚本语言。 -->
<!-- <setting name="defaultScriptingLanguage" value=""/>-->
<!-- 指定 Enum 使用的默认 TypeHandler 。 -->
<!-- <setting name="defaultEnumTypeHandler" value=""/>-->
<!-- 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。注意基本类型(int、boolean 等)是不能设置成 null 的。 -->
<setting name="callSettersOnNulls" value="false"/>
<!-- 当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。 -->
<setting name="returnInstanceForEmptyRow" value="false"/>
<!-- 指定 MyBatis 增加到日志名称的前缀。 -->
<!-- <setting name="logPrefix" value=""/>-->
<!-- 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 -->
<!-- <setting name="logImpl" value=""/>-->
<!-- 指定 Mybatis 创建可延迟加载对象所用到的代理工具。 -->
<!-- <setting name="proxyFactory" value="JAVASSIST "/>-->
<!-- 指定 VFS 的实现 -->
<!-- <setting name="vfsImpl" value=""/>-->
<!-- 允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项 -->
<setting name="useActualParamName" value="true"/>
<!-- 指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为static Configuration getConfiguration() 的方法 -->
<!-- <setting name="configurationFactory" value=""/>-->
<!-- 从SQL中删除多余的空格字符。请注意,这也会影响SQL中的文字字符串。 -->
<!-- <setting name="shrinkWhitespacesInSql" value=""/>-->
</settings>
<!-- 类型处理器 -->
<typeHandlers>
<!-- 自定义VARCHAR类型处理 -->
<typeHandler handler="com.ns.mybatis.basic.MyTypeHandler"/>
</typeHandlers>
<!-- 对象工厂 -->
<objectFactory type="com.ns.mybatis.basic.MyObjectFactory" />
<!-- 插件 -->
<plugins>
<plugin interceptor="com.ns.mybatis.basic.MyPlugin" />
</plugins>
<!-- 环境配置 -->
<environments default="dev">
<environment id="dev">
<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>
<!-- 多厂商标识 -->
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
<!-- xml文件映射类 -->
<mappers>
<mapper resource="com/ns/mybatis/basic/UserMapper.xml" />
</mappers>
</configuration>