Mybatis整合到Spring的一些问题总结

个人碰到以及问题搜查后的总结,如有错误,望大佬指正,如有不足,欢迎补充。

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的包添加扫描;

 3.3同名、包名问题

在注册映射文件时使用<package name="包名">标签时,需要映射文件名和接口名一样,不然会报错。这种方式,.xml的文件目录要和Mapper接口的目录结构相同

在注册映射文件时使用<mapper class="">mapper标签的class属性时,需要映射文件名和接口名一样,不然会报错。这种方式,.xml的文件目录要和Mapper接口的目录结构相同,否则访问不了

在注册映射文件时使用<mapper resource="org/xx/demo/mapper/xx.xml"/>,不需要映射文件名和接口名一样,这种方式,.xml文件可以直接放在resources目录下面

原因
包扫描形式时。实体类+Mapper接口通过动态代理调用方法,调用方法时会找其相应的映射配置文件
当多个mapper接口和mapper.xml同时存在,如果没有相同的名称,则动态代理就不能通过其一一对应的依赖配置文件创建其相应的实现方法

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值