先约定两个概念:
我们知道:MyBatis常常涉及两个xml配置文件,一个叫【主配置文件】,里面可以配置数据源等;另一个叫【SQL配置文件】,里面可以写SQL代码。
请看两个代码片段:
片段1:
<mappers> <mapper resource="cn/liuxingchang/dao/AccountDao.xml" /> <mapper resource="cn/liuxingchang/dao/UserDao.xml" /> </mappers>片段2:
<mappers> <package name="cn.liuxingchang.dao" /> </mappers>片段1用于在MyBatis【主配置文件】里挨个注册【SQL配置文件】,片段2用于在MyBatis主配置文件里批量注册dao接口(java文件)。
假设我们采用的是dao的代理实现方式(无需手动编写dao实现类),并且已知,AccountDao接口在cn.liuxingchang.dao这个包下。
那么对于方式二,MyBatis怎么生成dao接口的代理实现类呢?肯定需要两部分的信息:【dao接口的信息】和【对应的SQL配置文件】,并且二者之间要能对应上。方式二已经给了接口所在的包,前面又已知该包下有个AccountDao接口,所以接口信息是知道了,还差【对应的SQL配置文件】,MyBatis默认会去resources目录(类路径)下的cn/liuxingchang/dao这个目录下去找AccountDao.xml(和AccountDao接口同名,且路径也一致!)
从上面可以看出,方式二还是很严格的。毕竟,你只给了包路径。在包路径下能找到所有的接口,所以代理实现类两部分信息中的【dao接口的信息】就知道了,但你又没有显式地给出【对应的SQL配置文件】,所以这个信息只能靠你和MyBatis之间的约定。这个约定是:【对应的SQL配置文件】要和dao接口同名,且在resources中 和包名一致的路径下 (包名叫cn.liuxingchang.dao,对应的SQL配置文件就得在resources中的cn/liuxingchang/dao下)。
另外,【dao接口】的方法名和【SQL配置文件】对应操作的id必须相同,这点很好理解。
如果是方式一呢?
对于方式一,代理实现类还是需要【dao接口的信息】和【对应的SQL配置文件】这两部分信息。
从resource的属性值中能找到【SQL配置文件】,还差【dao接口的信息】。能知道吗?还是又得像方式二那样,要靠我们和MyBatis之间的约定?
这回不需要靠约定,约定太严格了!
给出【SQL配置文件】中的一段代码:
<mapper namespace="cn.liuxingchang.dao.AccountDao"> <select id="findAll" resultType="cn.liuxingchang.domain.Account"> select * from account </select> </mapper>从namespace就能知道【对应的dao接口信息】!
所以方式一有如下两个不必:
1、【SQL配置文件】的名字不必和【对应的接口】相同!
2、【SQL配置文件】的路径不必和【对应的接口】的包名一致!