参考: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. Pwn2own 2022 Tesla 利用链 (ConnMan 堆越界写 RCE)

    Pwn2own 2022 Tesla 利用链 (ConnMan 堆越界写 RCE) Opening the doors and windows 0-click RCE on the Tesla Mod ...

  2. PM-如何优雅的抄袭代码?世上所有代码都是一大抄

    你借了我的思想,在我的思想上,发展出一套理好的思想. 你借了我的代码,在我的代码上,开发出一套理好的代码.   你们知道程序员最熟悉,最熟练,最常用的两个快捷键是哪两个吗?没错,估计你现在心中所想的就 ...

  3. ChatGPT接口测试用例生成的流程

    通常,使用ChatGPT生成接口测试用例的流程可以分为以下关键步骤. 收集接口信息 收集接口的相关文档和信息,如接口名称.请求方法.请求参数.返回结果等.这些是ChatGPT生成测试用例需要的输入信息 ...

  4. 【MyBatis】学习笔记09:动态设置表名

    [Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 [MyBatis]学习笔记03:配置文件进一步解读(非常重要) [MyBatis]学习笔记04:配 ...

  5. Qt/C++自定义界面大全/20套精美皮肤/26套精美UI界面/一键换肤/自定义颜色/各种导航界面

    一.前言 这个系列对应自定义控件大全,一个专注于控件的编写,一个专注于UI界面的编写,程序员有两大软肋,一个是忌讳别人说自己的程序很烂很多bug,一个就是不擅长UI,基本上配色就直接rgb,对于第一点 ...

  6. Qt编写安防视频监控系统57-子模块1设备列表

    一.前言 近期在经历过这次UI大重构以后,很多拆分的功能都以单独的模块的形式出现,以悬停窗体的形式嵌入或者悬浮在主窗体中,这种方式极大的增强了系统的拓展性,客户想要什么模块就开启什么模块,放置到合适的 ...

  7. Qt音视频开发45-视频传输TCP版

    一.前言 做音视频开发,会遇到将音视频重新转发出去的需求,当然终极大法是推流转发,还有一些简单的场景是直接自定义协议将视频传出去就行,局域网的话速度还是不错的.很多年前就做过类似的项目,无非就是将本地 ...

  8. 七牛云API的使用包括Ajax上传功能及凭证生成

    1.服务端(主要用于生成上传,删除,下载等凭证) 引入Qiniu的Get包.包就叫Qiniu. //上传凭证 //上传凭证:其余凭证类似的写法 public string UpLoadToken() ...

  9. [转]基于图像的三维模型重建4——增量SFM

    内容 几种BA的形式 同时优化相机和三维点 优化相机 只优化三维点 单目相机 增量运动恢复结构(Incremental SFM) 运动恢复结构的几个问题 几种BA的形式 数学模型 n个三维点和m个相机 ...

  10. [转][vue-router] Duplicate named routes definition动态路由addRoutes的踩坑

    问题描述: 第一次进入页面,左侧静态路由和动态路由列表均能正常显示,但点击左侧其他路由后浏览器报警告[vue-router] Duplicate named routes definition-,并且 ...