参考: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. 前端每日一知之css常用布局单位

    脑图在线链接 本文内容依据[js每日一题]公众号精彩文章总结而来

  2. openwrt交换机配置命令-swconfig

    swconfig swconfig 是交换接口 (switch) 配置命令. 交换机是二层设备,是我们用来配置vlan的必备利器. 使用swconfig list可以列出当前可用的 SWITCH 设备 ...

  3. Fleck:一个轻量级的C#开源WebSocket服务端库

    推荐一个简单易用.轻量级的C#开源WebSocket服务端库,方便我们快速实现WebSocket的开发. 01 项目简介 Fleck 是一个用 C# 编写的轻量级 WebSocket 服务器库.它提供 ...

  4. 【Python】【Matplotlib】词云图

    关于从网页获取文本 import requests from bs4 import BeautifulSoup code = requests.request("post",&qu ...

  5. pip 安装 Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1123)'))

    1.问题 1.1 问题截取 pip install redis -i https://pypi.tuna.tsinghua.edu.cn/simple Looking in indexes: http ...

  6. Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5

    DeepSeek-V3 实在是太便宜了,就跟不要钱似的:每百万输入 tokens 0.1 元 (缓存命中)/ 1 元 (缓存未命中),每百万输出 tokens 2 元 跟其他模型相比,DeepSeek ...

  7. 在 .NET 9 中使用 Scalar 替代 Swagger

    前言 在.NET 9发布以后ASP.NET Core官方团队发布公告已经将Swashbuckle.AspNetCore(一个为ASP.NET Core API提供Swagger工具的项目)从ASP.N ...

  8. ffmpeg 去除音频中的静音

    去除音频中的静音 //去除所有超过0.3秒的静音部分 ffmpeg -i input.mp3 -af silenceremove=stop_periods=-1:stop_duration=0.3:s ...

  9. 常用的MySQL备份/还原 的方法

    mysql备份数据库 mysql备份单个数据库 #mysql备份某个库格式: mysqldump -h主机名 -P端口 -u用户名 -p"密码" --database 数据库名 & ...

  10. Gitblit 服务器IP变更

    当Gitblit服务器的IP地址发生变化时,只需将项目中 ./git/config 文件中的 url改为新的IP即可.