MybatisPlus快速入门及常见设置

目录

一、快速入门

1.1 准备数据

1.2 创建SpringBoot工程

1.3 使用MP

1.4 获取Mapper进行测试 

二、常用设置

2.1 设置表映射规则

2.1.1 单独设置

2.1.2 全局设置

2.2 设置主键生成策略 

2.2.1 为什么会有雪花算法?

2.2.2 垂直分表

2.2.3 水平分表

2.2.4 单独设置

2.2.5 全局设置

2.3 设置字段映射关系

 2.4 设置字段和列名的驼峰映射

2.5 设置打印日志


目前主要的ORM数据库的持久化框架主要有:MyBatis、Hibernate、Spring Data JPA,由于MyBatis的缺点还是较为明显的,所以国内团队就创建了MP来弥补这一缺陷。

MybatisPlus (简称 MP)是一个 Mybatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

一、快速入门

1.1 准备数据

CREATE TABLE `user` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`user_name` varchar(20) NOT NULL COMMENT '用户名',`password` varchar(20) NOT NULL COMMENT '密码',`name` varchar(30) DEFAULT NULL COMMENT '姓名',`age` int(11) DEFAULT NULL COMMENT '年龄',`address` varchar(100) DEFAULT NULL COMMENT '地址',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;insert  into `user`(`id`,`user_name`,`password`,`name`,`age`,`address`) values 
(1,'ruiwen','123','瑞文',12,'山东'),(2,'gailun','1332','盖伦',13,'平顶山'),(3,'timu','123','提姆',22,'蘑菇石'),(4,'daji','1222','妲己',221,'狐山');

1.2 创建SpringBoot工程

pom.xml文件的依赖如下:

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

观察依赖关系发现,如果添加了MP的依赖,那么就不需要添加Mybatis的依赖,因为MP内置了Mybatis:

启动类如下:

package com.fox.mp;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MpApplication {public static void main(String[] args) {SpringApplication.run(MpApplication.class, args);}}

实体类如下:

 @Data@NoArgsConstructor@AllArgsConstructorpublic class User {private Long id;private String userName;private String password;private String name;private Integer age;private String address;}

1.3 使用MP

添加依赖:

        <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency>

 配置数据库信息:

spring:datasource:url: jdbc:mysql://localhost:3306/mp_db?characterEncoding=utf-8&serverTimezone=UTCusername: "root"password: "root"driver-class-name: com.mysql.cj.jdbc.Driver

创建Mapper接口

package com.fox.mp.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fox.mp.domain.User;public interface UserMapper extends BaseMapper<User> {}

配置Mapper扫描 

package com.fox.mp;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.fox.mp.mapper")
public class MpApplication {public static void main(String[] args) {SpringApplication.run(MpApplication.class, args);}}

1.4 获取Mapper进行测试 

可以观察到,我们在测试方法中正确的查询了User表里面的内容。

二、常用设置

2.1 设置表映射规则

默认情况下,我们最好是让MP操作的表名就是实体类的类名,但是如果表名和类名不一致就需要我们自己设置映射规则,否则则会查询不到:

2.1.1 单独设置

可以在实体类的类名上加上@TableName注解进行标识。 例如: 如果表名是tb_user,而实体类名是User则可以使用以下写法:

2.1.2 全局设置

代码如下: 

mybatis-plus:global-config:db-config:#表名前缀table-prefix: tb_

2.2 设置主键生成策略 

执行以下代码:

查看数据库:

2.2.1 为什么会有雪花算法?

主要是由于数据规模的增长,可能会涉及到水平分表,而水平分表相比于垂直分表,会引入更多的复杂性,例如要求 :全局唯一的数据 ID。

而雪花算法在分布式场景下较为常用,其可以产生全局唯一且趋势递增的ID,以下简答概念了解即可:

雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。

核心思想:

长度共64bit(一个long型)。
首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。
41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)
优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高。
 

顺便简单聊聊数据库分表:

将不同业务数据分散存储到不同的数据库服务器,能够支撑百万甚至千万用户规模的业务,但如果业务继续发展,同一业务的单表数据也会达到单台数据库服务器的处理瓶颈。例如,淘宝的几亿用户数据,如果全部存放在一台数据库服务器的一张表中,肯定是无法满足性能要求的,此时就需要对单表数据进行拆分。
单表数据拆分有两种方式:垂直分表和水平分表,示意图如下:

2.2.2 垂直分表

垂直分表适合将表中某些不常用且占了大量空间的列拆分出去。
例如,前面示意图中的 nickname 和 description 字段,假设我们是一个相亲网站,用户在筛选其他用户的时候,主要是用 age 和 sex 两个字段进行查询,而 nickname 和 description 两个字段主要用于展示,一般不会在业务查询中用到。description 本身又比较长,因此我们可以将这两个字段独立到另外一张表中,这样在查询 age 和 sex 时,就能带来一定的性能提升。

2.2.3 水平分表

水平分表适合表行数特别大的表,有的公司要求单表行数超过 5000 万就必须进行分表,这个数字可以作为参考,但并不是绝对标准,关键还是要看表的访问性能。对于一些比较复杂的表,可能超过 1000万就要分表了;而对于一些简单的表,即使存储数据超过 1 亿行,也可以不分表。
但不管怎样,当看到表的数据量达到千万级别时,作为架构师就要警觉起来,因为这很可能是架构的性能瓶颈或者隐患。 

水平分表相比垂直分表,会引入更多的复杂性,例如要求全局唯一的数据id该如何处理。

主键自增

  • 以最常见的用户 ID 为例,可以按照 1000000 的范围大小进行分段,1 ~ 999999 放到表 1中,1000000 ~ 1999999 放到表2中,以此类推。
  • 复杂点:分段大小的选取。分段太小会导致切分后子表数量过多,增加维护复杂度;分段太大可能会导致单表依然存在性能问题,一般建议分段大小在 100 万至 2000 万之间,具体需要根据业务选取合适的分段大小。
  • 优点:可以随着数据的增加平滑地扩充新的表。例如,现在的用户是 100 万,如果增加到 1000 万,只需要增加新的表就可以了,原有的数据不需要动。
  • 缺点:分布不均匀。假如按照 1000 万来进行分表,有可能某个分段实际存储的数据量只有 1 条,而另外一个分段实际存储的数据量有 1000 万条。

取模

  • 同样以用户 ID 为例,假如我们一开始就规划了 10 个数据库表,可以简单地用 user_id % 10 的值来表示数据所属的数据库表编号,ID 为 985 的用户放到编号为 5 的子表中,ID 为 10086 的用户放到编号为 6 的子表中。
  • 复杂点:初始表数量的确定。表数量太多维护比较麻烦,表数量太少又可能导致单表性能存在问题。
  • 优点:表分布比较均匀。
  • 缺点:扩充新的表很麻烦,所有数据都要重分布。

还有一种方式就是雪花算法了,由于上面介绍了,这里就不再进行赘述。

2.2.4 单独设置

默认情况下使用MP插入数据时,如果在我们没有设置主键生成策略的情况下默认的策略是基于雪花算法 的自增id。 如果我们需要使用别的策略可以在定义实体类时,在代表主键的字段上加上 @TableId 注解,使用其 type 属性指定主键生成策略。

例如: 我们要设置主键自动增长则可以设置如下:

 @Data@NoArgsConstructor@AllArgsConstructorpublic class User {@TableId(type = IdType.AUTO)private Long id;//.....}

全部主键策略定义在了枚举类 IdType 中, IdType 有如下的取值:

AUTO

数据库ID自增,依赖于数据库。该类型请确保数据库设置了 ID自增 否则无效

NONE

未设置主键类型。若在代码中没有手动设置主键,则会根据主键的全局策略自动生成(默认的主键 全局策略是基于雪花算法的自增ID)。

INPUT

需要手动设置主键,若不设置。插入操作生成SQL语句时,主键这一列的值会是 null。

ASSIGN_ID

当没有手动设置主键,即实体类中的主键属性为空时,才会自动填充,使用雪花算法。

ASSIGN_UUID

当实体类的主键属性为空时,才会自动填充,使用UUID。

2.2.5 全局设置

代码如下:

mybatis-plus:global-config:db-config:# id生成策略 auto为数据库自增id-type: auto

2.3 设置字段映射关系

默认情况下MP会根据实体类的属性名去映射表的列名。 如果数据库的列表和实体类的属性名不一致了我们可以使用 关系。 例如: @TableField 注解的 value 属性去设置映射 如果表中一个列名叫 address而 实体类中的属性名为addressStr则可以使用如下方式进行配置。

 @TableField("address")private String addressStr

 2.4 设置字段和列名的驼峰映射

默认情况下MP会开启字段名列名的驼峰映射, 即从经典数据库列名 A_COLUMN(下划线命名) 到经 典 Java 属性名 aColumn(驼峰命名) 的类似映射 :

例如以下操作:

数据库如下:

也正是因为这种映射,所以才能程序执行成功:

 这时我们将列名改为username,程序就会报错:

报错如下: 

这时我们可以通过配置,取消MP的默认驼峰映射即可:

yml代码如下:

mybatis-plus:configuration:#是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名)#到经典 Java 属性名 aColumn(驼峰命名) 的类似映射map-underscore-to-camel-case: false

当然,其实我们一般也不会关闭它,因为默认这种关联方式较为主流。

2.5 设置打印日志

如果需要打印MP操作对应的SQL语句等,可以配置日志输出。 配置方式如下:

mybatis-plus:#  日志configuration:log-impl:  org.apache.ibatis.logging.stdout.StdOutImpl

展示效果:

 

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

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

相关文章

JavaScript流程控制详解之顺序结构和选择结构

流程控制 流程控制&#xff0c;指的是控制程序按照怎样的顺序执行 在JavaScript中&#xff0c;共有3种流程控制方式 顺序结构选择结构循环结构 顺序结构 在JavaScript中&#xff0c;顺序结构是最基本的结构&#xff0c;所谓的顺序结构&#xff0c;指的是代码按照从上到下、…

上海亚商投顾:沪指涨超3% 深成指和创指双双飙涨超6%

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 今日A股三大指数一改近期低迷状态&#xff0c;早盘小幅低开后一路高歌猛进集体大涨&#xff0c;沪指涨超3%&am…

锁(二)队列同步器AQS

一、队列同步器AQS 1、定义 用来构建锁或者其他同步组件的基础框架&#xff0c;它使用了一个int成员变量表示同步状态&#xff0c;通过内置的FIFO队列来完成资源获取线程的排队工作。是实现锁的关键。 2、实现 同步器的设计是基于模板方法模式的&#xff0c;也就是说&#…

如何安装x11vnc并结合cpolar实现win远程桌面Deepin

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff…

11.0 Zookeeper watcher 事件机制原理剖析

zookeeper 的 watcher 机制&#xff0c;可以分为四个过程&#xff1a; 客户端注册 watcher。服务端处理 watcher。服务端触发 watcher 事件。客户端回调 watcher。 其中客户端注册 watcher 有三种方式&#xff0c;调用客户端 API 可以分别通过 getData、exists、getChildren …

GLSL ES 1.0

GLSL ES 概述 写在前面 程序是大小写敏感的每一个语句都应该以英文分号结束一个shader必须包含一个main函数&#xff0c;该函数不接受任何参数&#xff0c;并且返回voidvoid main() { }数据值类型 GLSL支持三种数据类型&#xff1a; 整型浮点型&#xff1a;必须包含小数点&…

python 动态显示数据。

界面显示动态的数据。 from time import sleep import serialimport tkinter as tklis[1,10,40] # 打开串行端口 ser serial.Serial(COM3, 9600) # 9600为波特率&#xff0c;根据实际情况进行调整# 创建窗口和画布 window tk.Tk() canvas tk.Canvas(window, width400, heig…

高阶滤波器

一阶后向差分&#xff1a;s&#xff08;1-z^(-1)&#xff09;/T dx/dt[x(k)-x(k-1)]/T[x(k)-x(k)z^(-1)]/Tx(k)*&#xff08;1-z^(-1)&#xff09;/T 一阶前向差分&#xff1a;s(z-1)/T dx/dt[x(k1)-x(k)]/T[z*x(k)-x(k)]/Tx(k)*(z-1)/T 双线性差分&#xff1a;s(2/T)*(1-z…

通过 docker-compose 部署 Flink

概要 通过 docker-compose 以 Session Mode 部署 flink 前置依赖 Docker、docker-composeflink 客户端docker-compose.yml version: "2.2" services:jobmanager:image: flink:1.17.2ports:- "8081:8081"command: jobmanagervolumes:- ${PWD}/checkpoin…

【大模型上下文长度扩展】FlashAttention:高效注意力计算的新纪元

FlashAttention&#xff1a;高效注意力计算的新纪元 核心思想核心操作融合&#xff0c;减少高内存读写成本分块计算&#xff08;Tiling&#xff09;&#xff0c;避免存储一次性整个矩阵块稀疏注意力&#xff0c;处理长序列时的效率问题利用快速 SRAM&#xff0c;处理内存与计算…

【大模型上下文长度扩展】LongQLoRA:单GPU(V100)环境下的语言模型优化方案

LongQLoRA 核心问题子问题1: 预定义的上下文长度限制子问题2: 训练资源的需求高子问题3: 保持模型性能分析不足 LongQLoRA方法拆解子问题1: 上下文长度限制子问题2: 高GPU内存需求子问题3: 精确量化导致的性能损失分析不足效果 论文&#xff1a;https://arxiv.org/pdf/2311.048…

docker镜像结构

# 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["java", "-jar"…

游泳耳机推荐性价比排行榜,四大高性价比游泳耳机推荐

随着运动健康意识的提高&#xff0c;越来越多的朋友选择在游泳馆进行锻炼。然而&#xff0c;在水中享受音乐并非易事&#xff0c;这就需要一款真正防水的耳机。尽管市面上有许多声称具备防水功能的耳机产品&#xff0c;但实际使用中往往难以达到理想的防水效果。为了帮助大家找…

之前看过的前序遍历的线索二叉树感觉写的有点问题 这里更新一下我的思路

前序线索化 #include<iostream> using namespace std;typedef int datatype; typedef struct BitNode {datatype Data;struct BitNode* leftchild;struct BitNode* rightchild;int lefttag;int righttag; }Node; #pragma region 前序线索化递归遍历 Node* previous NUL…

maven依赖报错处理(或者maven怎么刷新都下载不了依赖)

maven依赖报错&#xff0c;或者不报错&#xff0c;但是怎么刷新maven都没反应&#xff0c;可以试一下以下操作 当下载jar的时候&#xff0c;如果断网&#xff0c;或者连接超时的时候&#xff0c;会自动在文件夹中创建一个名为*lastupdate的文件&#xff0c;当有了这个文件之后…

网络工程师专属春节对联,不要太真实了!

中午好&#xff0c;我的网工朋友。 都放假了没&#xff1f;龙年将至&#xff0c;都有啥新年计划&#xff1f; 过年&#xff0c;讲究的就是一个热闹&#xff0c;可以暂时告别辛苦的一年&#xff0c;重新整装出发。 热闹可少不了春联啊&#xff0c;红红火火又一年&#xff0c;…

Vue源码系列讲解——虚拟DOM篇【一】(Vue中的虚拟DOM)

目录 1. 前言 2. 虚拟DOM简介 2.1什么是虚拟DOM&#xff1f; 2.2为什么要有虚拟DOM&#xff1f; 3. Vue中的虚拟DOM 3.1 VNode类 3.2 VNode的类型 3.2.1 注释节点 3.2.2 文本节点 3.2.3 克隆节点 3.2.4 元素节点 3.2.5 组件节点 3.2.6 函数式组件节点 3.2.7 小结 3…

OpenCV-31 获得形态学卷积核

OpenCV提供了获取卷积核的API&#xff0c;不需要我们手动创建卷积核。 通过下面API---getStructuringElement(shape&#xff0c;ksize&#xff0c;[, anchor]) shape是指卷积核的型状&#xff0c;注意不是指长宽&#xff0c;是指卷积核中1形成的形状。MORPH_RECT 卷积核中的1…

(三)elasticsearch 源码之启动流程分析

https://www.cnblogs.com/darcy-yuan/p/17007635.html 1.前面我们在《&#xff08;一&#xff09;elasticsearch 编译和启动》和 《&#xff08;二&#xff09;elasticsearch 源码目录 》简单了解下es&#xff08;elasticsearch&#xff0c;下同&#xff09;&#xff0c;现在我…

SPSS基础操作:对数据进行加权处理

对数据进行加权处理是我们使用SPSS提供某些分析方法的重要前提。对数据进行加权后&#xff0c;当前的权重将被保存在数据中。当进行相应的分析时&#xff0c;用户无须再次进行加权操作。本节以对广告的效果观测为例&#xff0c;讲解数据的加权操作。本例给出了消费者购买行为与…