MyBatisPlus基础入门笔记

MyBatisPlus基础入门笔记,源码可见下载链接
大家阅读时可善用目录功能,可以提高大家的阅读效率
下载地址:MyBatisPlus源码+笔记


初识MyBatisPlus

入门案例

SpringBoot整合MyBatis(复习)

  1. 创建SpringBoot工程
  2. 勾选使用的到的技术
  3. 设置dataSource相关属性(JDBC参数)
  4. 定义数据层接口映射配置

SpringBoot整合MyBatisPlus(简称mp)

  1. 创建新模块,选择Spring初始化,并配置模块相关基础信息(SQL中只需要勾选MySQL Driver)
  2. 手动添加mp起步依赖
  3. 设置jdbc参数
  4. 制作实体类和表结构
  5. 定义数据接口,继承BaseMapper<>
  • pom.xml
    • 由于MyBaits的起步依赖中mybatis-spring的版本过低,所以在SpringBoot3.X的版本上无法运行
    • 所以需要再配置一个高版本的mybatis-spring来解决maven的依赖传递问题
<dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.20</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version></dependency></dependencies>
  • UserDao
@Mapper
public interface UserDao extends BaseMapper<ABC> { }
  • domain/ABC
    • 如果表名和实体类名不一样,可以加上@TableName(“对应表名”)的注解
@TableName("user")
public class ABC {private Long id;private String name;private String password;private Integer age;private String tel;//......//略去getter setter方法以及toString方法
}
  • application.yml
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatisplus_dbusername: rootpassword: 123456
  • 测试类
@SpringBootTest
class MyBatisPlusApplicationTests {@Autowiredprivate UserDao userDao;@Testvoid testGetAll() {List<ABC> Users = userDao.selectList(null);System.out.println(Users);}
}

MyBatisPlus概述

  • MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发,提高效率
  • 国内组织开发的技术

在这里插入图片描述


标准数据层开发

mp提供的接口

在这里插入图片描述

Lombok

  • lombok,一个Java类库,提供了一组注解,简化POJO实体类的开发

  • 常用@Data:注解在类上,提供get、set、equals、hashCode、canEqual、toString、无参构造方法,没有有参构造

  • pom.xml

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope>
</dependency>
  • 实体类
@Data
//如果表名和实体类名不一样,可以加上@TableName("对应表名")的注解
@TableName("user")
public class User {private Long id;private String name;private String password;private Integer age;private String tel;
}

MP分页查询功能

  1. 设置分页拦截器作为Spring管理的bean
  2. 执行分页查询
  3. 开启日志(可选)
  • config/Mpconfig
@Configuration
public class Mpconfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){//1.定义mp拦截器MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();//2.在mp拦截器中添加具体拦截器mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mybatisPlusInterceptor;}
}
  • 测试类
@SpringBootTest
class MyBatisPlusApplicationTests {@Autowiredprivate UserDao userDao;@Testvoid testGetByPage(){IPage page = new Page(1,5);userDao.selectPage(page,null);System.out.println("当前页码数:"+ page.getCurrent());System.out.println("每页显示数:"+ page.getSize());System.out.println("一共多少页:"+ page.getPages());System.out.println("一共多少条:"+ page.getTotal());System.out.println("数据:"+ page.getRecords());}
}
  • application.yml —— 开启日志(可选)
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

DQL编程控制

条件查询

四种常见查询方式

  • lambda的格式,也就是方法引用,有点类似匿名函数
    • User::getId 也就是 (User) -> user.getId()
    • 作用等同于 new User().getId()
@SpringBootTest
class MyBatisPlusApplicationTests {@Autowiredprivate UserDao userDao;@Testvoid testGetAll() {//方式一:按条件查询 
//        QueryWrapper qw = new QueryWrapper<>();
//        qw.lt("age",300);
//        List<User> Users = userDao.selectList(qw);
//        System.out.println(Users);//方式二:lambda格式按条件查询
//        QueryWrapper<User> qw = new QueryWrapper<>();
//        qw.lambda().lt(User::getAge,200);
//        List<User> Users = userDao.selectList(qw);
//        System.out.println(Users);//方式三:lambda格式按条件查询(推荐)
//        LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
//        qw.lt(User::getAge,200);
//        List<User> Users = userDao.selectList(qw);
//        System.out.println(Users);//方式四: lambda格式按条件查询(推荐)LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
//        qw.lt(User::getAge,600).gt(User::getAge,300); //可以链式编程qw.gt(User::getAge, 600).or().lt(User::getAge, 100); //可以链式编程List<User> Users = userDao.selectList(qw);System.out.println(Users);}
}

空值处理

  • 条件参数控制
@SpringBootTest
class MyBatisPlusApplicationTests {@Autowiredprivate UserDao userDao;@Testvoid testGetAll() {UserQuery uq = new UserQuery();
//        uq.setAge(100);
//        uq.setAge2(300);//null判定,先判断条件是否为trueLambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();qw.gt(null != uq.getAge(), User::getAge, uq.getAge());qw.lt(null != uq.getAge2(), User::getAge, uq.getAge2());List<User> Users = userDao.selectList(qw);System.out.println(Users);}
}

查询投影

  • 查询包含模型类中部分属性
  • 查询结果包含模型类中未定义的属性
// 包含模型类中部分属性,不是所有的聚合函数都支持
@SpringBootTest
class MyBatisPlusApplicationTests {@Autowiredprivate UserDao userDao;@Testvoid testGetAll() {QueryWrapper<User>  qw = new QueryWrapper<>();qw.select("count(*) count");List<Map<String, Object>> Users = userDao.selectMaps(qw);System.out.println(Users);}
}
// 包含模型类中中未定义的属性
@SpringBootTest
class MyBatisPlusApplicationTests {@Autowiredprivate UserDao userDao;@Testvoid testGetAll() {QueryWrapper<User>  qw = new QueryWrapper<>();qw.select("count(*) count,age");qw.groupBy("age");List<Map<String, Object>> Users = userDao.selectMaps(qw);System.out.println(Users);}
}

查询条件

  • eq(字段,“值”) 等值匹配
  • le ge between 闭区间匹配[]
  • like 模糊匹配
  • … 更多可去官方文档查询

字段映射与表名映射

问题一: 表字段与编码属性设计不同步

问题二: 编码中添加了数据库中未定义的属性

问题三: 采用默认查询开放了更多的字段查看权限

  • @TableField
    • 类型: 属性注解
    • 位置: 模型类属性定义上方
    • 作用: 设置当前属性对应的数据库表中的字段关系
    • 属性:
      • value —— 设置数据库的字段名称
      • exist —— 设置属性在数据库表中字段是否存在,默认为true。此属性无法与value合并使用
      • select —— 设置属性是否参与查询,此属性与select映射不冲突
  • @TableName
    • 类型: 类注释
    • 位置: 模型类定义上方
    • 作用: 设置当前类对应于数据库标关系
    • 属性:
      • value —— 表名称
@TableName("user")
public class User {private Long id;private String name;@TableField(value = "password",select = false)private String pwd;private Integer age;private String tel;@TableField(exist = false)private Integer online;
}

DML编程控制

基础增删语句

@SpringBootTest
class MyBatisPlusApplicationTests {@Autowiredprivate UserDao userDao;@Testvoid add() {User user = new User();user.setName("LonelySnow");user.setPwd("LonelySnow");user.setAge(123);user.setTel("LonelySnow");userDao.insert(user);}@Testvoid delete() {LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();qw.eq(User::getName, "lonelysnow");userDao.delete(qw);}
}

id生成策略控制

  • AUTO(0) —— 使用数据库自增ID策略生成
  • NONE(1) —— 不设置ID生成策略
  • INPUT(2) —— 用户手动输入ID
  • ASSIGN_ID(3) —— 雪花算法生成ID(可兼容数值型与字符串型)
  • ASSIGN_UUID(4) —— 以UUID生成算法作为ID生成策略

雪花算法 —— 生成一个64位的二进制数(必须用long型装)

  • 占位符(第一位):0
  • 时间戳(41位)
  • 机器码(5+5位)
  • 序列号(12位)

配置文件统一添加

mybatis-plus:global-config:db-config:#id策略id-type: assign_id#所有实体类名前拼接前缀,相当于@TableNametable-prefix: tbl_

逻辑删除

  • 删除操作业务问题: 业务数据从数据库中丢失
  • 逻辑删除: 为数据设置是否可用字段,删除时设置字段为不可用状态,数据保留在数据库中

逻辑删除步骤

  1. 数据库表中添加逻辑删除标记字段
  2. 实体类中添加对应的字段,并设置当前字段为逻辑删除字段
  3. 配置逻辑删除字面值
//单独设置
@TableName("user")
public class User {
//    @TableId(type = IdType.AUTO)private Long id;private String name;@TableField(value = "password",select = false)private String pwd;private Integer age;private String tel;@TableLogic(value = "0",delval = "1")private Integer deleted;
}
//配置通用配置
mybatis-plus:global-config:db-config:logic-delete-field: deletedlogic-not-delete-value: 0logic-delete-value: 1

乐观锁

  • 业务并发现象带来的问题: 秒杀

乐观锁添加步骤

  1. 数据库表中添加锁标记字段
  2. 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
  3. 配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装
@Configuration
public class Mpconfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){//1.定义mp拦截器MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();//2.在mp拦截器中添加具体拦截器mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());//添加乐观锁拦截器mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}
}
@SpringBootTest
class MyBatisPlusApplicationTests {@Autowiredprivate UserDao userDao;@Testvoid update(){//1. 修改前先查询要修改的数据User user = userDao.selectById(2L);//2.将想要修改的属性值传进去user.setName("snow");userDao.updateById(user);  }
}

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

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

相关文章

56.windows docker 安装ES、Go操作ES(github.com/olivere/elastic/v7库)

文章目录 一、环境准备1、 docker安装ES2、启动容器3、图像化客户端工具ElasticSearch-Head 二、Go ES连接与认证1、 连接ES2、配置ES认证 三、索引的增删改查四、文档的增删改创建单个文档根据文档id删除文档批量删除文档批量创建文档 五、文档查询列表查询精确匹配模糊匹配嵌…

五、Microsoft群集服务(MSCS)环境的搭建

一、【目的】 学会利用Windows Server布置群集环境。 二、【设备】 FreeNAS11.2&#xff0c;Windows Server 2019 三、【要求】 学会利用Windows Server布置群集环境&#xff0c;掌握处理问题的能力。 配置表&#xff1a; 节点公网IP(public)内网IP(private)群集IP(clust…

linux磁盘空间清理

查看磁盘使用情况 查看磁盘分区上可以使用的磁盘空间 $ df -h若要查看文件类型和block&#xff0c;使用下面的命令 $ df -T查看每个文件和目录的磁盘使用空间&#xff0c;也就是文件的大小。 $ sudo du -sh /* $ sudo du -h --max-depth1 /清理旧的 Snap 包版本以释放磁盘空…

华为OD试题六(数据最节约的备份方法、TLV解码)

1. 数据最节约的备份方法 题目描述&#xff1a; 有若干个文件&#xff0c;使用刻录光盘的方式进行备份&#xff0c;假设每张光盘的容量是500MB&#xff0c;求 使用光盘最少的文件分布方式 所有文件的大小都是整数的MB&#xff0c;且不超过500MB&#xff1b;文件不能分割、分卷…

centos-LAMP搭建与配置(论坛网站)

文章目录 LAMP简介搭建LAMP环境安装apache&#xff08;httpd&#xff09;安装mysql安装PHP安装php-mysql安装phpwind LAMP简介 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1a;Linux操作系统&#xff0c;网页服务器Apache&#xff0c;…

工作遇到问题与解决办法(二)

弹出确认框 this.$confirm(确定删除全部添加的数据吗?, 提示, {confirmButtonText: 确定,cancelButtonText: 取消,type: warning}).then(() > {// 确定操作this.addYpslTempList[];this.isSelectfalse;//删除状态this.addMultiple true;this.$message({type: success,mes…

MySQL InnoDB存储引擎中的索引结构解析

目录 常见的几种数据结构1、二叉树2、红黑树3、B树4、B树5、总结 索引结构1、聚簇索引和非聚簇索引2、Hash索引3、总结 常见的几种数据结构 1、二叉树 特点&#xff1a; 每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。通常不是自平衡的&#xff0c;可能…

Mac中nvm切换node版本失败

Mac中使用 nvm 管理 node 版本&#xff0c;在使用指令&#xff1a;nvm use XXX 切换版本之后。 关闭终端&#xff0c;再次打开&#xff0c;输入 node -v 还是得到之前的 node 版本。 原因&#xff1a; 在这里这个 default 中有个 node 的版本号&#xff0c;使用 nvm use 时&a…

spring boot 实现直播聊天室(二)

spring boot 实现直播聊天室(二) 技术方案: spring bootnettyrabbitmq 目录结构 引入依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.96.Final</version> </dependency>Si…

安装DevEco Studio

下载 首先进入鸿蒙开发者官网&#xff0c;顶部导航栏选择开发->DevEco Studio 根据操作系统下载不同版本&#xff0c;其中Mac(X86)为英特尔芯片&#xff0c;Mac(ARM)为M芯片。 安装 下载完毕后&#xff0c;开始安装。 点击Agree 首次使用&#xff0c;请选择Do not impor…

Vue 详细教程

Vue实战 1. Vue 引言 渐进式 JavaScript 框架 --摘自官网 官网地址&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js # 渐进式 1. 易用 html css javascript 2. 高效 开发前端页面 非常高效 3. 灵活 开发灵活 多样性 # 总结 Vue 是一个javascript 框架 js 简化页面js操作…

Pr自动从视频脚本剪辑视频FirstCut插件免费下载

FirstCut 插件将自动从视频脚本中剪辑视频&#xff0c;在例如新闻、采访、自媒体视频等带有配音或字幕内容的视频制作中提高了粗剪效率。 使用 FirstCut&#xff0c;大大缩短了粗剪的时间&#xff0c;而不是转到每个视频文件并找到 IN 点和 OUT 点&#xff0c;然后将其插入到序…

jmeter,读取CSV文件数据的循环控制

1、构造csv数据 保存文件时需要注意文件的编码格式 id,name,limit,status,address,start_time 100,小米100,1000,1,某某会展中心101,2023/8/20 14:20 101,小米101,1001,1,某某会展中心102,2023/8/21 14:20 2、在线程组下添加【CSV数据文件设置】元件 3、CSV文件数据的循环控…

数据库动态视图和存储过程报表数据管理功能设计

需求&#xff1a;需要将ERP的报表数据挪到OA中&#xff0c;但是OA表单设计不支持存储过程动态传参&#xff0c;所以需要设计一个系统&#xff0c;可以手动配置&#xff0c;动态显示原本ERP的报表数据&#xff0c;ERP报表是存在数据库的视图和存储过程中 思路&#xff1a;因为E…

c#按照时间进行数据存储(不用数据库)

概要介绍 按照日期生成文件夹&#xff0c;按照时间生成文件名&#xff0c;存储字符串。 可以用于简单数据记录&#xff08;如果数据存储考虑格式文本&#xff0c;保存为csv格式&#xff09; 实现效果 调用方法 SaveText.saveStr("测试字符串"DateTime.Now.ToStrin…

高效排队,紧急响应:RabbitMQ Priority Queue全面指南【RabbitMQ 九】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 高效排队&#xff0c;紧急响应&#xff1a;RabbitMQ Priority Queue全面指南 引言前言第一&#xff1a;初识RabbitMQ Priority Queue插件插件的背景和目的&#xff1a;为什么需要消息优先级&#xff1…

我的NPI项目之Android 安全系列 -- Google Wallet and Secure Element(SE)

随着电子支付的兴起&#xff0c;越来越多的支付方式出现在我们的生活中。其中就有基于NFC的“碰一碰”的支付&#xff0c;支付宝的“扫一扫”支付&#xff0c;我们还知道有Google Pay(Wallet), Apple Pay(Wallet)。作为Android BSP的开发者&#xff0c;我比较关心的是Google Pa…

Processon的使用以及流程图的绘制

目录 一、ProcessOn 1.2 官方网站 门诊流程图 会议OA流程图 药库采购入库流程图 ​住院流程图 二、Axure自定义元件库 2.1 新建元件库 2.2 自定义元件 2.3 添加元件库 一、ProcessOn ProcessOn是一款在线的流程图、思维导图、组织结构图、网络拓扑图等多种图表类型…

2020年第九届数学建模国际赛小美赛A题自由泳解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 A题 自由泳 原题再现&#xff1a; 在所有常见的游泳泳姿中&#xff0c;哪一种最快&#xff1f;哪个冲程推力最大&#xff1f;在自由泳项目中&#xff0c;游泳者可以选择他们的泳姿&#xff0c;他们通常选择前面的爬行。然而&#xff0c;游泳…

Java基础面试题小结

基础面试题 Java语言简介 Java是1995年由sun公司推出的一门高级语言&#xff0c;该语言具备如下特点: 简单易学&#xff0c;相较于C语言和C&#xff0c;没有指针的概念&#xff0c;所以操作和使用是会相对容易一些。平台无关性&#xff0c;即Java程序可以通过Java虚拟机在不…