社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
用idea创建springboot项目后,在不注入service层的情况下,可以正常的启动工程以及访问controller的url请求,之后想整合Springboot-mybatis,查阅相关文档后,有博客介绍说可以在Springboot的全局配置文件里配置mybatis的mapper.xml的扫描路径,然后在mapper.xml指定Dao。现在pom里添加mybatis的依赖,如下:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependecy>
工程目录结构如下图:
BootApplication是入口类,Springboot遵循习惯大于配置的设计模式,默认的ComponentScan-basepakge是该入口类所在包以及其所在包的所有子包,上图的这个结构也是springboot官方推荐的结构,当然也可以通过@ComponentScan的自定义需要扫描的包。
全局配置文件如下:
各层级代码如下
dao层:
service层:
controller层:
原本以为神通广大的springboot配置到这里就可以启动了,各种依赖配置都会自动到位,mybatis通过mapper.xml会找到dao以及相关的entity,但是too young,启动后发现报了error creating bean with name‘userService’的错,具体的信息是userDao不是一个有效的Mapper,然后就开始了排错之旅:
1.首先错误指向Dao层就说明那就意味着mybatis没有扫描到dao,这其实是个低级错误,参考ssm框架的配置就会发现
2.随后在controller层注释掉了service的注入,去掉了service的注解,然后启动工程,报了sqlsessionFactory初始化失败的错。
问题到这就比较清晰了,在springboot的pom里添加了mybatis的依赖之后,sqlSessionFactory的初始化,以及mybatis的mapper接口等的配置springboot是没有进行管理的。必须参考ssm框架的配置来手动完成。
首先,我们需要一个Mybatis的基础配置类MybatisConfig。同时可以实现TransactionManagementConfigurer这个接口,重写annotationDrivenTransactionManager这个方法来处理事务。MybatisConfig这个类主要完成三件事:
1.初始化dataSource。在Springboot中,通过@PropertySource注入数据库相关的property文件,然后用@Value注解将其中的值注入到相应的属性当中,如下图:
2.初始化sqlSessionFactory。这一步需要完成dataSource的装配以及mapper.xml的扫描,entity层的扫描可以不写,也可以在全局配置文件里指定。如下图:
3.sqlSession的模板代理-SqlSessionTemplate的创建,将sqlSessionFactory注入到SqlSessionTemplate的构造方法中即可。
其次还需要配置Mybatis扫描dao层,在ssm里面我们通过装配MapperScannerConfigurer的basePackage属性来映射dao,boot里面同样如此。创建MapperScannerConfigurer类,注入basepackage和sqlSessionFactoryBean的值即可,如下图:
需要注意的是@AutoConfigureAfter(MybatisConfig.class)这个注解,旨在MybatsiConfig初始化后才加载本类,否则SpringBean工厂没有拿到sqlSessionFactory的实例,MapperScannerConfigurer会无法加载sqlSessionFactory。
至此,问题解决。以上是初学者个人愚见,有不对的地方还清指正,也欢迎大家留言交流。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!