引言

学过 MyBatis 框架的童靴都知道, MyBatis 支持 XML 和注解两种方式配置,如下:

使用 XML 方式配置

只写明 XML 的 resource 路径(或者URL路径)

<mappers>
    <mapper resource="com/UserMapper.xml"/>
 </mappers>
使用注解方式配置

只写明注解Mapper的类全路径名(这种方式只适合于只包含注解的配置)

<mappers>
    <mapper class="com.UserMapper"/>
</mappers>

我们知道,以上 XML 和注解方式各有利弊;有的童靴可能会想,那能不能 XML 和注解这两种方式一起用,这样可以尽量发挥各自的长处。答案是 MyBatis 可以同时使用 XML 和注解两种方式配置。

同时使用 XML 和注解方式配置(不同映射器接口类)
<mappers>
    <mapper resource="com/GameMapper.xml"/>
    <mapper class="com.UserMapper"/>
</mappers>

可以看到,以上两种方式配置是针对不同的映射器接口类。那么,是否可以在同一个映射接口类中同时使用 XML 和注解方式呢?答案依然是可以。

同时使用 XML 和注解方式配置(同一映射器接口类)
<mappers>
    <mapper class="com..UserMapper"/>
    <mapper resource="com/UserMapper.xml"/>
</mappers>
  • 这种方式一定要把类的配置写在 XML 的配置之前。

因为先解析完 mapper 之后,可以继续解析 xml,解析 xml 时如果判断 mapper 解析过之后则不会重复解析也不会抛错,但是如果先解析 xml,会向Configuration 中注册 Mapper,当之后解析 Mapper 时如果检测到有加载过则会抛出异常并终止程序创建 SqlSessionFactory。

  • 不允许对一个方法既XML 配置又注解,这会报错。

因为在解析每个 sqlmap 的时候会给其生成唯一的 ID,并存入 MapperRegistry 中,这个注册中心本质上是一个 HashMap,且不允许插入已经存在的 key 值,做插入操作时如果检测到已存在同名ID就会报错终止解析。

02-14 02:31