前言
个人踩坑经验,不足之处请多指点!
正文
在 Mybatis-plus 官网上,这一段经典开头相信大家也是不陌生了
mp(Mybatis-plus,后文将这么称呼它)自诩是 Mybatis 的强力搭档,是为配合 Mybatis 提高开发效率而生。那么在开发过程中真的可以做到亲密无间么?他们各自有什么注意项?
一、Mybatis-plus 的小灶 —— 字段注解 @TableField
当数据库表字段名和对应的实体类属性名不同时,mp都会采用@TableField注解去进行声明
这无疑是很方便的,我们在使用mp操作数据库时不必担心表字段和实体类属性名的映射关系。但是 mp 能用的 Mybatis 却不一定能用。
@TableField 不能够为 Mybatis 的 xml 语句提供映射关系,因此 Mybatis 需要在xml中配置<resultMap> 指定好映射关系
二、Mybatis-plus 的自动生成策略
这一点应该是我在太久没有做项目才会犯的错。mp 有很好的自动生成策略,像雪花算法生成唯一 Id。我们需要在需要自动生成的字段属性上声明
// 主键
@TableId(value = "pid", type = IdType.ASSIGN_ID)
private String pid;
// 其他需要自动生成的字段属性
@TableField(value = "create_time", fill = FieldFill.INSERT_UPDATE)
private Date createTime;
然后就是为其他属性值配置对应的策略。需要实现 MetaObjectHandler 接口下的 insertFill 方法和 updateFill 方法,分别为插入或者更新字段值时配置生成策略。
/**
* @author 1.
* @version 1.0
* @description: mybatis-plus属性字段自动填充处理类
* @date 2023/7/28 17:35
*/
@Component
public class AutoFill2FieldsHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("publishTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("publishTime", new Date(), metaObject);
}
}
另外的,学习过程中看到很多人被mp的 Id生成策略困扰,像是字段类型和属性类型不匹配无法生成、设置主键自增不生效等等。
对于第一个问题,我的主键字段类型和对应的属性类型都是字符串,所以生成插入都很顺利;
对于第二个问题,可以参照这位博主的文章:@TableId(type = IdType.AUTO)不生效http://t.csdn.cn/JiF0q
三、Mybatis-plus 和 Mybatis 共同需要注意的点:数据库的关键字冲突问题
我遇到i这个问题是在用 mp 做表数据查询操作时遇到的,那个时候我的表对应的实体类中有一属性名为 desc ,之后跑测试的时候生成的sql语句就出错了,报异常
Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; xxxxx..
Sql语法错误,经查后发现并解决。这里感谢大佬的文章:
与 Mysql 关键字的冲突http://t.csdn.cn/Vgbns
四、Mybatis 的映射接口如何优雅地加入 spring 容器
这里提一嘴,Mybatis的xml文件是和接口建立映射关系,从而方便我们调用,保证能够执行到xml中的sql语句。而 Mybatis 在和 Spring 整合后,自动装配原理大大提高了我们的开发效率。而要将映射接口加入 Spring 容器中,有两种方式
1. 接口上加上@Mapper注解
@Mapper
public interface MyEntityMapper extends BaseMapper<MyEntity> {
//...
}
2. 在启动类上加上 @MapperScan注解(此时映射接口上的@Mapper就可加可不加了)
@SpringBootApplication(scanBasePackages = {"org.limit.study"})
@MapperScan(basePackages = {"指定映射接口所在的包路径"})
public class ServeApiApplication {
public static void main(String[] args) {
SpringApplication.run(ServeApiApplication.class, args);
}
}
不过如果此时映射接口的 @Mapper注解不加上,虽然仍然能够完成自动注入,但是 Idea 的提示功能会报红,这时只需要手动忽略即可。
后话
以上就是近期的个人项目开发的所有,后面还会持续更新。学习本就是一个需要不断回头捡起旧知识的过程 ! 之后项目逐步完善后将会开源出来,敬请期待 ! 届时欢迎各位多多star~