MyBatis 详解(四)

发布于 2021-07-25  114 次阅读


核心配置文件(知道了解即可)

更加具体的配置文件说明,可点击后方连接了解。https://mybatis.org/mybatis-3/zh/configuration.html

环境配置(environments)

MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。

为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。可以接受环境配置的两个方法签名是:

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);

事务管理器(transactionManager)

在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):

  • JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
  • MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。例如:
  <transactionManager type="MANAGED">
    <property name="closeConnection" value="false"/>
  </transactionManager>

数据源(dataSource)

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源。

有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]"):

  • UNPOOLED:这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。 性能表现则依赖于使用的数据库,对某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。
  • POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
  • JNDI:这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。

属性(properties)

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:

<properties resource="db.properties">
  <property name="username" value="root"/>
  <property name="password" value="root"/>
</properties>

设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。比如:

<dataSource type="POOLED">
  <property name="driver" value="${driver}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</dataSource>

如果一个属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:

  • 首先读取在 properties 元素体内指定的属性。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。

类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

<typeAliases>
  <typeAlias alias="HelloUser" type="ml.guest997.pojo.User"/>
</typeAliases>

当这样配置时,HelloUser 可以用在任何使用 ml.guest997.pojo.User 的地方。

也可以指定一个包名,MyBatis 会在包名下面搜索需要的实体类。

<typeAliases>
  <package name="ml.guest997.pojo"/>
</typeAliases>

使用实体类的首字母小写的非限定类名来作为它的别名。(其实也能使用大写,但是为了区分是扫描包的,就统一规范使用小写的)比如 ml.guest997.pojo.User 的别名为 user;但是如果想要扫描包之后的特定实体类自定义别名,就可以使用注解,别名就为其注解值,见下面的例子:

@Alias("helloUser")
public class User {
    ...
}

映射器(mappers)

注册绑定 mapper 文件:告诉 MyBatis 到哪里去找到 sql 语句

方式一

<!--使用相对于类路径的资源引用-->
<mappers>
  <mapper resource="ml/guest997/mapper/UserMapper.xml"/>
</mappers>

方式二和三

<!--使用映射器接口实现类的完全限定类名-->
<mappers>
  <mapper class="ml.guest997.mapper.UserMapper"/>
</mappers>
<!--将包内的映射器接口实现全部注册为映射器-->
<mappers>
  <package name="ml.guest997.mapper"/>
</mappers>

要实现上面的两种方法,需要先满足一定的条件:

  • 接口和它的 mapper 配置文件必须同名
  • 接口和它的 mapper 配置文件必须在同一个包下

如果想分离接口和 mapper 配置文件,只需要在 resources 下创建和接口所在相同的包。因为这样编译后的 class 文件就会和 mapper 配置文件在同一个包下。