从头开始开发一个java后端项目:6乐观锁、自动填充功能实现

406 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

sql执行打印

我们在进行后端开发的时候,往往需要打印执行的sql。这里我们选择官网推荐的p6spy进行打印

安装依赖

在pom.xml中的dependencies中添加代码如下

<!-- p6spy -->
<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.9.1</version>
</dependency>

新建配置文件

我们在resources下新建spy.properties文件。内容如下

#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

设置p6spy驱动

这里我们设置application.yml如下所示

server:
  port: 1001
spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  datasource:
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url:  jdbc:p6spy:mysql://???:3306/????useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root
    password: supporter
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: del_flag # 全局逻辑删除的实体字段名
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

这里和mysql的配置大致相同,只有driver和url有所不同

验证

我们直接重启项目,访问add方法即可看到在打印台中打印了sql

乐观锁

先解释一下乐观锁的意思:对所有的数据都信任,只在更新的时候加锁。我们要实现乐观锁其实很简单就是添加一个版本号。我来解释一下为什么这样会保证数据的准确性。我们设置完版本号之后,如果执行update方法会在后边添加一个版本号的条件,也就是最终的sql为:update table_name set a=?,version_no= version_no+1 where id=? and version_no = 当前版本

引入乐观锁

其实只需要在我们的版本控制字段上添加@Version注解就行了

注意

此处必须查询出版本号,否则不会更新

自动填充

我们在之前的文章设置了一些通用的字段,但是在编写测试案例的时候如果不设置值的话,对应的属性就是空,我们这里集成官网的文档进行设置默认值的功能

编写配置文件

在code.liang.top.admin.boot.config.mybatis下新建ProjectMetaObjectHandler文件内容如下

package code.liang.top.admin.boot.config.mybatis;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @author lmh
 * @version 1.0
 * @description: 项目 MetaObjectHandler
 */
@Slf4j
@Component
public class ProjectMetaObjectHandler implements MetaObjectHandler {
    /**
     * insert 时填充
     *
     * @param metaObject metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createId", String.class, "createId");
        this.strictInsertFill(metaObject, "createName", String.class, "createName");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
    }

    /**
     * insert 时填充
     *
     * @param metaObject metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "updateId", String.class, "updateId");
        this.strictInsertFill(metaObject, "updateName", String.class, "updateName");
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

我们现在直接重启项目然后调用add与update方法即可自动填充数据

结语

我们本篇文章集成了乐观锁、自动填充、以及sql打印的功能,明天我们准备集成druid监控sql,mybatis plus代码生成器
本文所有代码已上传的gitee,欢迎有兴趣的掘友们startgitee.com/liangminghu…
欢迎关注我的掘金账号:juejin.cn/user/261290…
下期预告:druid监控sql,mybatis plus代码生成器集成