四、对于ibatis是在实现类里的操作方法是怎么找到对象对应的映射文件的?
实现类:
Reader reader = Resources.getResourceAsReader("com/braint/ibatis/SqlMapConfig.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
查询方法:
roleList = sqlMapClient.queryForList("searchRole",map);
SqlMapConfig.xml可配置多个sqlMap
<sqlMap resource="com/braint/ibatis/Role1.xml"/>
<sqlMap resource="com/braint/ibatis/Role.xml"/>
这里只有加载SqlMapConfig.xml,操作的时候并不知道到底是调用哪一个,前面一直在研究配置文件的写法和调用,忽视了到底是怎么用的。测试了一个,写了两个sqlMap,就出错。
网络上对于这个问题很少,因为对数是使用与spring结合,使用spring提供的dao模版来操作多个对象对应的映射文件,而且ibatis新版本取消了自己的dao模版(2.0的有)。为了弄清楚这个原理,看了源码,实在太长,看了很久,最终也没看懂。
偶然间看到一个<sqlMap namespace="">节点有个namespace属性,心想是否是利用这个值找对应的映射文件?
于是在Role.xml中配置<sqlMap namespace="Role">,执行,依旧报错。。。
再SqlMapConfig.xml配置<settings useStatementNamespaces="true"/>,执行,还是错。。。
但是这次报错不一样了,提示There is no statement named searchRole in this SqlMap.按提示应该是直接在SqlMapConfig.xml这里找searchRole方法。
由此提示想到了实现类里的方法改为sqlMapClient.queryForList("Role.searchRole");正常了。。。
总结:
①配置SqlMapConfig.xml配置<settings useStatementNamespaces="true"/>
②Role.xml中配置<sqlMap namespace="Role">
③实现类调用sqlMapClient.queryForList("Role.searchRole")
#如果配置为<sqlMap namespace="RoleSpace">,实现类也要改为sqlMapClient.queryForList("RoleSpace.searchRole")不知道ibatis的这样用法是不是基本没人用了,网络上查了很多资料都没有,但最终还是解决问题。
使用spring的模版应该会更简单,就跟hibernate的模版一样吧,不过现在还没和spring结合不清楚。