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.mzph.cn/bicheng/50843.shtml

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

相关文章

【Java Bean 映射器】通过 MapStruct 和 BeanUtils 拷贝对象的区别

目录 &#x1f44b;前言 &#x1f440;一、环境准备 &#x1f331;二、拷贝工具使用 2.1 BeanUtils 使用 2.2 MapStruct 使用 &#x1f49e;️三、对比 &#x1f4eb;四、章末 &#x1f44b;前言 小伙伴们大家好&#xff0c;最近在一些技术文章中看到了开发时经常接触的对…

面向对象·回顾;万类之祖object;抽象类Abstract。

回顾面向对象 类与对象 类--------&#xff08;instance实例化对象&#xff09;-------->对象 类图 调出你public方法–接口 访问控制符 常用private&#xff0c;public。 封装 可见性本类包不同包private✓✕✕不写dafalt(默认)✓✓✕protected✓✓继承✓public✓✓✓…

【计算机网络】RIP路由协议实验

一&#xff1a;实验目的 1&#xff1a;掌握在路由器上配置RIPv2。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。具体为&#xff1a;三层交换机1台、路由器2台。 软件&#xff1a;wireshark软件、记…

01-调试开发k8s

使用 Docker 构建 Kubernete 官方 release 是使用 Docker 容器构建的。要使用 Docker 构建 Kubernetes&#xff0c;请遵循以下说明: Requirements docker Key scripts 以下脚本位于 build/ 目录中。请注意&#xff0c;所有脚本都必须从 Kubernetes 根目录运行 build/run.…

【科研绘图】记录一次论文结果复现

复现原论文中的图片是科研的基本功之一&#xff0c;它不仅验证了研究结果的可靠性&#xff0c;确保了科学工作的准确性和可重复性&#xff0c;还深刻地评估了方法的有效性&#xff0c;体现了对原始研究的尊重和对科学过程的严谨态度。这个过程不仅提高了研究的透明度&#xff0…

记忆注意力用于多模态情感计算!

记忆注意力用于多模态情感计算&#xff01; 目录 情感计算 一、概述 二、研究背景 三、模型结构和代码 六、数据集介绍 七、性能展示 八、复现过程 九、运行过程 模型总结 本文所涉及所有资源均在传知代码平台可获取。 情感计算 近年来&#xff0c;社交媒体的快速扩张推动了用户…

信通院发布!首个大模型混合云标准

近日&#xff0c;中国信通院发布了首个大模型混合云标准&#xff0c;通过定位当前大模型混合云的能力水平&#xff0c;为基于混合云的大模型服务实践提供指引&#xff0c;并明确未来提升方向。同时&#xff0c;中国信通院基于标准展开大模型混合云能力成熟度专项测试&#xff0…

智能家居全在手机端进行控制,未来已来!

未来触手可及&#xff1a;智能家居&#xff0c;手机端的全控时代 艾斯视觉的观点是&#xff1a;在不远的将来&#xff0c;家&#xff0c;这个温馨的港湾&#xff0c;将不再只是我们休憩的场所&#xff0c;而是科技与智慧的结晶。想象一下&#xff0c;只需轻触手机屏幕&#xf…

VMware 上的 Debian Linux 虚拟机无法听到蓝牙耳机的声音解决方案

项目场景&#xff1a; 在Debian上安装QQ音乐&#xff0c;用来摸鱼 问题描述 在安装完QQ音乐后&#xff0c;发现虚拟机无法听到声音&#xff0c;音乐有在正常播放&#xff0c;但是蓝牙耳机没有听到任何声音&#xff1a; 原因分析&#xff1a; 感觉是虚拟机的声卡没有配置&…

WiFi通信——STM32通过ESP8266-01S与阿里云通信

嵌入式设计中常用的无线通信方式主要由蓝牙、WiFi、Zigbee、Lora、NB-IOT等等。这些是最常用的&#xff0c;也是在实际项目开发中根据项目的数据通信特点来选择相应的无线通信方式。本设计主要是讲解WiFi在嵌入式开发中的使用。 1.ESP8266的三种模式 1.1 STA模式(Station) 工…

FPGA开发——独立仿真和联合仿真

一、概述 我们在进行FPGA开发的过程之中&#xff0c;大部分情况下都是在进行仿真&#xff0c;从而验证代码实现结果的正确与否&#xff0c;这里我们引入了独立仿真和联合仿真进行一个简单介绍。 联合仿真&#xff1a;一般我们在进行仿真之前需要在相应的软件中建立相应的工程…

昇思25天学习打卡营第01天|昇思MindSpore大模型基础j介绍

昇思MindSpore和华为昇思MindSpore大模型学习打卡系列文章&#xff0c;本文仅供参考~ 文章目录 前言一、昇思MindSpore是什么&#xff1f;二、执行流程三、设计理念四、层次结构五、Huawei昇腾AI全栈 前言 随着计算机大模型的不断发展&#xff0c;Ai这门技术也越来越重要&#…

【LeetCode 随笔】C++入门级,详细解答加注释,持续更新中。。。

文章目录 58.【简单】最后一个单词的长度&#x1f31f; &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻&#xff0c;都…

使用vfbox网关实现modbus opc profinet iec61850等协议间的转换

在当今物联网&#xff08;IoT&#xff09;与工业自动化日益融合的时代背景下&#xff0c;协议转换网关作为连接不同设备与系统之间的桥梁&#xff0c;扮演着至关重要的角色。VFBox协议转换网关&#xff0c;作为这一领域内的佼佼者&#xff0c;以其高效、灵活、可靠的性能&#…

学习周报:文献阅读+HEC RAS案例

目录 摘要 Abstract 文献阅读&#xff1a;通过HEC RAS软件为罗马尼亚布加勒斯特市的Dmbovița河水管理的水力模型 文献摘要 讨论|结论 理论知识 边界条件计算 流量计算方式 曼宁公式 (Mannings Equation) 连续性方程 (Continuity Equation) 能量方程 (Energy Equatio…

API资源对象CRD、认识Operator-理论知识和认识Operator-初次上手(2024-07-17)

一、API资源对象CRD Kubernetes 自定义资源定义&#xff08;Custom Resource Definition&#xff0c;简称 CRD&#xff09;是一种强大的 Kubernetes API 扩展机制&#xff0c;允许你定义和创建自己的资源类型&#xff0c;以满足您的应用程序或基础设施需求。 CRD 的核心思想是…

LeetCode 2766题: 重新放置石块(原创)

【题目描述】 给你一个下标从 0 开始的整数数组 nums &#xff0c;表示一些石块的初始位置。再给你两个长度 相等 下标从 0 开始的整数数组 moveFrom 和 moveTo 。 在 moveFrom.length 次操作内&#xff0c;你可以改变石块的位置。在第 i 次操作中&#xff0c;你将位置在 moveF…

基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码

第一步&#xff1a;准备数据 5种鸟类行为数据&#xff1a;self.class_indict ["bowing_status", "grooming", "headdown", "vigilance_status", "walking"] &#xff0c;总共有23790张图片&#xff0c;每个文件夹单独放一…

从零搭建pytorch模型教程(八)实践部分(二)目标检测数据集格式转换

前言 图像目标检测领域有一个非常著名的数据集叫做COCO&#xff0c;基本上现在在目标检测领域发论文&#xff0c;COCO是不可能绕过的Benchmark。因此许多的开源目标检测算法框架都会支持解析COCO数据集格式。通过将其他数据集格式转换成COCO格式可以无痛的使用这些开源框架来训…

【计算机网络】静态路由实验

一&#xff1a;实验目的 1&#xff1a;掌握通过静态路由方法实现网络的连通性。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS-C服务器、网线、Windows 2019/2003操作系统的计算机等。 软件&#xff1a;记事本、WireShark、Chrome浏览器等。 三&#xff1a;实验方…