MyBatisPlus 第一天
数据库创建表
CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名 ',
`age` int(11) DEFAULT NULL COMMENT '年龄 ',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱 ',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
添加数据
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
创建SpringBoot项目后进行以下操作
1 pom.xml中导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>
<!-- SpringBoot整合测试的Start--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- SpringBoot整合MyBatisPlus的依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency>
<!-- 插件使用 为实体类提供set get以及相关方法 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
<!-- mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency>
补充: mysql 8.0和mysql5.0版本的区别: 1)mysql常用版本5.5 5.6 5.7以及8.0
2) 5.x的版本可以使用8.0的驱动 具有向上兼容 5.x的没 有 cj包,8.0有cj包(关系到驱动项和URL)
3) 你的电脑安装的是8.0的mysql 需要在URL后面加上时 区,5.x的版本不需要
2 添加lombok的插件
文件->设置->插件 搜索LomBok进行安装
3 application.yml中配置数据源信息
spring:
# 配置数据源信息
datasource:
# 配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
# 配置连接数据库信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf- 8&useSSL=false
username: root
password: 123456
4 在SpringBoot启动类中 记得加上@MapperScan的注解来扫描mapper包
5 创建Mapper接口
@Repository
//自己写的BaseMapper就是基础的CRUD
public interface UserMapper extends BaseMapper<User> {
}
6 创建实体类
@Data //lombok注解 提供所有set get方法
@AllArgsConstructor //有参构造器方法
@NoArgsConstructor //无参构造器方法
public class User {private Long id;private String name;private Integer age;private String email;}
关于LomBok注解的补充
三种方式使SpringBoot测试类正常运行
关于BaseMapper中方法的测试
插入
@Testpublic void insert(){User user=new User(null,"张三",23,"123@qq.com");int count=userMapper.insert(user);System.out.println(user.getId());}
输出结果
此处的id是通过雪花算法自动生成的
如果想要主键正常生成 自增的效果可以改动两个地方
1)application.yml中
global-config:db-config:# 配置MyBatis-Plus操作表的默认前缀table-prefix:# 配置MyBatis-Plus的主键策略id-type: auto
2)数据库中的表中,一定要勾选自动递增
删除
//通过ID删除@Testpublic void deleteById(){int result = userMapper.deleteById(1);System.out.println(result);}//通过map删除@Testpublic void deleteByMap(){Map<String,Object> map=new HashMap<>();map.put("name","张三");map.put("email","123@qq.com");int result = userMapper.deleteByMap(map);System.out.println(result);}//ID批量删除@Testpublic void deleteIds(){List<Long> list=Arrays.asList(1L,2L,3L);int result=userMapper.deleteBatchIds(list);}
修改
@Testpublic void testUpdateById(){User user = new User(4L, "admin", 22, null);//UPDATE user SET name=?, age=? WHERE id=?int result = userMapper.updateById(user);System.out.println("受影响行数:"+result);}
查询
@Testpublic void testSelectById(){//根据id查询用户信息//SELECT id,name,age,email FROM user WHERE id=?User user = userMapper.selectById(4L);System.out.println(user);}@Testpublic void testSelectBatchIds(){//根据多个id查询多个用户信息//SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )List<Long> idList = Arrays.asList(4L, 5L);List<User> list = userMapper.selectBatchIds(idList);list.forEach(System.out::println);}@Testpublic void testSelectByMap(){//通过map条件查询用户信息//SELECT id,name,age,email FROM user WHERE name = ? AND age = ?Map<String, Object> map = new HashMap<>();map.put("age", 22);map.put("name", "admin");List<User> list = userMapper.selectByMap(map);list.forEach(System.out::println);}
四种条件构造器:updatewrapper querywrapper lambdaquerywrapper lambdaupdatewrapper
以下为示例
@Autowiredprivate UserMapper userMapper;//测试selectList()用wrapper做条件构造器来查询@Testpublic void test1(){//查询用户名包含a,年龄在20到30之间,邮箱信息不为null的用户信息//创建条件构造器对象//==> Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)// 执行的sqlQueryWrapper<User> queryWrapper=new QueryWrapper<User>();queryWrapper.like("name","a").between("age",20,30).isNotNull("email");userMapper.selectList(queryWrapper).forEach(System.out::println);}//测试条件加上排序@Testpublic void test2(){//查询用户信息,按照年龄的降序排序 如年龄相同,则按照id升序排序//创建条件构造器对象//==> Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM user WHERE is_deleted=0 ORDER BY age DESC,uid ASC// 执行sqlQueryWrapper<User> queryWrapper=new QueryWrapper<User>();queryWrapper.orderByDesc("age").orderByAsc("id");userMapper.selectList(queryWrapper).forEach(System.out::println);}//使用wrapper进行删除@Testpublic void test3(){//删除有邮箱地址为null的用户信息//创建条件构造器对象//==> Preparing: UPDATE user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)// // 执行sqlQueryWrapper<User> queryWrapper=new QueryWrapper<User>();queryWrapper.isNull("email");userMapper.delete(queryWrapper);}@Testpublic void test4(){//修改将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改//注意2点 1.使用QueryWrapper<User>目的是查询符合条件的数据修改 2.使用userMapper的update方法去修改(user,wrapper)//参数1 修改的内容 参数2 查找需改数据的条件//==> Preparing: UPDATE user SET user_name=?, email=? WHERE is_deleted=0 AND (age > ? ANDUser user=new User();user.setName("小明");user.setEmail("xiaoming@qcby.cn");QueryWrapper<User> queryWrapper=new QueryWrapper<User>();queryWrapper.gt("age",20).like("name","a").or().isNull("email");int result=userMapper.update(user,queryWrapper);}@Testpublic void test5(){//修改//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改//条件构造器注意 AND和or的优先级以及使用 此时的AND和or需要加还要lambda表达式QueryWrapper<User> wrapper=new QueryWrapper<>();wrapper.like("user_name","a" ).and(i->i.gt("age", 20).or().isNull("email"));User user=new User();user.setName("小红");user.setEmail("xiaohong@qcby.cn");int update = userMapper.update(user, wrapper);System.out.println("满足条件修改的值个数:"+update);}@Testpublic void test6(){
// select查询指定的字段而不是所有字段QueryWrapper<User> queryWrapper=new QueryWrapper<User>();queryWrapper.select("name","age");List<Map<String,Object>> mapList=userMapper.selectMaps(queryWrapper);mapList.forEach(System.out::println);}@Testpublic void test7(){//查询id小于等100的用户信息QueryWrapper<User> queryWrapper=new QueryWrapper<User>();//首先使用insql来构建子查询语句queryWrapper.inSql("age","select age from user where age<20");//在使用userMapper的selectList查询结果List<User> list=userMapper.selectList(queryWrapper);}@Testpublic void test8(){//修改将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改UpdateWrapper<User> updateWrapper=new UpdateWrapper<User>();updateWrapper.gt("age",20).and(i->i.like("name","a")).or().isNull("email");updateWrapper.set("name","张三").set("email","qcby@2021");userMapper.update(null,updateWrapper);}/*** MP中的组装的条件情况* 实现前端用户选择条件然后进行判断* 满足加入到构造器 不满足不加入* 第一种方式:使用字符串工具类判断* sql* ==> Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM user* WHERE is_deleted=0 AND (age >= ? AND age <= ?* Parameters: 20(Integer), 30(Integer)*///第一种方式@Testpublic void test9(){String username="";Integer start=20;Integer end=10;QueryWrapper<User> queryWrapper=new QueryWrapper<User>();if(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(username)){queryWrapper.like("name","username");}if(start!=null){queryWrapper.ge("age",start);}if(end!=null){queryWrapper.le("age",end);}List<User> list=userMapper.selectList(queryWrapper);}//第二种方式@Testpublic void test10(){String username="";Integer start=20;Integer end=10;QueryWrapper<User> queryWrapper=new QueryWrapper<User>();queryWrapper.like(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(username),"name","username");queryWrapper.ge(start!=null,"age",start);queryWrapper.le(end!=null,"age",end);List<User> list=userMapper.selectList(queryWrapper);}/*** MP演示避免字段写错的方式* 可以根据当前实体类的属性找到对应的字段名* 使用LambdaQueryWrapper的构造器* sql* ==> Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM user* WHERE is_deleted=0 AND (user_name LIKE ? AND age >= ? AND age <= ?)*/@Testpublic void test11(){String username="";Integer start=20;Integer end=10;LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();lambdaQueryWrapper.like(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(username),User::getName,"username").le(start!=null,User::getAge,start).ge(end!=null,User::getAge,end);List<User> list=userMapper.selectList(lambdaQueryWrapper);list.forEach(System.out::println);}/*** MP演示避免字段写错的方式* 可以根据当前实体类的属性找到对应的字段名* 使用LambdaUpdateWrapper的构造器* sql* ==> Preparing: UPDATE user SET user_name=?,email=?* WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ?) OR email IS NULL)*/@Testpublic void test12(){LambdaUpdateWrapper<User> lambdaUpdateWrapper=new LambdaUpdateWrapper<>();lambdaUpdateWrapper.ge(User::getAge,20).and(i->i.like(User::getName,"a")).or().isNull(User::getEmail);lambdaUpdateWrapper.set(User::getName, "张亮").set(User::getEmail, "abc@qcby.com");int update = userMapper.update(null, lambdaUpdateWrapper);System.out.println(update);}
最后讲解下 @Mapper和@Repository的区别
相同点:都作用在mapper层接口 生成对象Bean 交给spring容器管理
不同点: @Mapper可以单独使用 不需要配置扫描地址 @Repository需要配置扫描地址 和@MapperScan联用 否则没有任何用处
相关文章:

MyBatisPlus 第一天
数据库创建表 CREATE DATABASE mybatis_plus /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use mybatis_plus; CREATE TABLE user ( id bigint(20) NOT NULL COMMENT 主键ID, name varchar(30) DEFAULT NULL COMMENT 姓名 , age int(11) DEFAULT NULL COMMENT 年龄 , email va…...

线程与多线程(二)
线程与多线程(二) 一、线程互斥1、相关概念 二、互斥锁1、介绍2、使用场景3、初始化(1)函数(2)概念 4、销毁(1)函数(2)概念 5、加锁(1)…...

算法板子:欧拉函数——求一个数的欧拉函数、线性时间内求1~n所有数的欧拉函数
目录 1. 欧拉函数 (1)概念 (2)性质 (3)计算公式 2. 求一个数的欧拉函数 (1)模拟过程 (2)代码 3. 线性时间内求1~n所有数的欧拉函数——筛法求欧拉函…...
2024牛客暑期多校训练营8
文章目录 A. Haitang and GameE.Haitang and MathJ. Haitang and TriangleK. Haitang and Ava A. Haitang and Game 通过审题可以知道,最后的胜者和若干次操作后最多能增加的数的奇偶有关。 由于 a i a_i ai 较小,所以我们枚举每一个没出现过的 x …...
git的一些操作指令
一、git 提交规范 commit message subject : 空格 message 主体 feat: 新功能(feature)用于提交新功能。fix: 修复 bug用于提交 bug 修复。docs: 文档变更用于提交仅文档相关的修改。style: 代码风格变动(不影响代码逻辑&…...

【IT行业研究报告】Internet Technology
一、引言 随着信息技术的飞速发展,IT行业已成为全球经济的重要驱动力。从云计算、大数据、人工智能到物联网,IT技术正深刻改变着各行各业的生产方式、商业模式和人们的生活方式。本报告旨在深入分析IT行业的现状、发展趋势和挑战,探讨其在各…...

GLM大模型的机器翻译能力测试
背景介绍 最近想对GLM-4今年发布的几个大模型 glm-4-0520,glm-4-air以及glm-4-flash简单评测一下它们的机器翻译能力,由于这几个大模型的容量和训练数据都有区别,所以它们的翻译能力也是不同的。我们这里就分别选择一些有趣的,有…...
【硬件产品经理】汽车A样设计
目录 简介 制造方式 作者简介 简介 一般被称作原型样件(Prototype)。 主要是根据系统需求设计,实现基本功能和关键尺寸,用于基本功能的验证,用于初期产品软件调试和Hil台架测试(Hardware in Loop,硬件在环)的样机阶段。 也就说在设计初期,A样的主要目的可以划分…...
Ubuntu22.04系统中安装机器人操作系统ROS
在Ubuntu 22.04上安装ROS(Robot Operating System)的过程可以分为几个主要步骤。请注意,ROS有不同的版本(如ROS 1的Melodic、Noetic等,以及ROS 2的Foxy、Humble等),这些版本对Ubuntu的支持程度可…...

LeetCode54题:螺旋矩阵(原创)
【题目描述】 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:mat…...

FPGA常见型号
FPGA(现场可编程门阵列)开发板种类繁多,涵盖了从入门级教育用途到高性能工业应用的广泛领域。以下是一些常见的 FPGA 开发板型号及其特点: 1. Xilinx(赛灵思)系列 Xilinx 是 FPGA 领域的领导者之一&#…...

【多模态大模型】FlashAttention in NeurIPS 2022
一、引言 论文: FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 作者: Stanford University 代码: FlashAttention 特点: 该方法提出将Q、K、V拆分为若干小块,使执行注意力时不需要频…...
过滤器doFilter 方法
在Java EE中,过滤器的放行是指在过滤器的 doFilter 方法中调用 FilterChain 对象的 doFilter 方法,将请求传递给下一个过滤器或目标 servlet 进行处理。这个过程可以理解为过滤器的责任链传递。 过滤器的 doFilter 方法 在过滤器中,实现 Fil…...

WPF篇(9)-CheckBox复选框+RadioButton单选框+RepeatButton重复按钮
CheckBox复选框 CheckBox继承于ToggleButton,而ToggleButton继承于ButtonBase基类。 案例 前端代码 <StackPanel Orientation"Horizontal" HorizontalAlignment"Center" VerticalAlignment"Center"><TextBlock Text"…...

【机器学习基础】线性回归
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…...

java基础概念12-二维数组
一、二维数组的定义 二维数组可以被视为数组的数组,即每个元素都是一个数组。 二维数组的应用场景: 当我们需要把数据分组管理的时候,就需要用到二维数组。 二、二维数组的初始化 2-1、静态初始化 阿里巴巴规范手册: // 静态初始…...

56 锐键交换机开局
锐键交换机开局 一 锐键视图切换 1 Ruijie> 用户视图 2 Ruijie# 特权模式 3 Ruijie(config)# 全局配置模式 4 Ruijie(config-if-GigabitEthernet 1/1/1)# 接口配置模式 5 Ruijie(config)#show vlan 6 exit (退出) 7 enable(进入)...
VR虚拟展厅与传统实体展厅相比,有哪些优势?
视创云展虚拟展厅相比传统的实体展厅具有多方面的优势,主要体现在以下几个方面: 1、降低成本: 虚拟展厅无需租赁或建设物理空间,减少了场地、装修和维护等方面的开支。同时,参观者和参展商无需现场参观或布展&#x…...

Vue的事件处理、事件修饰符、键盘事件
目录 1. 事件处理基本使用2. 事件修饰符3. 键盘事件 1. 事件处理基本使用 使用v-on:xxx或xxx绑定事件,其中xxx是事件名,比如clickmethods中配置的函数,都是被Vue所管理的函数,this的指向是vm或组件实例对象 <!DOCTYPE html&g…...

c++单例实践
C单例实践 在日常开发中,虽然太多的单例调用会让代码的耦合度变高,但是例如日志类这种,单例模式就变得非常有。所以这篇文章为大家介绍static 关键字相关知识以及如何实现自己的C单例类。 static关键字 首先让我们请出今天的主角: static。…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...