简单聊下Mybatis和Mybatis-plus这对损友

前言

个人踩坑经验,不足之处请多指点!

正文

在 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)不生效icon-default.png?t=N6B9http://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 关键字的冲突icon-default.png?t=N6B9http://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~

猜你喜欢

转载自blog.csdn.net/Ccc67ol/article/details/132047321