想做个展示食堂菜单的功能,用的若依二开,本来打算用jpa,无奈实在不怎么顺利,铜鼓一天都没有进展,想着过两天要开发核心功能了——“留给中国队的时间不多了"——于是深夜24:00 决定,换写法。
问下ai,感觉mybatis-plus的写法也很优雅,遂记录一下学习过程。
1首先是在项目中集成mybatis-plus
在pom.xml添加,(作者写这篇文章是24/10/28 vol 3.5.9是24号发布的)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.9</version>
</dependency>
复制粘贴完毕后,选择重新加载maven。
2 设计实体类
尽管jpa不需要@TableName注解,但是在注入mybatis-plus 这种ORM框架时,@TableName是必不可少的,他用来明确指定实体类与数据表之间的映射关系。
@TableName("真实库表名")
将它摆在这里就好
3 制作mapper接口
看起来,我们的进度已经过半了,胜利在望
在MVC架构下,不出意外大家都会有一个mapper层,直接写在里面就可以
(不要忘了@mapper 注解)
//自定义查询方法
@Select("SELECT * FROM cookiemenu_design where DATE (date) = CURDATE()")
List<CookiemenuDesign> getCookiemenuDesign();
在这段中
@Select 用于编写自定义的sql语句
DATE(create_time) = CURDATE()
是 SQL 条件,用于过滤出当天创建的数据。
如果这部分没有什么问题,接下来我们进入到Service层编写
4 写业务逻辑在service中
业务逻辑很简单
// 调用mapper中的自定义查询方法
public List<CookiemenuDesign> getCookiemenuDesign(){
return cookiemenuDesignMapper.getCookiemenuDesign();
}
因为核心部分依靠基于Mybatis-plus本身,而不是咱们的逻辑
5 接下来处理Controller 层
@GetMapping("today")
public List<CookiemenuDesign> getCookiemenuDesign(){
return cookiemenuDesignService.getCookiemenuDesign();
}
去前端验证,数据已抓到
优雅 无需多言
过了一天,发现了一个bug,接口传递的数据只有id与date字段有值
开始debug
首先给mapper做一个断点,看看数据,发现看不懂
于是果断放弃这部分,先使用笨方法推理一下。
首先已知,MybatisPlus出现这种问题,可能会在以下几个方面存在问题
1 sql 问题
将我们写在mapper 接口的sql拿到navicat跑一下,发现没问题
既然他的数据返回是正常的
我们先不处理这部分,转而查看实体映射是不是出了问题
2 实体映射
实体层有三个诡异点
1 id 与 data 是非空型
1 返回数据的都是短名称(“id”||‘data’)
2 varchar型的没有返回数据
咱们先一个个尝试,先用惯性思维将其中一个字段改为非空试试
当然,只要稍加推导就知道这个不是重要原因,非空只是希望不向数据库传空值,而这个bug是因为后端向前端传了空值
那我们选择短名称,可能问题就是单纯出在了没有做映射也说不准
问题解决,确实是短名称的原因
接下来我们处理这部分的bug
我们先不考虑更改代码结构,因为这有可能会导致奇奇怪怪的问题
既然以这名称做切入点,首先考虑的就是驼峰映射,尽管在构造方法中我们已经采用了驼峰命名法,但事实胜于雄辩,结果已经不言自明。
在mybatis-config.xml中粘入
<settings>
<!-- 使用驼峰命名法转换字段 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
重启项目
数据抓到