十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。
网站建设哪家好,找创新互联公司!专注于网页设计、网站建设、微信开发、微信小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了会同免费建站欢迎大家使用!
文档的顶层结构如下:
configuration 配置
properties 属性
settings 设置
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProvider 数据库厂商标识
mappers 映射器
properties 属性
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递,配置示例:
配置 properties 后,可以在其他配置中使用 property,示例如下:
这个例子中的 username 和 password 将会由 properties 元素中设置的相应值来替换。
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
在 properties 元素体内指定的属性首先被读取。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性
MyBatis 3.4.2 增加了默认值,可以通过 ${username:ut_user} 来设置默认值,可以通过配置 property 来启用默认值,或者设置默认值的分隔符,如下配置:
settings 属性
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为,完整属性及说明表可以参考链接。一个配置完整的示例如下:
typeAliases 属性
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。指定别名配置如下:
也可以指定一个包名,MyBatis 会搜索包名下面的需要的 Java Bean ,比如:
每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。看下面的例子:
@Alias("author") public class Author { ... }
已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理,内建相应的类型表参见链接 。
typeHandlers 属性
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型,默认的类型处理器参考链接。可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型,示例代码:
自定义TypeHandler 代码
package org.mybatisExamples.simple; import java.sql.*; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; // 继承基类重写方法,通过类型处理器的泛型,MyBatis 可以得知该类型处理器处理的 Java 类型 public class StringTypeHandler extends BaseTypeHandler{ @Override public String getNullableResult(ResultSet arg0, String arg1) throws SQLException { System.out.printf("getNullableResult arg1=%s%n", arg1); return arg0.getString(arg1); } @Override public String getNullableResult(ResultSet arg0, int arg1) throws SQLException { System.out.printf("getNullableResult arg1=%d%n", arg1); return arg0.getString(arg1); } @Override public String getNullableResult(CallableStatement arg0, int arg1) throws SQLException { System.out.printf("getNullableResult arg1=%d%n", arg1); return arg0.getString(arg1); } @Override public void setNonNullParameter(PreparedStatement arg0, int arg1, String arg2, JdbcType arg3) throws SQLException { System.out.printf("Index=%d Value=%s JdbcType=%s%n", arg1, arg2, arg3); arg0.setString(arg1, arg2); } }
配置文件代码:
通过类型处理器的泛型,MyBatis 可以得知该类型处理器处理的 Java 类型,不过这种行为可以通过两种方法改变:
在类型处理器的配置元素(typeHandler element)上增加一个 javaType 属性(比如:javaType="String");
在类型处理器的类上(TypeHandler class)增加一个 @MappedTypes 注解来指定与其关联的 Java 类型列表。 如果在 javaType 属性中也同时指定,则注解方式将被忽略。
可以通过两种方式来指定被关联的 JDBC 类型:
在类型处理器的配置元素上增加一个 jdbcType 属性(比如:jdbcType="VARCHAR");
在类型处理器的类上(TypeHandler class)增加一个 @MappedJdbcTypes 注解来指定与其关联的 JDBC 类型列表。 如果在 jdbcType 属性中也同时指定,则注解方式将被忽略。
当决定在
typeHandlers 属性处理枚举类型
若想映射枚举类型 Enum,则需要从 org.apache.ibatis.type.EnumTypeHandler 或者 org.apache.ibatis.type.EnumOrdinalTypeHandler 中选一个来使用。比如说我们想存储取近似值时用到的舍入模式。默认情况下,MyBatis 会利用 EnumTypeHandler 来把 Enum 值转换成对应的名字。
注意EnumTypeHandler 在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,它会处理任意继承了 Enum 的类。
不过,我们可能不想存储名字,相反我们的 DBA 会坚持使用整形值代码。那也一样轻而易举: 在配置文件中把 EnumOrdinalTypeHandler 加到 typeHandlers 中即可, 这样每个 RoundingMode 将通过他们的序数值来映射成对应的整形,配置示例:
自动映射器(auto-mapper)会自动地选用 EnumOrdinalTypeHandler 来处理, 所以如果我们想用普通的 EnumTypeHandler,就非要为那些 SQL 语句显式地设置要用到的类型处理器不可。
objectFactory(对象工厂)
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现,示例代码:
package org.mybatisExamples.simple; import java.util.List; import java.util.Properties; import org.apache.ibatis.reflection.factory.DefaultObjectFactory; @SuppressWarnings("serial") public class ExampleObjectFactory extends DefaultObjectFactory { @Override publicT create(Class type) { System.out.println("create is type=" + type.getName()); return super.create(type); } @Override public T create(Class type, List > constructorArgTypes, List