首页 > 技术文章 > Mybatis的xml配置(mybatis-config.xml)精简笔记

threepure 2021-04-26 21:00 原文

老规矩,看着官方文档

首先,我们需要知道的是,在MyBatis 的xml配置文件中,这些影响 MyBatis 行为的属性之间的设置是有先后顺序的。配置的先后顺序依照properties, settings, typeAliases, typeHandlers, objectFactory, objectWrapperFactory, reflectorFactory, plugins, environments, databaseIdProvider, mappers进行排列。因为其中有部分是不常用的,这里只记录常用的几种,其他属性使用到了再添加吧。


1. properties

<properties>标签是在MyBatis配置文件中配置properties文件properties文件是一种属性文件,通过以key=value格式存储内容,Java中可以使用Properties类来读取这个文件。而在MyBatis配置文件中<properties>标签是通过引入properties文件来配置数据库连接信息。常用的properties文件配置数据库主要配置如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/*****?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=****

在MyBatis 的xml配置文件中,通过resource方式引入这个properties文件(如果这个properties文件在项目的resources目录下,则不需要全路径)。当然,<properties>标签内还有一个<property name="***" value="***"/>标签,这是也可以单独设置某个键值。简单的讲,就是可以在properties文件中设定某个键值,另外也可以在<properties>标签内加入一个键值;也可以同时在这两个地方设置同一个键值。

<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="dev_user"/>
  <property name="password" value="F2Fa3!33TYyg"/>
</properties>

虽然可以在properties文件和标签中同时设置,但是他们之间的优先级是不一样的。另外,根据官网我们可以知道也可以通过在 SqlSessionFactoryBuilder.build() 方法中传入属性值来进行设置。如果一个属性在不只一个地方进行了配置,那么,MyBatis 将先读取在 properties 元素体内指定的属性,再根据 properties 元素中的 resource 属性读取类路径下属性文件。最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。
已经有了上述方法来获得数据库连接信息,那么接下应该怎样去使用这些数据呢?———这些数据将会被用于配置MyBatis的environments属性。总结以下:

2. environments

MyBatis 可以配置成适应多种环境,比如开发和测试测试可以配置不同的环境;environments的配置包含若干个environment元素;通过default属性设置默认的环境,这里添加的参数为某一个environment的id。<environment>的配置由<transactionManager >dataSource 两个元素组成。transactionManager 是指事务管理器,在 MyBatis 中有两种类型的事务管理器(也就是 type=[JDBC|MANAGED];dataSource 是指数据源,有三种内建的数据源类型(也就是 type=[UNPOOLED|POOLED|JNDI]);

JDBC 和 MANAGED 区别:
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期
如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

UNPOOLED|POOLED|JNDI的区别
UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。也就是不设置数据池
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来
JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用

看似environment元素配置很繁琐,但是一般在使用中按如下方式配置就行了,其他需求参考官方文档即可。

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <dataSource type="POOLED">
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>

这里property 元素就是用于配置数据库的连接信息,用到了properties元素中的driver、url、username、password值。通过value=${}的形式获取到这个值。

3. typeAliases

类型别名可为Java类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。比如我的User类,每次都在使用时写长长的一条包名。先来对比一下使用别名和不使用别名的区别吧。

<!--使用别名-->
<select id="getUserList" resultType="user">
     select * from mybatis.user
</select>
<!--不使用别名-->
<select id="getUserList" resultType="com.th.pojo.User">
     select * from mybatis.user
</select>

可以明显的对比说明别名确实很让代码更加简单。
有3种方式设置别名,第一可以通过typeAliases标签的typeAlias属性配置单个Java类型的别名。

<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
</typeAliases>

第二种是利用typeAliasespackage 属性配置整个包下的所有Java类型的别名;通过配置整个包的别名,MyBatis 会在包名下面搜索需要的 Java Bean,会使用 Bean 的首字母小写的非限定类名来作为它的别名。当然前提条件是没有通过注解设置别名的情况下。

<typeAliases>
<package name="domain.blog"/>
</typeAliases>    

第三种是通过给一个Java Bean添加一个注解@Alias("别名"),从而实现设置别名。这个注解是MyBatis的import org.apache.ibatis.type.Alias;切记不是其他包下的注解。需要注意的是,使用了注解的方式,那么所有使用了别名的地方都要使用这个注解设置的别名。
至于一些为常见的 Java 类型内建的类型别名,可以通过官方文档进行查询。

4. settings

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。但是现在我们并不需掌握太多。着重记住以下几条就好。

5. mappers

mapper用于SQL 映射。对于mapper我们早就不陌生了,在入门的时候我们就遇到了。MyBatis 的配置文件,也就是我们说的mybatis-config.xml文件就相当于整个MyBatis项目的总管家。当需要需要进行查询的时候首先是调用Dao层的接口方法,而接口中的方法只是定义,而没有实际操作;真正的SQL语句是在XXXMapper.xml文件中。很显然,我们需要把这个接口跟XXXMapper.xml对应起来。这时你可能会觉得这不是通过XXXMapper.xml文件的命名空间进行确定的嘛。这也没错,通过命名空间与这个接口绑定了,通过id属性与接口中的方法进行绑定。而配置文件的<mappers>标签,就是讲所有的XXXMapper.xml文件进行注册,使得所有XXXMapper.xml文件都具有与接口进行绑定的属性,而这些配置会告诉 MyBatis 去哪里找映射文件。只有这个总管家“备案”了,这个XXXMapper.xml文件才能合法正常地被使用。mappers地配置有以下4种情况。其中使用相对于类路径的资源引用和将包内的映射器接口实现全部注册为映射器的方式使用较多。

  1. 使用相对于类路径的资源引用
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
</mappers>

这种方式就是单个的注册映射文件,通过项目下的全包名方式找打映射文件,注意包与下级包之间使用/分开而不是.

  1. 将包内的映射器接口实现全部注册为映射器
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

这种方式注册映射器的形式typeAliases的package的形式是一样的,都是使得整个包下所有的XXXMapper.xml自动注册。

  1. 使用映射器接口实现类的完全限定类名
<mappers>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
  1. 使用完全限定资源定位符(URL)
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>

推荐阅读