这两天由于工作上需要,和同事一起搞一个项目,项目很简单,只对一张表维护,数据来源于硬件设备,通过Socket传输。我主要负责设计和项目搭建,之前也搭过,是mybatis的,mybatis-plus的项目是用别人搭好的,自己没实践过,现在必须得弄了。两天的搭建过程中主要遇到三个问题,有一些新的思考,做个记录, 方便后面回顾学习,也希望能帮到同为工程师的我们。这是第一篇。

问题:baseMapper自带的方法不能使用

语言:java

框架:Spring boot + maven + Mybatis plus。这个就不用多说,Spring boot是在Spring框架上去配置化的升级,maven是现在广泛使用的包管理器,Mybatis是当下流程的JPA框架,Mybatis-plus是Mybatis的增强。

特殊的情况:我这里的那张表是年表,表名带有年份后缀,也就是说动态表名

项目开始是用的Mybatis。pom文件中用的mybatis-spring-boot-starter 2.0.0,用2.0.0主要也是从另一个用MyBatis的项目拷贝过来的,比较随意:

application.yml也是简单通用的Mybatis配置:

先写死表名,用起来没啥问题,后面由于要使用到Mybatis-plus的一些新特性,saveOrUpdate、selectById等,可以用baseMapper自带的DML功能,减少mapper语句的编写,另外MyBatis-plus有动态表名功能,于是把Mybatis换成Mybatis plus,当时pom中就是简单加了mybatis-plus的坐标,当时用3.4.0这个版本主要是在网上查到MyBatis-plus动态表名是3.4.0版本才有的:

接着发现baseMapper自带的方法不能使用,调用baseMapper.xxx报错:

这就让我比较疑惑了,公司另外的项目也是这样用的啊。Service extends IService,ServiceImpl extends Service,Mapper extends BaseMapper<T>:

自己的mapper也不用写selectList那些,为什么我这里就报找不到语句呢?网上查了下有人说是Mapper接口中没有指明实体,一看我也指明了,而且不指明也会报错吧。看来不是这个问题,然后又查了下,有人说是如果用Mybatis-plus,要用MybatisSqlSessionFactoryBean,不能用默认的SqlSessionFactory,试了下:

这种情况,application.yml可以不用配置mapper-locations、type-aliases-package:

但启动报错,这个问题将在第二篇说到。解决错误后,服务可以启动,语句也能调用到:当前表中确实有一列不存在报错,先不用管。至少baseMapper的语句可以调用了,但是隐约感觉哪里不对啊,另一个项目也没设置sqlSessionFactory,感觉没找到根本问题。

当前groupId com.baomidou,artifactId mybatis-plus,version 3.1.0找到的问题原因:需要特别配置SqlSessionFactory。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐