MyBatis-Plus的基本使用(一)

目录

前言

特性

MyBatis-Plus入门案例

常用注解

小结


前言

这篇文章主要来学习MyBatis-Plus这个非常强大的框架.

在学习MyBatis-Plus之前,需要有MyBatis的学习基础.因为MyBatis -Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

这里提到的简化开发,提高效率主要是MyBatis-Plus为我们省去了很多的SQL的操作.也就是说我们在项目中可以将更多的精力放在业务上,而不是SQL语句上,

这也为很多的不喜欢写SQL的人提供了很好的便利.

特性

只做增强不做改变,引入它不会对现有工程产生影响,启动即会自动注入基本 CURD,性能基本无损耗,内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求,通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错.  更对特性请移步官网: MyBatis-Plus 🚀 为简化开发而生

MyBatis-Plus入门案例

MyBatis -Plus的使用非常简单,只要你属性springboot,你就能非常轻松的使用它.

在使用之前我们需要创建一个springboot项目. 关于springboot项目创建这里再不过多赘述.

 在项目创建好,因为MyBatis -Plus主要是对数据库进行操作,所以我们需要引入数据库驱动,配置数据源等操作.关于这个操作这里也不过多赘述

在一切准备工作就绪之后,我们就需要在我们的项目中引入MyBatis -Plus的依赖了.

       <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-core</artifactId><version>3.5.7</version></dependency>

然后我们需要执行我们的SQL语句.来创建对应的表结构.

CREATE TABLE `sys_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户主键',`username` varchar(255) DEFAULT NULL COMMENT '用户名',`password` varchar(255) DEFAULT NULL COMMENT '用户密码',`email` varchar(255) DEFAULT NULL COMMENT '用户邮箱',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

创建实体类.

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {private Long userId;  // 用户IDprivate String username;private String password;private String email;
}

实体类和sql创建好了之后,我们还需要创建mapper接口.

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

可以看到我们的mapper接口中,我们是继承了BaseMapper类,并设置泛型为我们的实体类.

接下来我们就可以对UserMapper接口进行测试,测试mybatis-plus给我们提供的API.

需要注意的是.需要在启动类上添加MapperScan注解,标明mapper包的位置

@SpringBootApplication
@MapperScan("com.example.mybatisplus.mapper")
public class MybatisPlusApplication {public static void main(String[] args) {SpringApplication.run(MybatisPlusApplication.class, args);}}

接下来我们就可以进行测试

1. 创建springboot的测试类

2. 注入UserMapper

3. 使用MyBatis-Plus提供的API

@SpringBootTest
class MybatisPlusApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testUser() {// 这个方法表示查询所有List<User> users = userMapper.selectList(null);System.out.println(users);}
}

点击运行之后,就会出现

这样的错误,这是因为我们的实体类和数据库中表名不一致导致的,mybatis-plus默认会把我们的实体类的名称当做数据库中表名进行操作,如何解决这个问题呢?

1. 在实体类上使用注解

可以在实体类上使用@TableName这个注解 这个注解的作用就是指定表明,在实体类上加,表示映射的表名

同时可以使用@TableId, 这个注解的作用就是指定主键的字段,在userId字段上添加这个注解,并设置value的值为id,说明此字段在数据库中映射为主键,主键字段为id

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_user")
public class User implements Serializable {@TableId(value = "id")  // 主键private Long userId;  // 用户IDprivate String username;private String password;private String email;
}

添加这个注解之后,我们在运行测试方法

可以看到能够正确的从数据库表中查询中所有的数据

2. 在配置文件中统一配置表前缀


# mybatis-plus配置
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
mybatis-plus.type-aliases-package=com.example.mybatisplus.model
# 打印sql
mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl
# 设置表名前缀 SYS_ 
mybatis-plus.global-config.db-config.table-prefix= SYS_

当我们在配置文件中配置表前缀之后,实体类上@TableName注解就可以去掉了,但是需要注意的是,当在配置文件中配置之后,后续的数据库表名的前缀就都应该与我们配置的前缀相同.

现在再次运行测试方法: 

在控制台中同时也打印出来了执行的sql,说明我们的配置是生效了.

 我们再进行一次插入操作:

    @Testpublic void testInsert() {User user = new User();user.setUsername("ccccccccc");user.setEmail("ccccccccc@qq.com");int insert = userMapper.insert(user); // 插入一条记录System.out.println(insert);}

 这里可以看到mybatis-plus插入的值,但是大家发现主键id的值是不是不正常

 这是因为mybatis-plus默认使用的主键策略是雪花算法。雪花算法 (Snowflake) 是 Twitter 开发的一种分布式 ID 生成算法,用于在分布式系统中生成唯一的 64 位整数 ID。雪花算法生成的 ID 不仅具有全局唯一性,还能够根据时间顺序生成有序的 ID,这对于需要高并发和分布式环境的系统非常有用。但是对于我们目前来说用不到,那么我们就不能再使用雪花算法了,而是使用数据库自己的主键生成策略.

@TableId(value = "id",type = IdType.AUTO)  // 主键 ID 自增

在主键的字段上面的TableId注解上,添加type,如上所示. 就能将注解的生成策略设置为数据库的自增主键,然后我们再次运行插入的测试方法:

可以看到在插入的时候,mybatis-plus不会使用雪花算法来计算主键并一起插入了. 现在主键就是使用的我们数据库的自动递增的策略.

 可以看到,刚才插入的主键的值比之前的主键刚好递增一次.这里需要说明,现在的主键并没有使用雪花算法,那为什么值还是如此大,原因就是上次在插入时使用的时雪花算法,并且给我们生成了一个id,并且插入,那么这次在插入的时候,我们使用的数据库的自动递增策略,自动递增就是在上一个注解的基础之后+1.

常用注解

目前我们已经介绍了两个注解,分别是@TableName和@TableId

这里对这些注解做个整体说明:

@TableName 指定表明,在实体类上加,表示映射的表名
@TableId 在属性上添加,将这个数据对应的字段设置为主键,@TableId() 的value属性,用于指定主键的字段,@TableId() 的type属性,type表示主键生成的策略,id使用默认的为雪花算法,
@TableField(" ")   // 指定这个字段所对应的数据库中的字段名

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_user")
public class User implements Serializable {@TableId(value = "id",type = IdType.AUTO)  // 主键 ID 自增private Long userId;  // 用户ID@TableField("username")private String name;private String password;private String email;
}


@TableLogic  在某个字段上添加这个注解,表示这个字段表示逻辑删除    

演示这个注解我们需要重新设置表结构,添加is_delete字段,0表示正常,1表示删除
 


alter table sys_user add COLUMN is_delete int 

在表中添加一个字段,用户表示使用删除.

修改实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_user")
public class User implements Serializable {@TableId(value = "id",type = IdType.AUTO)  // 主键 ID 自增private Long userId;  // 用户ID@TableField("username")private String name;private String password;private String email;@TableLogic  // 逻辑删除 字段  0 未删除  1 已删除private int isDelete;
}

需要注意的是,数据库中的字段为is_delete,而在实体类中字段为isDelete,两个字段的名称不一致,但是也没有添加tableField注解,这是因为字段名称的映射有默认规则,它会根据驼峰命名法自动将Java类的属性名映射到数据库中的字段名。因此,即使没有使用 @TableField 注解,MyBatis-Plus 仍然能够将 isDelete 映射到 is_delete

MyBatis-Plus 默认遵循的映射规则是将 Java 类中的驼峰命名属性名转换为下划线分隔的小写字段名。例如,isDelete 会自动映射到 is_delete

我们进行查询测试:

查询测试:

可以看到在查询的时候,后面添加了一个规则,where is_delete=0,这就是我们在进行逻辑删除的字段.

插入测试:

小结

mybatis-plus的基本使用是非常简单的,总体来说分为以及步骤:

1. 创建springboot项目,引入mybatis-plus依赖

2. 创建数据库和实体类

3. 创建mapper接口,并继承BaseMapper类

这篇文章主要介绍mybatis-plus的入门基本使用,下篇文章将进行mybatis-plus的后续部分.包括在项目中的使用以及其他特性.

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

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

相关文章

Leetcode3216. 交换后字典序最小的字符串

Every day a Leetcode 题目来源&#xff1a;3216. 交换后字典序最小的字符串 解法1&#xff1a;模拟 找到第一个 s[i] > s[i 1]&#xff0c;且它们奇偶性相同&#xff0c;交换它们。 代码&#xff1a; /** lc appleetcode.cn id3216 langcpp** [3216] 交换后字典序最小…

Efficient and Effective Weakly-Supervised Action Segmentation via ATBA

**基于动作转移感知边界对齐的高效弱监督动作分割**介绍 动作分割的目的是将一个长的未裁剪的视频分割成几个片段&#xff0c;并将每个片段分类为一个动作类别&#xff0c;如下图所示&#xff1a; 弱监督动作分割 现有的训练方法大多需要通过对所有帧和文本进行序列比对来…

JavaScript构造函数小挑战

// 编码挑战 #1 /* 使用构造函数实现一辆汽车。一辆汽车有一个品牌和一个速度属性。speed 属性是汽车当前的速度&#xff0c;单位为 km/h&#xff1b; a. 执行一个 “accelerate ”方法&#xff0c;将汽车的速度提高 10&#xff0c;并将新速度记录到控制台&#xff1b; 3. a.…

笔记小结:现代卷积神经网络之批量归一化

本文为李沐老师《动手学深度学习》笔记小结&#xff0c;用于个人复习并记录学习历程&#xff0c;适用于初学者 训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。 本节将介绍批量规范化&#xff08;batch normalization&#xff09;&#xf…

Dav_笔记10:Using SQL Plan Management之3

将SQL计划基准与SQL Tuning Advisor一起使用 使用SQL Tuning Advisor调整SQL语句时&#xff0c;如果顾问程序找到调优计划并验证其性能优于从相应SQL计划基准中选择的计划&#xff0c;则建议接受SQL配置文件。 接受SQL配置文件后&#xff0c;数据库会将调整后的计划添加到相应…

群管机器人官网源码

一款非常好看的群管机器人html官网源码 搭建教程&#xff1a; 域名解析绑定 源码文件上传解压 访问域名即可 演示图片&#xff1a; 群管机器人官网源码下载&#xff1a;客户端下载 - 红客网络编程与渗透技术 原文链接&#xff1a; 群管机器人官网源码

云仓如何改变传统仓储模式?

云仓&#xff0c;即云仓储&#xff0c;是一种基于互联网技术的现代仓储模式&#xff0c;与传统的仓储模式相比&#xff0c;它在多个方面进行了创新和优化&#xff0c;包括&#xff1a; ———————————————————— 1、数据管理与实时监控&#xff1a; 云仓储利…

Element-ui :el-table 中表尾合计行

Table 表格 | Element Plus <template><el-table :data"tableData" border show-summary :summary-method"getSummariesss" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…

C++与lua联合编程

C与lua联合编程 一、环境配置二、lua基本语法1.第一个lua和C程序2.基本数据类型和变量2.1 Nil2.2 Booleans2.3 Numbers2.4 String(最常用) 3. 字符串处理3.1 错误处理3.2 字符串长度:string.len3.3 字符串子串 :string.sub3.4 字符串查找: string.find3.5字符串替换: string.gs…

【笔记】ubuntu 误退了搜狗输入法:终端上输入fcitx即可重启

有时候&#xff0c;我们可能嫌弃ubuntu上的搜狗输入法&#xff0c;点击了退出&#xff1a; 但是当我们想开启搜狗输入法时&#xff0c;发现它消失了&#xff0c;此时我们可以打开终端&#xff0c;键入&#xff1a; fcitx 即可成功开启。

一些和颜色相关网站

1.中国传统色 2.网页颜色选择器 3.渐变色网站 4.多风格色卡生成 5.波浪生成 6.半透明磨砂框 7.色卡组合

全国区块链职业技能大赛国赛考题前端功能开发

任务3-1:区块链应用前端功能开发 1.请基于前端系统的开发模板,在登录组件login.js、组件管理文件components.js中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功能完整性,示例页面如下: 具体要求如下: (1)有明确的提示,提示用户选择角色; (2)用户可看…

微服务安全——OAuth2详解、授权码模式、SpringAuthorizationServer实战、SSO单点登录、Gateway整合OAuth2

文章目录 Spring Authorization Server介绍OAuth2.0协议介绍角色OAuth2.0协议的运行流程应用场景授权模式详解客户端模式密码模式授权码模式简化模式token刷新模式 OAuth 2.1 协议介绍授权码模式PKCE扩展设备授权码模式拓展授权模式 OpenID Connect 1.0协议Spring Authorizatio…

用51单片机或者stm32能否开发机器人呢?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;能的。但是由于单片机和st…

百度,有道,谷歌翻译API

API翻译 百度&#xff0c;有道&#xff0c;谷歌API翻译&#xff08;只针对中英相互翻译&#xff09;,其他语言翻译需要对应from&#xff0c;to的code 百度翻译 package fills.tools.translate; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis…

OpenWrt 为软件包和docker空间扩容

参考资料 【openwrt折腾日记】解决openwrt固件刷入后磁盘空间默认小的问题&#xff0c;关联openwrt磁盘扩容空间扩容【openwrt分区扩容】轻松解决空间可用不足的尴尬丨老李一瓶奶油的YouTube 划分空间 参考一瓶奶油的YouTube 系统 -> 磁盘管理 -> 磁盘 -> 修改 格…

axios请求大全

本文讲解axios封装方式以及针对各种后台接口的请求方式 axios的介绍和基础配置可以看这个文档: 起步 | Axios中文文档 | Axios中文网 axios的封装 axios封装的重点有三个&#xff0c;一是设置全局config,比如请求的基础路径&#xff0c;超时时间等&#xff0c;第二点是在每次…

SQL labs-SQL注入(二)

环境搭建参考 SQL注入&#xff08;一&#xff09; 一&#xff0c;SQL labs-less2。 http://192.168.61.206:8001/Less-2/?id-1 union select 1,2,group_concat(username , password) from users-- 与第一关没什么太大的不同&#xff0c;唯一区别就是闭合方式为数字型。 二…

【ffmpeg命令入门】ffplay常用命令

文章目录 前言ffplay的简介FFplay 的基本用法常用参数及其作用示例 效果演示图播放普通视频播放网络媒体流RTSP 总结 前言 FFplay 是 FFmpeg 套件中的一个强大的媒体播放器&#xff0c;它基于命令行接口&#xff0c;允许用户以灵活且高效的方式播放音频和视频文件。作为一个简…

系统架构设计师教程 第4章 信息安全技术基础知识-4.3 信息安全系统的组成框架4.4 信息加解密技术-解读

系统架构设计师教程 第4章 信息安全技术基础知识-4.3 信息安全系统的组成框架 4.3 信息安全系统的组成框架4.3.1 技术体系4.3.1.1 基础安全设备4.3.1.2 计算机网络安全4.3.1.3 操作系统安全4.3.1.4 数据库安全4.3.1.5 终端安全设备4.3.2 组织机构体系4.3.3 管理体系4.4 信息加…