栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis-Plus【2】——解锁MyBatis这些功能代码少些3成

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis-Plus【2】——解锁MyBatis这些功能代码少些3成

三连多大胆,就有多大产!开源促使进步,献给每一位技术使用者和爱好者!
干货满满,摆好姿势,准备发车

一、前言

很久不更,上篇文章简单说了一下MyBatis Plus的简单实用,这次我们主要介绍一下以下几点内容,可以让我们在开发的时候简化代码编写,提高开发速度:

  • 新增数据时的 主键生成策略
  • 新增和修改数据时 自动填充
  • 修改数据时 乐观锁
  • 删除数据时的 逻辑删除
二、准备工作

数据库和项目的创建这块就省略了,可以参考 mybatis-plus入门 文章,不过依赖版本可以修改为mybatis-plus 3.4.3.4版本的,核心配置如下

2.1、pom文件

您可以创建一个springboot或者maven工程都可以,引入以下依赖


  
    com.baomidou
    mybatis-plus-boot-starter
    3.4.3.4
  

  
    mysql
    mysql-connector-java
    8.0.27
  

  
    org.projectlombok
    lombok
    1.18.22
  

2.2、项目配置文件

以springboot项目为例,application.properties 配置文件如下,我们这里引入的mysql版本是 8.0.27则使用第二个配置文件

2.2.1、mysql6以下
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus
spring.datasource.username=root
spring.datasource.password=123456
2.2.2、mysql6级以上

注意 driver 和 url 的变化

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
2.2.1、注意
  • MySQL8的驱动的url使用 serverTimezone=GMT%2B8 作为后缀,因为springboot2.1之后集成的MySQL版本是8.0的驱动,这个版本的JDBC驱动需要加上此后缀,否则会出现 java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or representsmore 这个报错
  • driver-class使用的是 com.mysql.cj.jdbc.Driver 这个驱动类,之前的 com.mysql.jdbc.Driver 已经被废弃,否则会出现警告信息。
三、主键生成策略 3.1、简介

主键生成策略的言下之意就是 数据新增时,数据库中该条数据的主键以什么样的方式生成并存储,常见的主键生成策略如下:

  • 数据库自增长序列或字段
  • UUID
  • Redis生成ID
  • Twitter的snowflake算法
  • 利用zookeeper生成唯一ID

这不是本章重点内容,【但是主键生成策略很重要】,具体的说明您可以参考 主键生成策略 这篇文章,非常不错,有帮助您也记得赞一下!

3.2、mybatis-plus主键生成策略

mybatis-plus 3.3.0之后主键生成策略有以下几种,都是中文注释很明确了。大概分为:

  • 数据库自动生成
  • 用户自行生成并设置数据
  • 通过雪花算法生成ID进行设置

您继续往下看,实现了之后,来设置不同的策略看最终数据,您就能完全掌握这几种策略了

3.3、代码实操 3.3.1、实体类

在主键属性上添加 @TableId 注解,并使用type属性选中对应的主键策略

@Data
public class User {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
3.3.2、新增数据
@Test
public void addUser() {
    // 创建User对象,并设置属性,此处没有设置id
    User user = new User();
    user.setName("Alice");
    user.setEmail("test7.@baomidou.com");
    user.setAge(17);
    // 调用insert函数将用户添加进数据库
    int row = userMapper.insert(user);
    System.out.println("成功新增" + row + "条数据");
}
3.3.3、效果

看到会生成一个19位的ID序号,其他的策略会生成什么呢?还是上述所说,您可以在 实体类 中修改主键生成策略,看结果!

四、自动填充 4.1、介绍

自动填充是指:字段会根据我们指定的策略自动生成值,并且在数据新增或者更新时自动填充数据。

比如要实现在新增数据时自动填充数据的创建时间,在修改数据时自动填充数据的更新时间。

4.2、实现步骤
  • 在数据表中新增 crtate_time 和 update_time 字段,类型为datetime

  • 在类中新增createTime 和 updateTime 属性,并在属性上新增 @TableField(… fill = FieldFill.INSERT/UPDATE)注解

  • 创建类实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.metaObjectHandler

【这里我们只是以这create_time 和 update_time 两个属性为例,您如果有需要自动填充的其他属性,也可以通过这种方式实现】

4.3、自动填充策略
public enum FieldFill {
    
    DEFAULT,
    
    INSERT,
    
    UPDATE,
    
    INSERT_UPDATE
}
4.4、实体类改造
@Data
public class User {

    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    
    // 设置新增时自动填充
    
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    // 设置新增和修改时自动填充

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

}
4.5、自动填充handler类

该类为新建类,实现 metaObjectHandler 接口,重写 insertFill(新增时运行) 和 updateFill(修改时运行) 两个方法

package com.buye.mp.handler;

import com.baomidou.mybatisplus.core.handlers.metaObjectHandler;
import org.apache.ibatis.reflection.metaObject;
import org.springframework.stereotype.Component;
import java.util.Date;

@Component
public class MymetaObjectHandler implements metaObjectHandler {

    // 使用MP实现添加操作,该方法执行,新增数据时填充创建和修改时间
    @Override
    public void insertFill(metaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    // 使用MP实现修改操作,该方法执行,修改时生成更新时间
    @Override
    public void updateFill(metaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}
4.5、修改测试
@Test
public void updateUser() {
    User user = new User();

    user.setId(1456789755448);
    user.setAge(90);
    int row = userMapper.updateById(user);

    System.out.println("修改" + row + "条数据");

}

1、新增测试函数上边已经写过了,您可以自行对添加进行测试,然后看自动填充的结果
2、自动填充我们这里只是对两个时间进行测试,您如果有其他需求,比如:添加时需要自动填充 创建者,状态等数据,您依然可以通过该方式在 insertFill 和 updateFill方法中写对应逻辑

五、总结

这次我们先说一下 主键生成策略 和 自动填充,文章内容控制在一个比较舒适的长度上,您可以边看边练。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/583152.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号