学过 MyBatis 框架的童靴都知道, MyBatis 支持 XML 和注解两种方式配置,如下:
只写明 XML 的 resource 路径(或者URL路径)
<mappers>
<mapper resource="com/UserMapper.xml"/>
</mappers>
只写明注解Mapper的类全路径名(这种方式只适合于只包含注解的配置)
<mappers>
<mapper class="com.UserMapper"/>
</mappers>
我们知道,以上 XML 和注解方式各有利弊;有的童靴可能会想,那能不能 XML 和注解这两种方式一起用,这样可以尽量发挥各自的长处。答案是 MyBatis 可以同时使用 XML 和注解两种方式配置。
<mappers>
<mapper resource="com/GameMapper.xml"/>
<mapper class="com.UserMapper"/>
</mappers>
可以看到,以上两种方式配置是针对不同的映射器接口类。那么,是否可以在同一个映射接口类中同时使用 XML 和注解方式呢?答案依然是可以。
<mappers>
<mapper class="com..UserMapper"/>
<mapper resource="com/UserMapper.xml"/>
</mappers>
因为先解析完 mapper 之后,可以继续解析 xml,解析 xml 时如果判断 mapper 解析过之后则不会重复解析也不会抛错,但是如果先解析 xml,会向Configuration 中注册 Mapper,当之后解析 Mapper 时如果检测到有加载过则会抛出异常并终止程序创建 SqlSessionFactory。
因为在解析每个 sqlmap 的时候会给其生成唯一的 ID,并存入 MapperRegistry 中,这个注册中心本质上是一个 HashMap,且不允许插入已经存在的 key 值,做插入操作时如果检测到已存在同名ID就会报错终止解析。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章