简介
MyBatis配置包含 settings 和 properties,对Mybatis的行为有巨大影响。整个文档的结构如下图:
-
properties
使用 properties 节点可以引入一个 java 属性文件,可以直接在属性文件中添加各个属性。也可以在子节点property添加属性。 引入属性文件:
<properties resource="db.properties"></properties>
db.properties:
driver=com.MysqL.jdbc.Driver url=jdbc:MysqL:///mybatis username=root password=123456
<properties resource="db.properties"> <property name="username" value="root"></property> </properties>
还有一种使用方法:将properties作为入参传入sqlSessionBuilder.build()方法中,具体使用方式如下:
Properties props = new Properties(); props.setProperty("username","root"); Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); sqlSessionFactory factory = new sqlSessionFactoryBuilder().build(reader,props); String username = factory.getConfiguration().getVariables().getProperty("username");
注:但很少这样使用。
注意:如果一个属性存在多个地方,则他们按照下面顺序进行加载:
(1)在properties元素体中指定的属性首先被读取
(2)从properties元素的类路径resource或url指定的属性第二个被读取,并且覆盖指定的重复的属性。
(3)properties作为一个方法参数最后被读取,并且覆盖元素体或类路径 resource 或 url 指定的重复的属性。
因此优先级最高的是作为一个方法的参数,接下来是从类路径resource或url中读取,最后是从元素体重指定的属性被读取。
-
settings
这个节点作为修改Mybatis的行为在运行时的方式非常重要的调整。以下是具体每个setting和它的含义,以及它们的默认值。
!cacheEnabled: 在Global范围内启用或禁止在该配置下任何映射任何缓存配置。默认为true,启用状态。
!lazyLoadingEnabled: 在Global范围内启用或禁止懒加载。当启用时,所有关联关系将会设为懒加载。这个值在一个指定的关联关系中可以被fetchType属性覆盖它。默认值为false,禁止懒加载。
!aggressiveLazyLoading: 激进的延迟加载策略。当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。默认为true。
multipleResultSetsEnabled: 支持多个结果集。允许或禁止从一条命令返回多个结果集(前提是对应数据库驱动兼容)。默认为true,开启状态。
useColumnLabel: 使用列标签替代列名。关于这个不同的驱动有不同的解释。默认为true。
useGeneratedKeys: 允许JDBC支持主键,需要一个兼容的驱动。这个设置面向生成的主键,如果设置为true。一些驱动不兼容此属性,但还是会工作。默认为false。
autoMappingBehavior: 自动映射行为。指定Mybatis是否和怎么自动映射列和实体类属性。NONE:不支持自动映射。PARTIAL:局部的,只会映射没有嵌套映射在其中的映射。FULL:将会自动映射任何复杂的结果的映射。默认为局部的。
defaultExecutorType: 配置默认的执行者。SIMPLE:执行者什么都不做。REUSE:重用。执行者重用预命令。BATCH:批量,执行者重用命令和批量更新。默认为SIMPLE。
defaultStatementTimeout: 设置驱动从数据库获取响应的等待秒数。值可以是任何正整数。默认没有设置(null)。
safeRowBoundsEnabled: 允许对嵌套语句使用 RowBounds。默认为 false。
!mapUnderscoreToCamelCase: 支持经典的数据库命名规范A_COLUMN与经典的java类属性名 aCloumn 之间的映射。 默认为false.
localCacheScope: 本地的缓存范围。Mybatis使用本地缓存阻止循环引用和加速嵌套查询。SESSION:所有查询在一个session范围内执行会被缓存。STATEMENT:本地Session将只会在命令范围内被使用,同样的sqlSession被两次不同的调用,之间的数据不会共享。默认为SESSION。
jdbcTypeForNull: 当没有指定jdbc类型是被那个参数提供的,为null值指定JDBC类型。一些驱动要求指定jdbc列类型,但是其它的一般使用 NULL,VARCHAR 或者 OTHER。默认为OTHER。
lazyLoadTriggerMethods: 懒加载的触发方法。指定对象的哪个方法去触发懒加载。值:方法列表可以用","分割。 默认值:equals,clone,hashCode,toString
defaultScriptingLanguage: 指定默认的语言用于动态sql的生成。值:别名或全类名。默认值为:org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver
callSettersOnNulls: 当一个索引值为null,指定该值的setter或map的put方法是否被调用。它是有用的,当你依赖Map.keySet()或空值初始化。注意 int,boolean 不会被设置为null。 默认为false.
logPrefix: 指定Mybatis添加到日志名称的前缀。 默认值:no set.
logImpl: 指定实现Mybatis的日志使用哪个实现,如果没有指定,将会自动查找。值:SLF4J | LOG4J | LOG4J2| JDK_LOGGING |COMMONS_LOGGING| STDOUT_LOGGING |NO_LOGGING. 默认没有设置。
**proxyFactory:**代理工厂。指定代理工具,那Mybatis将会创建能够懒加载的对象。
下面是设置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="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <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,toString"/> </settings>
-
typeAliases
简介:一个类型的别名是一个Java类型的简写名字。这是唯一的xml配置相关。用来简化全限定类名。 例子1:
<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>
使用以上配置,Blog能在任何地方domain.blog.Blog使用的地方使用。
同样也可以指定一个包,Mybatis会查找这个包下的beans。 例子2:
<typeAliases> <package name="domain.blog"/> </typeAliases>
每个被查找到的bean,如果没有注解,则默认使用这个类的简短类名。如 domain.blog.Author会被注册为author. 如果有@Alias("author")注解,则使用注解中的值
@Alias("author") public class Author { ... }
也包含许多内建的类型:
4.typeHandlers
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler,当我们没有配置指定 TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。
以下是默认的类型处理器:
可以通过以下方式来自定义类型处理器: 可以通过覆盖的方式或者创建自己的处理器来处理不支持或非标准的类型。
(1)实现org.apache.ibatis.type.TypeHandler接口。 (2)继承org.apache.ibatis.type.BaseTypeHandler为其指定映射类型为jdbc类型。
@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="com.nucsoft.mybatis.typehandler.ExampleTypeHandler"/> </typeHandlers>
使用上面的typehandler将会重写已经存在的Java字符串属性和VARCHAR参数和结果typehandler.
注意:Mybatis 不会自动的将数据库数据转化为定义的类型,所以你必须在类型处理器指定,这是一个 VARCHAR 字段在参数和结果映射。 这是由于直到命令被执行前实际上 Mybatis 不知道数据类型。
MyBatis会知道你想通过泛型类型与该类型处理器来处理的Java类型,但是你可以通过两种方式覆盖此行为。
(1)为typeHandler元素添加一个javaType属性(配置文件)(如:javaType="String")
(2)增加一个@MappedTypes注解在TypeHandler类上,指定的Java类型列表将与其关联。如果javaType属性被指定,则该注解会被忽略。
被关联的JDBC类型能被两种方式指定:
(1)为typeHandler元素添加一个jdbcType的属性(配置文件)(如:jdbcType="VARCHAR")
(2)增加一个@MappedJdbcTypes注解在TypeHandler类上,指定的jdbc类型列表将与其关联。如果jdbcType属性被指定,则该注解会被忽略。