个人碰到以及问题搜查后的总结,如有错误,望大佬指正,如有不足,欢迎补充。
1、application.xml中sqlsessionFactoryBean中配置mapperlocations的问题
如果Mapper.xml与Mapper.class在同一个包下且同名,spring扫描Mapper.class的同时会自动扫描同名的Mapper.xml并装配到Mapper.class
如果Mapper.xml与Mapper.class不在同一个包下或者不同名,就必须使用配置mapperLocations指定mapper.xml的位置
2、Dao层@Repository和@Mapper注解问题
2.1在application.xml中配置MapperScannerConfigur 的作用就是让它扫描指定的包,然后由容器自动批量地创建映射器,减少代码(就不需要在dao/mappper接口上加注解@Mapper了)
2.2@Mapper 是 Mybatis 的注解,和 Spring 没有关系,用于告诉sprigng框架此接口的实现类由Mybatis负责创建,并将其实现类对象存储到spring容器中@Repository 是 Spring 的注解,用于声明一个 Bean
@Mapper注解是识别他为的mapper接口,目的就是为了不再写mapper映射文件,是注解开发时用的。如果是springboot,在启动类中使用@MapperScan("mapper接口所在包全名")即可,不用一个一个的在Mapper接口中加@Mapper注解
2.3区别:
-
使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中;使用MapperScannerConfigur或MapperScan 可以不再需要在所有接口中都配置mapper注解。通常Idea中service的实现类注入mapper接口时报红并不是错 而是由于动态生成导致
-
@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中
3、mapper.xml的位置以及命名
3.1、在resources创建一个跟mapper接口一样的包,这是一种约定优于配置的方式,编译的时候就会直接把xml编译到类路径的dao包中,resources实际是一个虚拟的路径,两个文件算是同名包路径下,所以编译后会编译到同一个包下,且在maven打包的时候就会将src/main/java和src/main/resources相同包下的文件合并到同一包中。
3.2接口和文件放在同一个包中,这就需要在pom文件中做如下配置
这是因为在默认的情况下maven打包的时候,对于src/main/java目录只打包源代码,而不会打包其他文件。所以此时如果把对应的mapper文件放到src/main/java目录下时,不会打包到最终的jar文件夹中,也不会输出到target文件夹中。配置后,在打包的时候也会将mapper文件打包到/target文件夹中
结合1中所述,同包且同名时Mybatis进行自动扫描,不需要配置xml文件位置,只需扫描mapper包就行,当在resource下创建同包同名时,编译后达到效果,但当都在mapper包下时就需要上述maven配置;而当不同包下时还要保证两者映射成功的话就需要在配置文件中,分别将mapper和mapper.xml的包添加扫描;