参考: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_timeupdate_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)测试更新方法,将表中ID100861102nameemail进行更新,查看create_timeupdate_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. 【分块】LibreOJ 6282 数列分块入门6

    题目 https://loj.ac/p/6282 题解 数据范围 \(1 \leq n \leq 10^5\),因此进行分块最多分 \(\sqrt{10^5} ≈ 318\) 块.且数据是随机生成的, ...

  2. MeteoInfo-Java解析与绘图教程(十)_JAVA绘制雷达PPI图

    天气雷达的基本要素有很多,特别是双偏振雷达更多,但业务场景经常使用的一般为基本反射率,基本速度这两种要素 接下来我们以基本反射率为例,其他的要素也是一样的,一通百通 首先我们做基本反射率的图需要确定做 ...

  3. Linux 网络设置及管理

    Linux 网络管理 网络管理 1.使用NetworkManager管理网络 NetworkManager(网络管理器)是一个动态网络的控制器与配置系统,它用于当网络设备可用时保持设备连接和开启并激活 ...

  4. 【MySQL】MySQL命令总结 | 数据库与数据表的创建删除与查询

    @ 目录 数据库 创建数据库 使用数据库 删除数据库 查看所有数据库 数据表 查看数据库中所有数据表 在数据库中创建数据表 删除数据表 修改表名 查询表列(字段)信息 表-删除某一字段 表-增加某一字 ...

  5. 使用OpenSSL创建生成CA证书、服务器、客户端证书及密钥

    说明: 对于SSL单向认证:服务器需要CA证书.server证书.server私钥,客户端需要CA证. 对于SSL双向认证:服务器需要CA证书.server证书.server私钥,客户端需要CA证书, ...

  6. 《HelloGitHub》第 105 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...

  7. Qt开源作品23-颜色拾取器

    一.前言 在做很多项目的UI界面的时候,相信绝大部分人都有过抄袭别人的UI界面尤其是颜色的时候,毕竟十个程序员九个没有审美,或者说审美跟一坨屎一样,大家主要的精力以及擅长点都是在写功能实现具体功能上面 ...

  8. [转]C++中strcpy()函数和strcpy_s()函数的使用及注意事项

    原文链接:C++中strcpy()函数和strcpy_s()函数的使用及注意事项

  9. spark (一) 入门 & 安装

    目录 基本概念 spark 核心模块 spark core (核心) spark sql (结构化数据操作) spark streaming (流式数据操作) 部署模式 local(本地模式) sta ...

  10. 【原创】浅谈EtherCAT主站EOE(下)-EtherCAT IgH主站EoE具体实现

    目录 1.IgH 框架概述 2. IgH EOE机制 2.1 EoE服务规范 2.1 EoE虚拟网络设备 2.1.1 EoE Virtual Network Interfaces 2.1.2 EoE ...