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

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…...

线程与多线程(二)

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

算法板子:欧拉函数——求一个数的欧拉函数、线性时间内求1~n所有数的欧拉函数

目录 1. 欧拉函数 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;性质 &#xff08;3&#xff09;计算公式 2. 求一个数的欧拉函数 &#xff08;1&#xff09;模拟过程 &#xff08;2&#xff09;代码 3. 线性时间内求1~n所有数的欧拉函数——筛法求欧拉函…...

2024牛客暑期多校训练营8

文章目录 A. Haitang and GameE.Haitang and MathJ. Haitang and TriangleK. Haitang and Ava A. Haitang and Game 通过审题可以知道&#xff0c;最后的胜者和若干次操作后最多能增加的数的奇偶有关。 由于 a i a_i ai​ 较小&#xff0c;所以我们枚举每一个没出现过的 x …...

git的一些操作指令

一、git 提交规范 commit message subject &#xff1a; 空格 message 主体 feat: 新功能&#xff08;feature&#xff09;用于提交新功能。fix: 修复 bug用于提交 bug 修复。docs: 文档变更用于提交仅文档相关的修改。style: 代码风格变动&#xff08;不影响代码逻辑&…...

【IT行业研究报告】Internet Technology

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

GLM大模型的机器翻译能力测试

背景介绍 最近想对GLM-4今年发布的几个大模型 glm-4-0520&#xff0c;glm-4-air以及glm-4-flash简单评测一下它们的机器翻译能力&#xff0c;由于这几个大模型的容量和训练数据都有区别&#xff0c;所以它们的翻译能力也是不同的。我们这里就分别选择一些有趣的&#xff0c;有…...

【硬件产品经理】汽车A样设计

目录 简介 制造方式 作者简介 简介 一般被称作原型样件(Prototype)。 主要是根据系统需求设计,实现基本功能和关键尺寸,用于基本功能的验证,用于初期产品软件调试和Hil台架测试(Hardware in Loop,硬件在环)的样机阶段。 也就说在设计初期,A样的主要目的可以划分…...

Ubuntu22.04系统中安装机器人操作系统ROS

在Ubuntu 22.04上安装ROS&#xff08;Robot Operating System&#xff09;的过程可以分为几个主要步骤。请注意&#xff0c;ROS有不同的版本&#xff08;如ROS 1的Melodic、Noetic等&#xff0c;以及ROS 2的Foxy、Humble等&#xff09;&#xff0c;这些版本对Ubuntu的支持程度可…...

LeetCode54题:螺旋矩阵(原创)

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

FPGA常见型号

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

【多模态大模型】FlashAttention in NeurIPS 2022

一、引言 论文&#xff1a; FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 作者&#xff1a; Stanford University 代码&#xff1a; FlashAttention 特点&#xff1a; 该方法提出将Q、K、V拆分为若干小块&#xff0c;使执行注意力时不需要频…...

过滤器doFilter 方法

在Java EE中&#xff0c;过滤器的放行是指在过滤器的 doFilter 方法中调用 FilterChain 对象的 doFilter 方法&#xff0c;将请求传递给下一个过滤器或目标 servlet 进行处理。这个过程可以理解为过滤器的责任链传递。 过滤器的 doFilter 方法 在过滤器中&#xff0c;实现 Fil…...

WPF篇(9)-CheckBox复选框+RadioButton单选框+RepeatButton重复按钮

CheckBox复选框 CheckBox继承于ToggleButton&#xff0c;而ToggleButton继承于ButtonBase基类。 案例 前端代码 <StackPanel Orientation"Horizontal" HorizontalAlignment"Center" VerticalAlignment"Center"><TextBlock Text"…...

【机器学习基础】线性回归

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

java基础概念12-二维数组

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

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虚拟展厅与传统实体展厅相比,有哪些优势?

视创云展虚拟展厅相比传统的实体展厅具有多方面的优势&#xff0c;主要体现在以下几个方面&#xff1a; 1、降低成本&#xff1a; 虚拟展厅无需租赁或建设物理空间&#xff0c;减少了场地、装修和维护等方面的开支。同时&#xff0c;参观者和参展商无需现场参观或布展&#x…...

Vue的事件处理、事件修饰符、键盘事件

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

c++单例实践

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

华为云AI开发平台ModelArts

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

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

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

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

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

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...