前面我们在使用 MyBatis 开发时,编写核心配置文件替换 JDBC 中的连接信息,解决了 JDBC 硬编码的问题。其实,MyBatis 核心配置文件中还可以配置很多的内容。
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。配置文档的顶层结构如下:
今天这篇文章一起来探讨 MyBatis 的核心配置文件中一些基本问题,具体的信息和使用教程参考 MyBatis 官网。
我们把数据库的连接信息配置在 XML 核心配置文件中,这个解决了 JDBC 硬编码的问题。在核心配置文件的
标签中使用 default='环境id'
属性指定使用哪一段
配置,id 是这一段
的唯一标识。
示例:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/blog?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="abc123"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/blog?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="abc123"/>
</dataSource>
</environment>
</environments>
注意:
尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。 所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,以此类推。
前面入门文章中说到,在映射配置文件中的 resultType
属性需要配置类的全限定名,例如:
<mapper namespace="org.chengzi.mapper.UserMapper">
<select id="selectAll" resultType="org.chengzi.pojo.Student">
select * from tb_user;
</select>
</mapper>
但是这样的书写方式是麻烦的,不方便的。所以 MyBatis 提供了 typeAliases 类型别名的方式简化这部分的书写。
要使用类型别名的方式,只需要在核心配置文件中添加以下内容:
<typeAliases>
<package name="org.chengzi.pojo"/>
typeAliases>
此操作相当于给 pojo 包中的所有类起别名,这个别名就是小写字母开头的类名,例如上面的 pojo 。此方法适用于在没有使用注解的情况下,如果使用了注解,别名就是其注解值,如下:
@Alias("author")
public class Author {
...
}
当然你还可以使用下面的方式给 Java 类设置一个别名,仅适用于 XML 配置文件,目的是降低冗余的全限定类名的书写。例如:
<typeAliases>
<tyoeAlias alias="Student" type="org.chengzi.pojo"/>
typeAliases>
每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。比如:
// ExampleObjectFactory.java
public class ExampleObjectFactory extends DefaultObjectFactory {
@Override
public <T> T create(Class<T> type) {
return super.create(type);
}
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
return super.create(type, constructorArgTypes, constructorArgs);
}
@Override
public void setProperties(Properties properties) {
super.setProperties(properties);
}
@Override
public <T> boolean isCollection(Class<T> type) {
return Collection.class.isAssignableFrom(type);
}
}
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<property name="someProperty" value="100"/>
objectFactory>
ObjectFactory 接口很简单,它包含两个创建实例用的方法,一个是处理默认无参构造方法的,另外一个是处理带参数的构造方法的。另外,setProperties 方法可以被用来配置 ObjectFactory,在初始化你的 ObjectFactory 实例后, objectFactory 元素体中定义的属性会被传递给 setProperties 方法。
这里只是 MyBatis 核心配置文件中的“冰山一角”,具体信息可以阅读官方文档,但是需要注意的 MyBatis 配置文件中各项配置有其顺序,不可以书写混乱的配置文件。如图:
下期见。