参考:https://www.cnblogs.com/haoxinyue/p/5208136.html(分布式系统唯一ID生成方案汇总)

一、准备工作

(1)创建数据库:

create database if not exists mybatis_plus;

(2)创建user表:

drop table if exists user;
create table user(
id bigint(20) not null comment '主键ID',
name varchar(30) null default null comment '姓名',
age int(11) null default null comment '年龄',
email varchar(50) null default null comment '邮箱',
primary key (id)
);

创建一张表必须拥有的字段:

① version(乐观锁)

② deleted(逻辑删除标志)

③ gmt_create(创建时间)

④ gmt_modified(修改时间)

(3)插入数据

insert into user (id,name,age,email) values
(1,'宇智波鼬',24,'you.yuzhibo@xiao.com'),
(2,'飞段',27,'duan.fei@xiao.com'),
(3,'角都',32,'du.jiao@xiao.com'),
(4,'迪达拉',23,'dala.di@xiao.com'),
(5,'蝎',18,'xie@xiao.com'),
(6,'干沛鬼鲛',28,'guijiao.ganpei@xiao.com'),
(7,'佩恩天道',26,'tiandao.pain@xiao.com'),
(8,'佩恩畜生道',26,'chushengdao.pain@xiao.com'),
(9,'佩恩修罗道',26,'xiuluodao.pain@xiao.com'),
(10,'佩恩恶鬼道',26,'eguidao.pain@xiao.com'),
(11,'佩恩人间道',26,'renjiandao.pain@xiao.com'),
(12,'佩恩地狱道',26,'diyudao.pain@xiao.com'),
(13,'小南',26,'nan.xiao@xiao.com'),
(14,'漩涡长门',28,'changmen.xuanwo@xiao.com');

二、测试

(1)创建一个SpringBoot项目:mybatis-plus

(2)Maven依赖配置

<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.4</version>
</dependency>

(3)application.properties配置

spring.application.name=mybatis-plus

# 数据库连接配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&userUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=!QAZ2wsx # 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

(4)POJO类

package com.harley.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor; /**
* @author harley
* @date 2024/06/06 17:30
*/ @Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}

(5)Mapper类

package com.harley.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.harley.pojo.User;
import org.springframework.stereotype.Repository; /**
* @author harley
* @since 2024-06-06 21:46:57
*/
@Repository
public interface UserMapper extends BaseMapper<User> { }

(6)主类配置MapperScan包扫描

package com.harley;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @MapperScan("com.harley.mapper")
@SpringBootApplication
public class MybatisPlusApplication { public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
} }

(7)测试类

package com.harley;

import com.harley.mapper.UserMapper;
import com.harley.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest
class MybatisPlusApplicationTests { @Autowired
private UserMapper userMapper; @Test
void contextLoads() {
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
} }

(8)控制台打印结果

(9)application.properties中配置日志之后,控制台会打印如下内容

三、CURD(Create Update Read Delete)

(1)insert

@Test
void testInsert(){
User user = new User(16L,"黑绝",200,"jue.hei@xiao.com");
int res = userMapper.insert(user);
if(res > 0){
System.out.println("数据插入成功");
}
}

(2)insert(不设置主键)

@Test
void testInsert(){
User user = new User();
user.setName("白绝");
user.setAge(119);
user.setEmail("jue.bai@xiao.com");
int res = userMapper.insert(user);
if(res > 0){
System.out.println("数据插入成功");
}
}

如图1798726048819458049为雪花算法生成的long型ID

(3)update

根据条件自动拼接动态SQL

@Test
void testUpdate(){
User user = new User(16L,"绝",199,"jue@xiao.com");
int res = userMapper.updateById(user);
if(res > 0){
System.out.println("数据更新成功");
}
}

(3)select

  • 通过ID查询
@Test
void testSelectById(){
User user = userMapper.selectById(100861103L);
System.out.println(user); }

  • 批量查询
@Test
void testSelectByBatchId(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
users.forEach(System.out::println); }

  • 条件查询
@Test
void testSelectByBatchIds(){
HashMap<String, Object> map = new HashMap<>();
map.put("name","小南");
map.put("age",26);
List<User> users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}

(4)delete

  • 根据id删除
@Test
void testDeleteById(){
User user = new User();
user.setId(100861103L);
int res = userMapper.deleteById(user);
System.out.println(res);
}

  • 批量删除
@Test
void testDeleteBatchId(){
int res = userMapper.deleteBatchIds(Arrays.asList(100861100, 100861101, 100861102));
if (res > 0){
System.out.println("删除成功");
}
}

  • 条件删除
/**
* 生成20只白绝
*/
@Test
void testInsert(){
int i = 1;
while(i<21) {
User user = new User();
user.setName("白绝");
user.setAge(21);
user.setEmail("jue.bai@xiao.com");
int res = userMapper.insert(user);
if (res > 0) {
System.out.println("生成"+i+"只白绝.");
}
i++;
}
}

@Test
void testDeleteMap(){
HashMap<String, Object> map = new HashMap<>();
map.put("name","白绝");
int res = userMapper.deleteByMap(map);
if (res > 0){
System.out.println("消灭"+res+"只白绝");
}
}

批量生成20只白绝之前,已经有3只白绝。

四、不同的主键策略

IdType的集中类型

public enum IdType {
AUTO(0), // 数据库id自增
NONE(1), // 未设置主键
INPUT(2), // 手动输入
ASSIGN_ID(3),
ASSIGN_UUID(4); // 全局唯一的ID private final int key; private IdType(int key) {
this.key = key;
} public int getKey() {
return this.key;
}
}

4.1、IdType.AUTO

(1)实体类字段上配置 @TableId(type = IdType.AUTO)

package com.harley.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString; /**
* @author harley
* @date 2024/06/06 17:30
*/ @Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User { @TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}

(2)数据库中的主键设置自增

(3)可以先在数据库中测试

insert into user (name,age,email) values ('漩涡香菱',16,'xianglin.xuanwo@xiao.com');

(4)测试类进行insert测试

@Test
void testInsert(){
User user = new User();
user.setName("大蛇丸");
user.setAge(32);
user.setEmail("shewan.da@xiao.com");
int res = userMapper.insert(user);
if (res > 0){
System.out.println("数据插入成功!");
}
}

数据库中的数据则是......

4.2、IdType.INPUT

(1)修改类型为INPUT

@TableId(type = IdType.INPUT)
private Long id;

(2)测试类

@Test
void testInsert(){
User user = new User();
user.setName("重吾");
user.setAge(18);
user.setEmail("wu.zhong@xiao.com");
int res = userMapper.insert(user);
if (res > 0){
System.out.println("数据插入成功!");
}
}

数据库中则是

五、自动填充

创建时间、修改时间!这些操作一般都是自动化完成的,不希望手动更新。

阿里巴巴开发手册中所有的数据库表都有gmt_create(创建时间)、gmt_modified(修改时间)这两个字段

注:gmt是格林尼治标准时间的缩写

5.1、在数据库中配置

(1)在表中新增字段create_time、update_time

alter table user add column create_time datetime default current_timestamp comment '创建时间';
alter table user modify column update_time datetime default current_timestamp on update current_timestamp comment '修改时间';

(2)将数据库中字段的变更同步到POJO类

package com.harley.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString; import java.util.Date; /**
* @author harley
* @date 2024/06/06 17:30
*/ @Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User { @TableId(type = IdType.INPUT)
private Long id;
private String name;
private Integer age;
private String email;
private Date createTime; // 更换为驼峰标识
private Date updateTime; // 更换为驼峰标识
}

(3)测试更新方法,将表中ID为100861102的name和email进行更新,查看create_time和update_time的变化

@Test
void testUpdate(){
User user = new User();
user.setId(100861102L);
user.setName("宇智波佐助");
user.setEmail("zuozhu.yuzhibo@xiao.com");
userMapper.updateById(user);
}

(4)观察到update_time随着更新操作的执行,变更为最新的时间。

5.2、在代码进行处理

(1)将create_time、update_time的默认值去掉,update_time的自动更新也去掉

alter table user modify create_time datetime comment '创建时间';
alter table user modify update_time datetime comment '修改时间';

(2)给需要自动填充的属性添加注解

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

(3)编写处理器处理注解

package com.harley.handler;

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.util.Date; /**
* @author harley
* @date 2024/06/07 15:24
*/ @Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 插入时的填充策略
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill......");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
} /**
* 更新时的填充策略
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill......");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}

(4)测试类中进行insert和update操作,观察create_time、update_time的变化。

@Test
void testInsert(){
User user = new User();
user.setName("重吾666");
user.setAge(21);
user.setEmail("wu.zhong@xiao.com");
int res = userMapper.insert(user);
if (res > 0){
System.out.println("数据插入成功!");
}
} @Test
void testUpdate(){
User user = new User();
user.setId(100861103L);
user.setName("zhongwu");
userMapper.updateById(user);
}

六、idea界面

— 业精于勤荒于嬉,行成于思毁于随 —

MybatisPlus - [02] HelloWorld的更多相关文章

  1. Golang gRPC微服务02: helloworld

    安装protobuf 在windows下,直接下载release版本https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0然后把 ...

  2. SpringMVC基础02——HelloWorld

    1.搭建环境 博主使用的环境是IDEA2017.3,首先我们需要创建一个maven项目父项目,创建一个project,选择maven,之后点击next 添写当前项目的坐标,之后点击next 填写项目名 ...

  3. 安装infer整个过程

    日期:2015-06-26 孟起  15:43:25 大神.. 孟起  15:43:38 我是不是照着这个安装 HelloWorld  15:45:05 直接找二进制文件安卓就行 孟起  15:46: ...

  4. Cocos2d-x数据持久化-修改数据

    修改数据时,涉及的SQL语句有insert.update和delete语句,这3个SQL语句都可以带参数.修改数据的具体步骤如下所示.(1) 使用sqlite3_open函数打开数据库.(2) 使用s ...

  5. Cocos2d-x数据持久-变更数据

    当数据变化,参与SQL报表insert.update和delete声明.这项3个月SQL语句可以带参数. 详细过程的数据,例如,下面的变化看出.(1) 采用sqlite3_open开放式数据库功能.( ...

  6. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  7. Linux(2):基础命令

    linux 的规则: 1. linux 命令行组成结构:如下 [root@neo ~]# [用户名@主机名 当前工作路径]# ~ 用户的家目录 2. linux系统命令操作语法的格式(命令的样子): ...

  8. 利用 Docker 构建一个简单的 java 开发编译环境

    目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...

  9. 限流神器Sentinel,不了解一下吗?

    概述 书接上回:你来说说什么是限流? ,限流的整体概述中,描述了 限流是什么,限流方式和限流的实现.在文章尾部的 分布式限流,没有做过多的介绍,选择了放到这篇文章中.给大伙细细讲解一下 Sentine ...

  10. hibernate 02之helloworld

    1.安装插件 安装方法说明(hibernatetools-.Final): Help --> Install New Software... Click Add... In dialog Add ...

随机推荐

  1. uni-app在微信小程序端自定义组件中样式穿透失效

    前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app. 坑位 最近因UI有别 ...

  2. JavaScript是按顺序执行的吗?聊聊JavaScript中的变量提升

    作为一位前端开发者,我们经常会听到这么一句话:"JavaScript的执行是按照顺序自上而下依次执行的."这句话说的并没有错.但是它似乎又好像不完全对.我们先来看以下这段代码.你觉 ...

  3. 聊一聊 C#后台线程 如何阻塞程序退出

    一:背景 1. 讲故事 这篇文章起源于我的 C#内功修炼训练营里的一位朋友提的问题:后台线程的内部是如何运转的 ? ,犹记得C# Via CLR这本书中 Jeffery 就聊到了他曾经给别人解决一个程 ...

  4. 如何在 Linux 中使用 grep 命令的排除功能

    来自grep 是一种强大的命令行工具,用于在一个或多个输入文件中搜索与正则表达式匹配的行,并将匹配的行标准输出.在本文中介绍如何在使用 grep 搜索时排除一个或多个单词或目录.   排除单词或多个条 ...

  5. tc端口流量控制(带宽限速)

    tc qdisc add dev ens192 root handle 1: htbtc class add dev ens192 parent 1: classid 1:1 htb rate 80m ...

  6. 【转载】 进行API开发选gRPC还是HTTP APIs

    https://www.cnblogs.com/yilezhu/p/10645804.html 开始之前先看一下gRPC与带有j'son的HTTP APIs对比表格 gRPC的优势 性能 gRPC消息 ...

  7. Qt编写安防视频监控系统67-跨平台及国产系统

    一.前言 得益于Qt的超强跨平台特性,本系统也是跨平台的,亲测的系统包括windows全系列.ubuntu全系列.centeos.国产系统UOS.国产系统银河麒麟.中标麒麟.嵌入式linux.树莓派. ...

  8. OpenCV4.1.0编译时提示“CV_BGR2GRAY”: 未声明的标识符

    OpenCV版本为4.1.0 使用CV_BGR2GRAY时报错: "CV_BGR2GRAY": 未声明的标识符 解决方法一:添加头文件:#include <opencv2/i ...

  9. Web网页端IM产品RainbowChat-Web的v7.1版已发布

    一.关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIM ...

  10. 前端vue项目本地运行内网访问的方法

    有时候在公司里,领导想在内网访问到你本地的项目,所以就有了前端项目内网访问 (1)首先在package文件里面的host改成0.0.0.0,像这个样子 (2)其次在config下的index.js里的 ...