首页 > 代码库 > Mybatis学习--XML配置文件详解
Mybatis学习--XML配置文件详解
在配置的Mybatis的时候,我们可以通过一个XML来配置,也可以嵌入到其他配置文件中,
比如Spring的applicationContext.xml中。
MyBatis 的 XML 配置文件包含了影响 MyBatis 行为甚深的设置和属性信息。 XML 文档 的高层级结构如下:
configuration 配置
properties 属性
settings 设置
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProvider chinese?
mappers 映射器
Properties
这些是外部化的, 可替代的属性, 这些属性也可以配置在典型的 Java 属性配置文件中, 或者通过 properties 元素的子元素来传递。例如:
<properties resource="org/mybatis/example/jdbc.properties">
</properties>
上面我们就引入了我们配置连接数据源的jdbc.properties连接属性然后我们就可以通过引用来使用,这一点和我们在使用spring配置数据源是一致的:
<dataSource type="POOLED">
<property name="driver" value=http://www.mamicode.com/"${driver}"/>
<property name="url" value=http://www.mamicode.com/"${url}"/>
<property name="username" value=http://www.mamicode.com/"${username}"/>
<property name="password" value=http://www.mamicode.com/"${password}"/>
</dataSource>
settings
settings是极其重要的配置, 它们会修改 MyBatis 在运行时的行为方式。 下面这个表格描述了一些设置信息的含义和默认值:
设置参数 | 描述 | 有效值 | 默认值 |
cacheEnabled | 这个配置使全局的映射器启用或禁用 缓存。 | true | false | true |
lazyLoadingEnabled | 全局启用或禁用延迟加载。当禁用时, 所有关联对象都会即时加载。 This value can be superseded for an specific relation by using the fetchType attribute on it. | true | false | false |
aggressiveLazyLoading | 当启用时, 有延迟加载属性的对象在被 调用时将会完全加载任意属性。否则, 每种属性将会按需要加载。 | true | false | true |
multipleResultSetsEnabled | 允许或不允许多种结果集从一个单独 的语句中返回(需要适合的驱动) | true | false | true |
useColumnLabel | 使用列标签代替列名。 不同的驱动在这 方便表现不同。 参考驱动文档或充分测 试两种方法来决定所使用的驱动。 | true | false | true |
useGeneratedKeys | 允许 JDBC 支持生成的键。 需要适合的 驱动。 如果设置为 true 则这个设置强制 生成的键被使用, 尽管一些驱动拒绝兼 容但仍然有效(比如 Derby) | true | false | False |
autoMappingBehavior | 指定 MyBatis 如何自动映射列到字段/ 属性。PARTIAL 只会自动映射简单, 没有嵌套的结果。FULL 会自动映射任 意复杂的结果(嵌套的或其他情况) 。 | NONE, PARTIAL, FULL | PARTIAL |
defaultExecutorType | 配置默认的执行器。SIMPLE 执行器没 有什么特别之处。REUSE 执行器重用 预处理语句。BATCH 执行器重用语句 和批量更新 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间, 它决定驱动等待一个数 据库响应的时间。 | Any positive integer | Not Set (null) |
safeRowBoundsEnabled | Allows using RowBounds on nested statements. | true | false | False |
mapUnderscoreToCamelCase | Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn. | true | false | False |
localCacheScope | MyBatis uses local cache to prevent circular references and speed up repeated nested queries. By default (SESSION) all queries executed during a session are cached. If localCacheScope=STATEMENT local session will be used just for statement execution, no data will be shared between two different calls to the same SqlSession. | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | Specifies the JDBC type for null values when no specific JDBC type was provided for the parameter. Some drivers require specifying the column JDBC type but others work with generic values like NULL, VARCHAR or OTHER. | JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER | OTHER |
lazyLoadTriggerMethods | Specifies which Object‘s methods trigger a lazy load | A method name list separated by commas | equals,clone,hashCode,toString |
defaultScriptingLanguage | Specifies the language used by default for dynamic SQL generation. | A type alias or fully qualified class name. | org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver |
callSettersOnNulls | 当结果集中含有Null值时是否执行映射对象的setter或者Map对象的put方法。此设置对于原始类型如int,boolean等无效。 | true | false | false |
logPrefix | Specifies the prefix string that MyBatis will add to the logger names. | Any String | Not set |
logImpl | Specifies which logging implementation MyBatis should use. If this setting is not present logging implementation will be autodiscovered. | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | Not set |
proxyFactory | Specifies the proxy tool that MyBatis will use for creating lazy loading capable objects. | CGLIB | JAVASSIST | CGLIB |
其实在很多时候,我们不需要去配置这么多信息,你只需要使用默认的值就可以了,除非你需要自定义状态。
typeAliases
类型别名和其他语言一样,就是用一个别名来代替你所指的对象,就好似Map的key和value一样,只不过两个都指的是一个东西,了解数据库同义词的朋友可能会更有体会。
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
这些别名的使用在官方文档中说的是仅仅在配置文件中使用。
别名的另外一种是自动扫描包中的注释来得到bean(我觉得spring里面用的多),比如:
<typeAliases>
<package name="domain"/>
</typeAliases>
这里domain指的是我们的实体包,我们的实体类定义如下:
@Alias("student")
public class Student{
...
}
如果说你的实体类中注解没有使用参数student,那么会创建一个Student bean对象,如果说你注解中定义了Alias(“student”),那么就会创建一个student bean ,我们在程序中就可以使用这个实体类
typeHandlers
这个是用来处理参数和格式化参数的,即查询SQL的输入参数和返回结果集的参数,他会根据你设置的类型来转换。
此外,Mybatis也提供了自定义类型处理,你可以实现org.apache.ibatis.type.TypeHandler
这个接口或者继承org.apache.ibatis.type.BaseTypeHandler类。例如:
// ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getString(columnName);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getString(columnIndex);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getString(columnIndex);
}
}
然后在配置文件中配置:
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
就可以使用了。
Handing Enums
如果你想使用枚举型,你可以使用EnumTypeHandler or EnumOrdinalTypeHandler,
EnumTypeHandler和其他handler不一样,他只处理继承enum的特殊类。
environments
MyBatis 可以配置多种环境。这会帮助你将 SQL 映射应用于多种数据库之中。例如, 你也许为开发要设置不同的配置, 测试和生产环境。 或者你可能有多种生产级数据库却共享 相同的模式,所以你会想对不同数据库使用相同的 SQL 映射。这种用例是很多的。
一个很重要的问题要记得:你可以配置多种环境,但你只能为每个 SqlSessionFactory 实例选择一个。
所以,如果你想连接两个数据库,你需要创建两个 SqlSessionFactory 实例,每个数据库 对应一个。而如果是三个数据库,你就需要三个实例,以此类推。记忆起来很简单:
· 每个数据库对应一个 SqlSessionFactory
databaseIdProvider
Mybatis能够根据你的数据库提供执行不同statemaent,这种多数据源提供功能是基于映射数据库ID来实现的。如我们这样配置:
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value=http://www.mamicode.com/"sqlserver"/>
<property name="DB2" value=http://www.mamicode.com/"db2"/>
<property name="Oracle" value=http://www.mamicode.com/"oracle" />
</databaseIdProvider>
mappers
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。 但是, 首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在这方面没有提供一个很好 的方法, 所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的 资源引用,或者字符表示,或 url 引用的完全限定名(包括 file:///URLs) 。例如:
<!-- Using classpath relative resources -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
以上内容源自Mybatis官网,部分地方有自己添加的见解和翻译
Mybatis学习--XML配置文件详解