mybatis-plus (3.4.2)使用

快速入门

官方文档快速入门案例

配置日志

# 配置日志mybatis-plus:configuration:# 配置 mybatis-plus执行的日志类型(可以看到执行过程) 下面是使用了控制台输出 sl4j log4j 等等都可以log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

效果

在这里插入图片描述

CRUD扩展

数据库中未指定id自增方式 我们可以通过mybatis-plus 来生成
在这里插入图片描述

插入一条数据

User user = new User();
user.setAge(3);
user.setName("xiuyuan");
user.setEmail("155645xxxx@qq.com");userMapper.insert(user);System.out.println(user);

你会发现,我们虽然没有指定id,但是他会自动给我们生成id,并赋给了user
在这里插入图片描述

数据库插入的id的默认值为:全局的唯一id

主键生成策略

分布式系统唯一Id生成方案汇总

Twitter的snowflake(雪花)算法

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。具体实现的代码可以参看https://github.com/twitter/snowflake。

mybatis-plus 默认主键生成方案 ID_WORKER

我们可以通过 @TableId 指定主键生成方式

public class User {@TableId(type = IdType.ID_WORKER)private Long id;private String name;private Integer age;private String email;

IdType

public enum IdType {AUTO(0), // 数据库id自增NONE(1), // 未设置主键INPUT(2), //手动输入ID_WORKER(3), // 默认的全局唯一idUUID(4), // 全局唯一id uuidID_WORKER_STR(5); // ID_WORKER 字符串表示法private int key;private IdType(int key) {this.key = key;}public int getKey() {return this.key;}
}

更新操作

  @Testvoid update(){User user = new User();user.setId(2L);user.setAge(20);//  自动支持 动态sql(会自动判断 属性是否为''或null)int i = userMapper.updateById(user);}

在这里插入图片描述
在这里插入图片描述
从更新操作中 你会发现它是支持动态sql判断的(填充动态sql)。

自动填充

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

方式一 数据库级别(工作中不推荐)

在这里插入图片描述

方式二 代码级别

自动填充功能入门

1、实体类上添加填充注解

// 字段添加填充内容@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;

2、编写一个处理器来处理注解

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 {// 插入时填充的操作@Overridepublic void insertFill(MetaObject metaObject) {// 方法签名 MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)this.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}// 更新时填充的操作@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime",new Date(),metaObject);}
}

测试一下

在这里插入图片描述

在这里插入图片描述

乐观锁

mybaits-plus乐观锁官方文档

当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

1、给数据库中增加version字段
在这里插入图片描述
2、我们的实体类同步字段

// mybatis-plus 的乐观锁 Version注解
@Version
private Integer version;

@Version 说明:

支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
整数类型下 newVersion = oldVersion + 1
newVersion 会回写到 entity 中
仅支持 updateById(id) 与 update(entity, wrapper) 方法
在 update(entity, wrapper) 方法下, wrapper 不能复用!!!

3、配置乐观锁插件(新版本已失效)

新版本已失效

@MapperScan("com.zlf.mapper")
@Configuration
public class mybatisPlusConfig {@Beanpublic OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor(){return new OptimisticLockerInnerInterceptor();}
}

新版本

@MapperScan("com.zlf.mapper")
@Configuration
public class mybatisPlusConfig {/*** 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 分页插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 配置 乐观锁拦截器OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor = new OptimisticLockerInnerInterceptor();interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor);return interceptor;}@Beanpublic ConfigurationCustomizer configurationCustomizer() {return configuration -> configuration.setUseDeprecatedExecutor(false);}
}

测试

/*** 测试乐观锁失败(模拟多线程)*/@Testvoid testLock2(){// 1、查询用户信息User user = userMapper.selectById(1L);// 2、修改用户信息user.setEmail("cccc@abc");user.setAge(18);User user2 = userMapper.selectById(1L);user.setName("小白");// 插队修改userMapper.updateById(user2);userMapper.updateById(user);}

在这里插入图片描述
在这里插入图片描述

查询操作

基础查询

/*** 测试查询*/@Testvoid testSelect(){// 查询一个User user = userMapper.selectById(1L);// 查询多个  方法签名 List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);List<User> users = userMapper.selectBatchIds(Arrays.asList(1L,2L,3L));// 条件查询之一 selectByMapHashMap<String, Object> map = new HashMap<>();map.put("name","小白"); // key 是列名 value 是要查询的值map.put("age",18);  // 多个条件之间是 andList<User> users1 = userMapper.selectByMap(map);}

分页查询

1、配置分页拦截器

/*** 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//分页拦截器interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 配置 乐观锁拦截器OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor = new OptimisticLockerInnerInterceptor();interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor);return interceptor;}

2、直接使用Page对象

@Testvoid testPage(){// 参数一:当前页,参数二:显示条数Page<User> page = new Page<>(1,5);// 分页查询Page<User> userPage = userMapper.selectPage(page, null);// 获取记录 getRecords()userPage.getRecords().forEach(System.out::println);}

测试结果
在这里插入图片描述

删除操作

@Testvoid testDelete(){// 通过id删除一条记录userMapper.deleteById(1L);// 通过id集合删除整个集合对应记录userMapper.deleteBatchIds(Arrays.asList(2L,3L));// 通过条件删除 条件之间为 andMap<String, Object> map = new HashMap<>();map.put("name","小黑");map.put("age",18);userMapper.deleteByMap(map);}

逻辑删除

逻辑删除官方文档

物理删除:从数据库中直接移除
逻辑删除:在数据库中没有被移除,而是通过一个变量来让他失效!

类似管理员查看被删除的记录。防止数据的丢失,类似于回收站!

1、在数据表中添加一个字段deleted

在这里插入图片描述

2、在实体类中添加属性

	@TableLogic //逻辑删除注解private Integer deleted;

3、配置

mybatis-plus:global-config:db-config:# 配置逻辑删除logic-delete-field: deleted  # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略@TableLogic)logic-delete-value: 1  # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

测试

    @Testvoid testDelete(){// 通过id删除一条记录userMapper.deleteById(2L);}

你会发现 删除变成了更新deleted 的值了
在这里插入图片描述
数据库中
在这里插入图片描述

我们再来查询一下

@Testvoid testLock(){// 1、查询用户信息User user = userMapper.selectById(2L);System.out.println(user);}

已经查不到了 sql中会过滤 deleted=0 的
在这里插入图片描述

性能分析插件

旧版本就不说了。
新版本在 执行 SQL 分析打印官方文档

条件构造器

条件构造器官方文档

代码自动生成器

这边使用的版本是3.4.1

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.4.1</version>
</dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version>
</dependency>

代码生成器官方文档


import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;@SpringBootTest
class MallApplicationTests {@Testvoid contextLoads() {}@Testpublic void run() {// 1、创建代码生成器AutoGenerator mpg = new AutoGenerator();// 2、全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");gc.setOutputDir(projectPath + "/src/main/java");gc.setAuthor("zlf");gc.setOpen(false); //生成后是否打开资源管理器gc.setFileOverride(false); //重新生成时文件是否覆盖gc.setServiceName("%sService");	//去掉Service接口的首字母Igc.setIdType(IdType.ID_WORKER); //主键策略gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型gc.setSwagger2(true);//开启Swagger2模式mpg.setGlobalConfig(gc);// 3、数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/数据库名");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("xxxx");dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);// 4、包配置PackageConfig pc = new PackageConfig();pc.setModuleName("mall"); //模块名pc.setParent("com");// com.zlf.edu.controllerpc.setController("controller");pc.setEntity("entity");pc.setService("service");pc.setMapper("mapper");mpg.setPackageInfo(pc);// 5、策略配置StrategyConfig strategy = new StrategyConfig();strategy.setInclude("表名");strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作strategy.setRestControllerStyle(true); //restful api风格控制器strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符strategy.setLogicDeleteFieldName("is_deleted");// 自动填充配置TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);TableFill gmtModified = new TableFill("gmt_modified",FieldFill.INSERT_UPDATE);ArrayList<TableFill> tableFills = new ArrayList<>();tableFills.add(gmtCreate);tableFills.add(gmtModified);strategy.setTableFillList(tableFills);mpg.setStrategy(strategy);// 6、执行mpg.execute();}}

推荐B站Up狂神

良心up主,强烈推荐!!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SMTP 错误代码大全

为什么80%的码农都做不了架构师&#xff1f;>>> 421 Service not available, closing transmission channel (This may be a reply to any command if the service knows it must shut down) 450 Requested mail action not taken: mailbox unavailable (E.g., mai…

VituralBox从零搭建基于CentOS 7(64位)的Kubernetes+docker集群

VituralBox从零搭建基于CentOS 7&#xff08;64位&#xff09;的Kubernetesdocker集群 1. 下载CentOS 7官方minimal镜像2. 安装VituralBox&#xff08;Windows 10 64位&#xff09;3. 安装Git for windows&#xff08;Windows 10 64位&#xff09;4. 安装VituralBox虚拟机并创…

使用阿里云对象存储OSS收藏老婆新垣结衣日常照

目录阿里云OSS官方文档开通阿里云OSS服务入门使用java代码上传文件至OSS1、准备工作&#xff1a;创建阿里云OSS许可证(获取对Api的访问权限)选择继续使用 AccessKey创建AccessKey创建成功springBoot整合OSS依赖配置文件 application.yaml常量工具类OssControllerOssService效果…

当用户流失比较明显后, 如何提升活跃度? push notification 是一个有效的方式吗?...

当用户流失比较明显后&#xff0c; 如何提升活跃度&#xff1f; push notification 是一个有效的方式吗&#xff1f;添加评论 分享按票数排序10 个回答赞同反对&#xff0c;不会显示你的姓名Linda Jiang&#xff0c;友盟商务副总裁17 票&#xff0c;来自 LaneYu、程希冀、邹雪梅…

无法生成部件汇总表_RFID在汽车零部件企业仓储物流中的应用

随着物流行业的快速发展,RFID技术也逐渐得到了广泛应用。借助RFID技术,能在一定程度上切实促进数据和信息之间的快速传递,与此同时,这种传递方式属于非接触性的。现在RFID技术在不同领域得到了广泛应用,例如供应链管理,公交卡等.特别在近些年来,随着物流行业快速发展,RFID技术在…

CentOS7 源码编译安装NodeJS 最新版本Shell脚本

1&#xff0c;环境&#xff1a; 操作系统 CentOS Linux release 7.6.1810 (Core) 服务器环境 “腾讯云”服务器 cat /etc/centos-release # 查看centos系统版本 Node.js源码包下载地址&#xff1a;https://nodejs.org/dist/ 这里我们选择“Node.js v9.9.0” 执行如…

EasyExcel入门使用

目录标题官网github地址中文文档简单读简单写说明官网github地址 地址 中文文档 中文文档 简单读 import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data;import java.util.Date;/*** Created with I…

git 创建webpack项目_从0到1开发一个小程序cli脚手架(一)创建页面/组件模版篇...

github地址&#xff1a;https://github.com/jinxuanzheng01/xdk-clicli工具是什么&#xff1f;在正文之前先大致描述下什么是cli工具&#xff0c;cli工具英文名command-line interface,也就是命令行交互接口&#xff0c;比较典型的几个case例如&#xff0c;create-react-app&am…

Nginx 502 Bad Gateway 错误的原因及解决方法

2019独角兽企业重金招聘Python工程师标准>>> 刚才在调试程序的时候&#xff0c;居然服务器502错误&#xff0c;昨天晚上也发生了&#xff0c;好像我没有做非常规的操作。 然后网上寻找了下答案&#xff0c; 把一些原因及解决方法汇总一下&#xff0c;以防生产环境下…

easyExcel实现导入数据库

目录标题需求easyExcel Maven 依赖过程效果需求 我们需要将excel的数据导入至数据库中。 easyExcel Maven 依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dep…

CentOS7 shell脚本安装jdk

1&#xff0c;系统环境 操作系统 CentOS Linux release 7.6.1810 (Core) 64位 下载 Java SE Development Kit 8u152&#xff0c;文件名&#xff1a;jdk-8u152-linux-x64.rpm&#xff0c;下载地址&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/ja…

如何解决在使用ElementUI时发现有些控件是英文的

如下图 解决 我们需要在入口文件 main.js 中将 ElementUI 的默认语言改为中文。 import locale from element-ui/lib/locale/lang/en // lang i18n 英文 import zhLocale from element-ui/lib/locale/lang/zh-CN // 中文// 选择elementUi 默认语言为中文 Vue.use(ElementUI, …

CentOS7 源码编译安装Python3 shell脚本

1&#xff0c;系统环境 操作系统 CentOS Linux release 7.6.1810 (Core) 64位 2&#xff0c;Linux的Python3安装后即集成了pip&#xff0c;无需重新独立安装pip&#xff0c;执行以下命令完成python3和pip3的安装 yum groupinstall -y "Development tools" # 安…

ElementUI+Java实现搜索提示列表

效果 实现流程 首先我们需要在后端获取数据&#xff0c;我们可以根据name属性去模糊查询&#xff0c;返回Map类型的列表 然后将它返回给前端。 controller ApiOperation("根据关键字查询讲师名列表")GetMapping("list/name/{key}")public ResultVo sele…

CentOS7 搭建Pulsar 消息队列环境,CentOS(Linux)部署Pulsar,亲测成功,以及Python操作Pulsar实例驱动

在 最佳开源数据库与数据分析平台奖 中&#xff0c;之前曾连续两年入选的 Kafka 意外滑铁卢落选&#xff0c;取而代之的是新兴项目 Pulsar&#xff0c;Bossie Awards中对 Pulsar 点评如下&#xff1a;“Pulsar 旨在取代 Apache Kafka 多年的主宰地位。Pulsar在很多情况下提供了…

SpringSecurity +Jwt 实现权限管理

目录标题原理架构图demo的项目结构JwtTokenUtilRestAuthenticationEntryPoint 和 RestfulAccessDeniedHandlerMyUserDetailsServiceJwtAuthenticationTokenFilterSecurityConfigControllerPostman 测试为了方便&#xff0c;未采用是从数据库读取的方式。工具类都是别人那偷的&a…

FreeMarker_模板引擎_代码自动生成器_源码下载

首先我们先来认识一下Freemarker 1.what is the FreeMarker? 你可以到freemarker的官网上去&#xff0c;那里有很详细的介绍&#xff1a;http://freemarker.org/ 这里大概说一下&#xff1a;FreeMarker是一个用Java语言编写的模板引擎&#xff0c;它基于模板来生成文本输出。 …

CentOS7 搭建Kafka消息队列环境,以及Python3操作Kafka Demo

Kafka适合什么样的场景? 它可以用于两大类别的应用: 构造实时流数据管道&#xff0c;它可以在系统或应用之间可靠地获取数据。 (相当于message queue)构建实时流式应用程序&#xff0c;对这些流数据进行转换或者影响。 (就是流处理&#xff0c;通过kafka stream topic和topi…

hive序列生成_常见的序列化框架及Protobuf原理

享学课堂作者&#xff1a;逐梦々少年转载请声明出处&#xff01;上次我们详细的学习了Java中的序列化机制&#xff0c;但是我们日常开发过程中&#xff0c;因为java的序列化机制的压缩效率问题&#xff0c;以及序列化大小带来的传输的效率问题&#xff0c;一般很少会使用原生的…

decode语句不能再嵌套_自学C++基础教程【流程控制语句】(for、while 、do while 语句 )...

for语句for语句是C语言所提供的一种功能广泛的循环语句。下图为for语句的标准形式&#xff1a;表达式1&#xff1a;通常用于给循环变量赋初值&#xff0c;一般是赋值表达式。表达式2&#xff1a;通常用于设立循环条件&#xff0c;一般为关系表达式或逻辑表达式。表达式3&#x…