在spring boot项目引入mybatis plus后的的案例实践

前景提要

 1、项目背景

一个spring boot + mybatis的项目,分页一直是PageHelper。

2、为什么要引入mybatis plus

1、简化单表的crud

2、对mybatis plus进行简单的设计,以满足现有系统的规范,方便开发

实践中出现的问题

1、版本不兼容

当我在尝试使用较早一些的稳定版本的时候,发现了mybatis和mybatis plus包出现了冲突的情况,然后切换了高版本的,问题解决

2、mybatis plus的分页对象无法使用

根据文档的使用方法添加后,无法使用,因为已经存在的mybatis的分页,当配置了这个分页插件时,你需要在mybatis plus中额外添加以下配置,以保证使用的是自己的Interceptor()

configuration.addInterceptor(mybatisPlusInterceptor());

3、数据库有关键字

当数据库的字段包含关键字的时候,这个时候自动映射会失效,有时候也不会给你报错,看完debug日志才发现sql里面有多个关键字,然后又没办法加上``,这个问题不是这里特有的,很多时候都会出现,希望在设计字段的时候注意,或者统一在字段前加上f_这种规范,在表前加t_,这样就可以避免了。

如何使用mybatis plus

在引入相关依赖,配置完数据源,包扫描,以及mp的MybatisConfiguration的相关基础配置后,我们进入到使用上。

1、最关键的创建数据库对应的映射实体,也就是对象,例如:

@Data
@TableName("pro_biweekly_task_mst")
public class DoubleWeekTaskMst extends BaseByMybatisPlusVO {

    @TableId(value = "",type = IdType.AUTO)
    private Integer id;

    private Integer projectId;

    private String isFinish;

    private String classification;

    @TableField(select = false)
    private String description;

}

简单介绍一下上面出现的注解的含义

@Data:自动添加get()、set()、toString()方法,保证代码的整洁

@TableName():数据库对应的表名

@TableId(value = "",type = IdType.AUTO):当前表的主键id,IdType.AUTO的意思是自动递增

@TableField(select = false):设置这个字段相关的东西,这里select = false的意思是查询时忽略掉这个字段,用来设置表中没有,但是又需要设置返回的字段。

2、mapper层对象的编写

@Mapper
public interface ComExamQuestionMapper extends BaseMapper<ComExamQuestionMst> {
}

如上述代码,mapper接口去继承一个BaseMapper<上面创建的实体>,此时去注入一个上面的mapper对象,就已经可以看到一堆方法了

使用的话可以看文档,也可以直接看BaseMapper

3、service层的编写

@Service
public class ComExamQuestionOptionService extends ServiceImpl<ComExamQuestionOptionMapper, ComExamQuestionOptionMst> implements IService<ComExamQuestionOptionMst> {

}

主要就是先继承一个ServiceImpl<刚刚写的mappser,刚刚写的映射实体>,然后实现一个IService<刚刚写的映射实体>,就完成了,当然了,如果说是项目分层比较严格的,可以把接口和实现分开写,就是你的接口去继承IService<刚刚写的映射实体>,然后你的实现去继承自己的接口,中间有一个中间人的意思,这个也是程序设计的原则之一、依赖倒置原则。

4、快速生成代码结构

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>最新版本</version>
</dependency>
FastAutoGenerator.create("url", "username", "password")
    .globalConfig(builder -> {
        builder.author("baomidou") // 设置作者
            .enableSwagger() // 开启 swagger 模式
            .fileOverride() // 覆盖已生成文件
            .outputDir("D://"); // 指定输出目录
    })
    .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
        int typeCode = metaInfo.getJdbcType().TYPE_CODE;
        if (typeCode == Types.SMALLINT) {
            // 自定义类型转换
            return DbColumnType.INTEGER;
        }
        return typeRegistry.getColumnType(metaInfo);

    }))
    .packageConfig(builder -> {
        builder.parent("com.baomidou.mybatisplus.samples.generator") // 设置父包名
            .moduleName("system") // 设置父包模块名
            .pathInfo(Collections.singletonMap(OutputFile.xml, "D://")); // 设置mapperXml生成路径
    })
    .strategyConfig(builder -> {
        builder.addInclude("t_simple") // 设置需要生成的表名
            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
    })
    .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
    .execute();

官方文档简介 | MyBatis-Plus

 小结

mybatis plus还是很好用的,对比以前,当我要写一个需求时,可能是一个方法一直传递到mapper.xml中去写sql了,然后是需要联表的联表,需要返回的字段就写一个新的对象Po返回就行了,感觉在代码的实现上是可以顺着写的,想到哪写到哪。但是mybatis plus不太一样,他先把所有的表映射实体都建完了,单表的crud也都解决了,这个时候我更多的可以像面向对象一样,需要对哪个对象操作,就直接去注入它,去操作它的方法,不需要再去xml中写查询,写添加,写修改,写删除,但是在面对多表的联合它也帮不上忙,还是只能老老实实去写xml。

  • 15
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海上生日朋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值