MyBatis持久层框架详细解读:核心配置文件

文章目录

  • 1. 前言
  • 2. 多环境配置
  • 3. 类型别名
  • 4. 对象工厂
  • 5. 总结

1. 前言

前面我们在使用 MyBatis 开发时,编写核心配置文件替换 JDBC 中的连接信息,解决了 JDBC 硬编码的问题。其实,MyBatis 核心配置文件中还可以配置很多的内容。

MyBatis持久层框架详细解读:核心配置文件_第1张图片

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。配置文档的顶层结构如下:

MyBatis持久层框架详细解读:核心配置文件_第2张图片

今天这篇文章一起来探讨 MyBatis 的核心配置文件中一些基本问题,具体的信息和使用教程参考 MyBatis 官网。

2. 多环境配置

我们把数据库的连接信息配置在 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 实例,以此类推。

3. 类型别名

前面入门文章中说到,在映射配置文件中的 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>

4. 对象工厂

每次 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 方法。

5. 总结

这里只是 MyBatis 核心配置文件中的“冰山一角”,具体信息可以阅读官方文档,但是需要注意的 MyBatis 配置文件中各项配置有其顺序,不可以书写混乱的配置文件。如图:

MyBatis持久层框架详细解读:核心配置文件_第3张图片

下期见。

你可能感兴趣的:(JavaWeb基础教程系列,mybatis,java,mysql)