天天看點

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目錄下的接口(如果還有下級接口仍然會深入周遊映射)。