springboot和mybatis及mybatis-plus整合报错解决过程
我是看见别人的代码中使用了mybatis-plus框架,确实很方便。于是,从零开始搭建一个spirngboot,mybatis-plus框架,期间遇到了几个问题,使用各种方法解决了,加深了对于mp的认知。
首先使用mp的generator,这其中有两个比较重要的问题,都涉及其原理
- mp会要求用户输入表名,然后生成相应表的代码,而不是生成所有数据库表的代码,从实现和需求来说,这都是合理的。
- mp中依赖了前端框架velocity或者freemaker,很多人对此比较陌生,我也是。这些有什用呢?是要生成也页面代码吗?不是的,而是使用其java和xml的语法引擎,完成代码的xml代码和java代码的生成。
其它是模块名呀,目录选择问题,不懂就选择默认,或者多试几次,不是大问题。
重点是使用mp中遇到的问题,提供给大家参考
- 按照mybatis的使用思路,创建mapper相关的文件,在运行起来的时候报错,大概是 create UserMapper.class bean error,意思就是mapper对象没有创建成功,是什么错呢?
从原理上理解,mybatis会自动将UserMapper.class, UserMapper.xml生成一个对象呀。怎么去debug?基本只能code review,应为使用的框架,不是业务,没有数据。我们看到的只是问题的表面,如何进一步去定位问题?这就要从mybatis的工作原理出发,mybatis会在编译阶段,将两个文件打包到同一个目录下,于是去target目录看文件,发现他们竟然不在一起,就发现是创建目录的问题,多级目录不能用com.example.mes,而是逐级创建。
- 程序运行起来后,报 failed to create 'sqlSessionFactory' or 'sqlTemplate', 即对象创建失败
其实在早期使用spring框架时,我们手动创建SqlSessionFactory对象的,交给spring托管,为什么这里提示没有创建呢?我百度了一下,发现是pom文件中没有引入mybatis-spring-boot-starter。为什么加上这个就好了呢?我们其实可以打开这个jar包看一下,看到MybatisAutoConfiguration就明白了,是这个类起来作用。这就就是spring和springboot这两个框架在使用上的一个显著差别。
- 程序运行起来,报Invalid bound statement (not found): com.bt.mapper.UserMapper.listPage
说实话,这个问题,我们之前可能都遇到过,一般就是userMapper.xml文件中没有写sql语句。但问题是这股方法是BaseMapper的方法,并且是分页方法,这就使问题比较复杂了。明显是BaseMapper的方法没有实现,百度了一圈没有结果。时间也不多了。解铃还须系铃人,还得自己去想怎么解决。起初我以为mp的分页必须要写sql,那怎么办呢?
将问题降级,我自己在UserMapper中写方法,发现正常。于是说明UserMapper文件没有问题,是BaseMapper问题,但是一时又找不出问题在哪里,怎么办呢?这时就谦虚一点,下载mp官方样例工程,在本地运行,通过比对发现问题。我发现在mp工程中,listPage是没有问题的,说明不需要sql语句,那问题在哪里呢?大概技术pom文件不同吧,复制官方的pom文件,发现即好了。至此问题终于找到了,少了mybatis-plus-boot-starter,如下图所示:
说明啥,说明mp本身也是需要Configuration,否则不会加载Mybatis-plus相关的对象。
总结上面的问题,发现大部分都是pom文件的问题,都是引入相应的组件,但是没有starter而报错,这些starter就相当于一个桥梁,架起了springboot和组件的桥梁。那你可能奇怪了,为什么引入redis就没有starter呢?这是因为springboot有一个spring.factory文件,redis已经被收录了,程序编译时发现redis的包就会创建redis-connector对象,我们就可以直接使用了。
虽然使用原来的工程就不会报错,但是我们还要动手实践,理解原理,要知其然,知其所以然,这样,在遇到问题或改造时就会顺利的多。
参考资料:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2020-05-11 RMI远程方法调用和rpc远程过程调用