不是啥高深的技术,初学小白才会遇到的小坑
先说说最近在公司的实习,接触到公司的框架是 SpirngBoot + Mybatis + Mybatis-Plus
的一个核心框架,在开发的初期,建表后有模板直接生成 Dao、Pojo、Service、ServiceImpl
等,基础的增删查改都被帮你写好了,只需要关注业务逻辑,好处就是开发快了,缺点我觉得就是大量的代码冗余,当然能把程序员从最基本的增删查改解放出来我还是非常认同的。正因为如此,很多底层的东西都被屏蔽了,所以最近在自己搭建时实验环境中出现了一些小问题,记录记录。
最近在学习若依管理系统,我发现若依系统里面的代码无论是规范还是用到的技术来说,都非常值得我这个刚入门的小白学习,然而最近在自己搭建实验环境的时候,根据若依的数据库我建立了一个名为 my-test
的数据库,然后使用 EasyCode
插件的默认模板生成了测试代码,在 XML
文件中出现了无法转移字符的报错:
Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-category where id = 1' at line 3
联想到最近测试的时候(记不太清了不过大概是这样)使用一个 HashMap
存放了一个键值对 “sort”:"id desc
然后往 mapper.xml 里传,实际运行后发现打印的查询语句中 id desc
根本就没有包含进来,猜测是因为 sort 是关键字,那么这次应该也是关键字
于是尝试用不同的组合测试发现问题就是 “-” 字符,查询语句会出错,问题解决,只需要把 “-” 替换为下划线即可。当你没有系统的学习一个知识,就容易踩坑,区别只是你的排查和学习速度。
此时在我的 pom.xml
文件中有 mybatis
和 mybatis-plus
的依赖,要让框架扫描到 xml
文件并且映射到对应的 dao
上还是需要进行配置的,按照惯例,我在 application.properties
中如下配置:
mybatis.mapper-locations=classpath:mapper/*.xml
然后就失效了,查询的时候会报 dao
没有找到对应查询语句的 id,其实在引入 mybatis-plus
后,正确的配置应当是
mybatis-plus.mapper-locations=classpath:mapper/*.xml
其中的 clssspath
还是值得初学者深究的一个东西。
首先 clssspath
与 clssspath*
的区别:
clssspath
代表匹配一个文件
clssspath*
这个前缀代表匹配多个文件
在 SpringBoot
项目中,classpath 代表了项目打包后的根路径,换个说法,当你运行 SpringBoot项目,目录中会多出一个 target
文件,其中的 classes
文件夹就是项目打包的资源文件,因此,当你配置了
mybatis-plus.mapper-locations=classpath:mapper/*.xml
实际上它找到的是 target/classes/mapper/*.xml
入门小白,才学疏浅,若有疏漏,欢迎指出。
本文首次更新时间 2020-04-25
本文最后更新时间 2020-04-25 (若有突破,持续更新)