首页 > 代码库 > Mybatis学习--XML配置文件详解

Mybatis学习--XML配置文件详解

在配置的Mybatis的时候,我们可以通过一个XML来配置,也可以嵌入到其他配置文件中,

比如SpringapplicationContext.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

 类型别名和其他语言一样,就是用一个别名来代替你所指的对象,就好似Mapkeyvalue一样,只不过两个都指的是一个东西,了解数据库同义词的朋友可能会更有体会。

<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配置文件详解