在通过MapperScannerConfigurer启用了mybatis的映射器之后,默认情况下,在basePackage下的所有接口类都会被无条件的自动代理,如下所示:
<!--mapper 扫描配置 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--basePackage指定要扫描的包,在此包之下的映射器都会被 搜索到。可指定多个包,包与包之间用逗号或分号分隔 --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> <property name="basePackage" value="com.ld.platform.*.dao" /> </bean>
此时,无论com.ld.platform.*.dao下的类是否具有对应的实现类,在自动注入的时候,mybatis都会根据完整类型标识符去寻找相应的mapper.xml,如果找不到,则会报mybatis BindingException,有些时候,对于复杂的SQL语句,无法通过工具自动生成mapper,此时需要手工编写SQL,虽然可以在自动生成的mapper中自定义SQL文件,但是有些时候由其他项目组提供jar或者这些自动生成的mapper不允许被人工编辑。
如果希望这些自定义编写的SQL和之前版本一样通过@SqlSession进行增删改的话,需要将这些类放在basePackage匹配不到的路径。这样mybatis就不会自动去生成代理类了。
其实这种情况有较多项目组但是没有一个公共的架构师规划的系统中,这种情况是很常见的,毕竟开发人员的水平和经验参次不齐。而且有些时候,一厢情愿的认为技术上完全可以合并这是很天真的,因为大部分的公司多少存在着利益间的冲突。关于这一点,具体可参考http://www.cnblogs.com/zhjh256/p/6193254.html。