当前位置: 首页 > news >正文

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的后续部分.包括在项目中的使用以及其他特性.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • uni-app pinia搭建
  • Vue3开源Tree组件研发:节点勾选支持v-model
  • 防火墙——SNAT和DNAT策略的原理及应用、防火墙规则的备份、还原和抓包
  • python基础---1.变量、运算符和表达式、基本数据结构
  • 基于Orangepi全志H616开发嵌入式数据库——SQLite
  • Android Button设置点击监听器用switch case R.id.xxxx报错:Constant expression required
  • 2679. 矩阵中的和
  • DolphinDB Web 端权限管理:可视化操作指南
  • 钡铼网关实时数据互联,加速IEC104与MQTT云平台对接
  • C++STL简介(二)
  • 面试重点---快速排序
  • 模块与组件、模块化与组件化的理解
  • 可消费的媒体类型和可生成的媒体类型
  • 数据结构——单链表OJ题(上)
  • 玄机-第一章 应急响应-webshell查杀
  • 分享一款快速APP功能测试工具
  • 【面试系列】之二:关于js原型
  • 0x05 Python数据分析,Anaconda八斩刀
  • DataBase in Android
  • download使用浅析
  • es6要点
  • Idea+maven+scala构建包并在spark on yarn 运行
  • jdbc就是这么简单
  • react 代码优化(一) ——事件处理
  • Redis学习笔记 - pipline(流水线、管道)
  • Spring核心 Bean的高级装配
  • Theano - 导数
  • 闭包--闭包之tab栏切换(四)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 程序员该如何有效的找工作?
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 简单数学运算程序(不定期更新)
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 算法之不定期更新(一)(2018-04-12)
  • 线性表及其算法(java实现)
  • 学习HTTP相关知识笔记
  • 一份游戏开发学习路线
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #宝哥教你#查看jquery绑定的事件函数
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $.ajax()参数及用法
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (ZT)薛涌:谈贫说富
  • (二)linux使用docker容器运行mysql
  • (二)构建dubbo分布式平台-平台功能导图
  • (二十三)Flask之高频面试点
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (南京观海微电子)——COF介绍
  • (七)glDrawArry绘制
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (已解决)什么是vue导航守卫
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转载)Google Chrome调试JS