天天看点

mybatis的映射器(mappers)学习理解

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。例如:

<!-- Using classpath relative resources -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>      
<!-- Using url fully qualified paths -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>      
<!-- Using mapper interface classes -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>      
<!-- Register all interfaces in a package as mappers -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>      

这些配置会告诉了 MyBatis 去哪里找映射文件。

看到这有2个疑问:

1. 好像*Mapper.xml文件与*Mapper.java文件放在同一个包下可以减少一些配置。具体减少哪些呢?什么情况下*Mapper.xml文件与*Mapper.java文件必须放在同一个包呢?

2. 使用包名映射,是否包含子包下的接口映射,还是只当前包目录下的接口映射?

经过测试,得出以下结论:

1. 仅只使用映射接口方法时(没有对应的加载*Mapper.xml文件映射),*Mapper.xml文件与*Mapper.java文件放在同一个包下面。即:

使用

<mapper class="org.mybatis.builder.BlogMapper"/>      

或者

<package name="org.mybatis.builder"/>      

使用这个2种方式映射时,默认xml文件与接口文件在同一文件夹下。(集成spring使用自动扫描方式也是接口映射,此时也是默认xml与接口文件在同一文件夹下,如果在不同文件夹需要配置xml所在路径)

如果xml文件与接口文件不在同一个文件夹下,则必须使用下面方式配置:

<mapper resource="org/mybatis/builder/BlogMapper.xml"/>      

即:即使package配置后,还是必须使用resource方法配置,所以当xml文件与接口文件不在同目录的情况下,直接使用resource方法配置映射就好了。

2. 使用包名映射,会包含子包下的接口映射。即使用下面的包映射:

<package name="org.mybatis"/>      

这个映射会包含org/mybatis目录下的接口,以及org/mybatis/builder目录下的接口(如果还有下级接口仍然会深入遍历映射)。