Mapper的XML配置文件
apper 的 XML 配置文件包含一些设置和属性,用于增强 MyBatis 的动作。文档的深层次结果如下:
configuration
|--- properties
|--- settings
|--- typeAliases
|--- typeHandlers
|--- objectFactory
|--- plugins
|--- environments
|--- |--- environment
|--- |--- |--- transactionManager
|--- |--- |__ dataSource
|__ mappers
属性(properties)
通过properties结点可以引入.properties文件,进而使用.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>
设置(settings)
这是 MyBatis 修改操作运行过程细节的重要的步骤。配置示例如下:
<settings>
<!-- 打印 SQL 语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
<!-- 使全局的映射器启用或禁用缓存。 -->
<setting name="cacheEnabled" value="false"/>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- 是否允许单条 SQL 返回多个数据集 (取决于驱动的兼容性) default:true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许 JDBC 生成主键。需要驱动器支持。如果设为了 true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不映射 PARTIAL:部分 FULL:全部 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 使用驼峰命名法转换字段。 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 设置 JDBC 类型为空时,某些驱动程序 要指定值, default:OTHER,插入空值时不需要指定类型 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
类型别名(typeAliases)
为Java类型取别名,省去长长的包名。配置示例如下:
<typeAliases>
<typeAlias alias="User" type="com.zys.hello.mybatis.domain.User"/>
<typeAlias alias="Order" type="com.zys.hello.mybatis.domain.Order"/>
</typeAliases>
类型句柄(typeHandlers)
当MyBatis 对 PreparedStatement 设置参数或者是从 ResultSet 获取结果时, 类型句柄被用将值转换为相匹配的 Java类型。MyBatis为基本的数据类型实现了默认的类型句柄。我们自己也可以实现句柄,只需要实现TypeHandler
接口,然后加入到配置中。
对象工厂(objectFactory)
每次 MyBatis 为结果对象创建一个新实例, 都会用到 ObjectFactory。 默认的 ObjectFactory 与使用目标类的构造函数创建一个实例毫无区别, 如果有已经映射的参数, 那也可能使用带参数的构造函数。 如果需要重写 ObjectFactory 的默认操作,你可以创建一个类,继承DefaultObjectFactory类并重写相应方法即可。
插件(plugins)
MyBatis 允许你在映射语句执行过程中某点上拦截调用。默认的, MyBatis 允许插件拦截以下调用:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
环境(environments)
MyBatis 可以配置多个环境。这可以帮助你 SQL 映射对应多种数据库等。
但是一个 SqlSessionFactory 实例对应一个数据库。
事务管理器
MyBatis 有两个事务管理类型:
- JDBC - 这个类型直接全部使用 JDBC 的提交和回滚功能。它依靠使用连接的数据源来管理事务的作用域。
- MANAGED - 这个类型什么不做, 它从不提交、 回滚和关闭连接。 而是让窗口来管理事务的全部生命周期。(比如说 Spring 或者 Java EE服务器。
数据源
数据源类型有三种: UNPOOLED, POOLED, JNDI。
UNPOOLED:数据源实现是在每次请求都打开和关闭一个连接。有以下几个属性:
- driver - 指定 JDBC 驱动器的 Java类
- url - 连接数据库实例的 URL 路径
- username - 登录数据库的用户名
- password - 登录数据库的密码
- defaultTransactionsolationLevel - 指定连接的默认事务隔离级别
POOLED:数据源缓存 JDBC 连接对象用于避免每次都要连接和生成连接实例而需要的验证时间。对于并发 WEB 应用,这种方式非常流行,因为它有最快的响应时间。除了UNPOOLED涉及的属性,还有:
- poolMaximumActiveConnections - 特定时间里可同时使用的连接数
- poolMaximumIdleConnections - 特定时间里闲置的连接数
- poolMaximumCheckoutTime - 在连接池强行返回前,一个连接可以进行‘检出’ 的总计时间
- poolTimeToWait - 并重新尝试重新连接,免得长时间的等待。
- poolPingQuery - Ping Query 是发送给数据库的 Ping 信息, 测试数据库连接是否良好和是否准备好了接受请求。 默认值是“NO PING QUERY SET”, 让大部分数据库都不使用 Ping, 返回一个友好的错误信息。
- poolPingEnabled - 设置 PingQuery 是否可用。 如果可用, 你可以使用一个最简单的 SQL 语句测试一下。默认是: false
- poolPingConnectionsNotUsedFor - 配置 poolPingQuery 多长时间可以用。通常匹配数据库连接的超时, 避免无谓的 ping。 默认: 0, 表示随时允许 ping, 当然, 必须在 poolPingEnabled 设为 true 的前提下。
JNDI:数据源实现是为了准备和 Spring 或应用服务一起使用,可以在外部也可以在内部配置这个数据源,然后在 JNDI 上下文中引用它。这个数据源配置只需要两项属性:
- initial_context - 这个属性是被用于上下文从 InitialContext 中(比如:initialContext.lookup(initial_context))查找。这个属性是可选的,如果被省略, InitialContext 将会直接查找 data_source 属性。
- data_source - 这是数据源实例能搜索到的上下文路径。它会直接查找 initial_context 搜索返回的值,如果 initial_context 没有值的话,直接使用 InitialContext 查找。
映射器(Mappers)
SQL语句映射文件,MyBatis 真正强大的地方,相比直接使用JDBC,不仅减少了大量代码,而且足够灵活。