MybatisPlus由浅入深

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,旨在简化开发过程。

基本使用步骤

1.依赖引入

        <!-- mysql依赖 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- MyBatisPlus依赖,向下兼容Mybatis --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency>

2.创建Mapper接口,继承BaseMapper<T>(T表示操作类型)

@Mapper
public interface UserMapper extends BaseMapper<User> {}@Data
public class User {/*@TableId 注解指定name为主键*/@TableIdprivate String name;private Integer age;
}

3.使用

@SpringBootTest
public class MybatisPlusTest {@Autowiredprivate UserMapper userMapper;/*增加*/@Testvoid testInsert() {User user = new User();user.setName("EE");user.setAge(18);userMapper.insert(user);}/*查询*/@Testvoid testSelectById() {User user = userMapper.selectById("Tj");System.out.println("user:" + user);}/*查询一个集合*/@Testvoid testSelectByIds(){List<String> strings = Arrays.asList("Tj", "EE");List<User> users = userMapper.selectBatchIds(strings);users.forEach(System.out::println);}/*删除*/@Testvoid testDeleteById() {userMapper.deleteById("Tj");}/*修改*/@Testvoid testUpdateById() {User user = new User();user.setName("EE");user.setAge(20000);userMapper.updateById(user);}
}

 其他注意事项

//注意配置Mysql,连接数据库
spring:datasource:url: jdbc:mysql://localhost:3306/temp?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
//MapperScan注解配置扫描文件
@MapperScan("org.example.mapper")
@SpringBootApplication
public class RedisTemplateDemoApplication {public static void main(String[] args) {SpringApplication.run(RedisTemplateDemoApplication.class, args);}}

基本原理

MybatisPlus基于反射

1.将类名驼峰转数据库表下划线;

2.id字段为主键;

3.变量名驼峰转下划线。

若不一样则通过注解指定

@TableName:指定该类映射表名

@TableId:指定成员变量为主键

@TableField:指定成员变量映射的数据库字段

在TableId中可以指定type,@TableId(value = "name", type = IdType.INPUT)

具体如下:

IdType.Auto:Id自增;

IdType.Input:通过set方法传入;

IdType.ASSIGN_ID:通过nextId方法生成Id。

使用TableField场景

成员变量与数据库字段不一致;

成员变量以is开头,且是bool值(在映射时会去掉is前缀,导致不匹配数据库字段);

成员变量名与数据库关键字冲突(比如变量名为select,order等)

成员变量不是数据库字段(@TableField(exist = false)

示例

@Data
@TableName("user")
public class User {/*@TableId 注解指定name为主键*/@TableId(value = "name", type = IdType.INPUT)private String name;@TableField("age")private Integer age;/*非数据库中字段*/@TableField(exist = false)private String email;
}

条件构造器Wrapper

支持创建各种复杂的where条件,满足日常需求。

基本使用

查询

    @Testvoid testQueryWrapper(){//若是查询QueryWrapper<User> queryWrapper = new QueryWrapper<>();//设置查询字段queryWrapper.select("name","age")//模糊查询.like("name","E")//where条件:age = 20000.eq("age",20000);List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}

修改

    @Testvoid testQueryWrapper2(){User user = new User();//设置满足条件age = 123user.setAge(123);//设置name = "EE"QueryWrapper<User> queryWrapper = new QueryWrapper<User>().eq("name","EE");//sql:update user set age = 23 where name = "EE"int update = userMapper.update(user, queryWrapper);System.out.println("update:"+update);}/*根据字段值自增或自减*/@Testvoid testUpdateWrapper(){List<String> names = List.of("EE","aa");//sql: update user set age = age - 100 where name in ("EE","aa")UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>().setSql("age = age -100").in("name",names);int update = userMapper.update(null, updateWrapper);//返回修改的行数System.out.println("update:"+update);}

Lambda表达式

通过::引用方法,避免硬编码

    @Testvoid testQueryWrapper(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("name","age").like("name","E").eq("age",20000);List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}@Testvoid testLambdaQueryWrapper(){LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>().select(User::getName,User::getAge).like(User::getName,"E").eq(User::getAge,20000);//查询List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}

自定义SQL

我们可以利用MybatisPlusgou的Wrapper构建复杂Where条件,自定义SQL剩余部分。

1.基于Wrapper构建where条件。

        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>();queryWrapper.eq(User::getName, "xiaoming");Integer amount = 100;userMapper.updateAgeById(queryWrapper, amount);

2.在mapper方法参数中用Param注解声明Wrapper变量,必须为ew。

3.自定义sql,使用Wrapper条件。

    @Update("update user set age = age + #{amount} ${ew.customSqlSegment}")void updateAgeById(@Param("ew") LambdaQueryWrapper<User> queryWrapper,@Param("amount") Integer amount);

ew.customSqlSegment相当于queryWrapper.getCustomSqlSegment()方法,获取自定义sql片段。

MybatisPlus的IService接口

它封装了常见的数据库操作(CRUD),让你无需编写重复的 Service 实现代码。

流程

1.自定义Service接口继承IService接口。

public interface IUserService extends IService<User> {
}

2.自定义ServiceImpl实现类,实现自定义接口并继承ServiceImpl类,ServiceImpl类实现了IService接口中所有方法,不需要我们自己实现。

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {}

3.使用

    @Autowiredprivate IUserService userService;@Testvoid testSaveUser() {User user = new User();user.setName("XII");user.setAge(30);boolean checkSave = userService.save(user);System.out.println("checkSave:" + checkSave);}

使用Lambda进行复杂查询

//controller@ApiOperation("查询多用户接口")@GetMapping("/list")List<User> queryUsers(User user) {return userService.queryUsers(user.getName(),user.getAge());}//service@Overridepublic List<User> queryUsers(String name, Integer age) {//查询前先判断是否为nullreturn lambdaQuery().eq(name != null, User::getName, name).ge(age != null, User::getAge, age).list();}

IService批量新增

1.每次插入一个集合,集合中存放千条数据。避免每次插入一条导致频繁的网络请求耗时。

2.在yml配置文件中rewriteBatchedStatements=true,JDBC 驱动会将批量 SQL 重写为 单个多值插入语句,大幅减少与数据库的交互次数,提升性能。

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

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

相关文章

蓝牙信号强度(RSSI)与链路质量(LQI)的测量与应用:面试高频考点与真题解析

在蓝牙通信领域&#xff0c;信号强度&#xff08;RSSI&#xff09;和链路质量&#xff08;LQI&#xff09;是评估无线链路性能的核心指标。无论是智能家居设备的连接优化&#xff0c;还是工业物联网中的抗干扰设计&#xff0c;这两个指标都扮演着关键角色。本文将结合面试高频考…

PyTorch的计算图是什么?为什么绘图前要detach?

在PyTorch中&#xff0c;计算图&#xff08;Computational Graph&#xff09; 是自动求导&#xff08;Autograd&#xff09;的核心机制。理解计算图有助于解释为什么在绘图前需要使用 .detach() 方法分离张量。一、什么是计算图&#xff1f; 计算图是一种有向无环图&#xff08…

深度学习入门代码详细注释-ResNet18分类蚂蚁蜜蜂

本项目将基于PyTorch平台迁移ResNet18模型。该模型原采用ImageNet数据集&#xff08;含1000个图像类别&#xff09;进行训练。我们将尝试运用该模型对蚂蚁和蜜蜂进行分类&#xff08;这两个类别未包含在原训练数据集中&#xff09;。 本文的原始代码参考于博客深度学习入门项目…

北京饮马河科技公司 Java 实习面经

北京饮马河科技公司 Java 实习面经 本文作者&#xff1a;程序员小白条 本站地址&#xff1a;https://xbt.xiaobaitiao.top 1&#xff09; 面试官&#xff1a;我看你这块是有一个开源的项目&#xff0c;这个项目主要是做什么的&#xff1f; 我&#xff1a;主要两点是亮点&…

java基础(day07)

目录 OOP编程 方法 方法的调用&#xff1a; 在main入口函数中调用&#xff1a; 动态参数&#xff1a; 方法重载 OOP编程 方法 概念&#xff1a;指为获得某种东西或达到某种目的而采取的手段与行为方式。有时候被称作“方法”&#xff0c;有时候被称作“函数”。例如UUID.…

使用EasyExcel动态合并单元格(模板方法)

1、导入EasyExcel依赖<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version> </dependency>2、编写实体类Data publci class Student{ ExcelProperty("姓名")pri…

jenkins 流水线比较简单直观的

//全篇没用自定义变量pipeline {agent any// 使用工具自动配置Node.js环境tools {nodejs nodejs22 // 需在Jenkins全局工具中预配置该名称的Node.js安装}//下面拉取代码通过的是流水线片段生成的stages {stage(Checkout Code) {steps {git branch: release-v1.2.6,credentials…

CV目标检测中的LetterBox操作

LetterBox类比理解&#xff1a;想象你要把一张任意形状的照片放进一个正方形的相框里&#xff0c;照片不能变形拉伸&#xff0c;所以你先等比例缩小照片&#xff0c;然后在空余的地方填上灰色背景。第1章 数学原理当我们有一个原始图像的尺寸为 19201080&#xff08;宽高&#…

Leetcode 3614. Process String with Special Operations II

Leetcode 3614. Process String with Special Operations II 1. 解题思路2. 代码实现 题目链接&#xff1a;3614. Process String with Special Operations II 1. 解题思路 这一题思路上是一个逆推的思路。 首先&#xff0c;我们顺序走一轮不难得到最终我们能够获得的字符串…

.NET ExpandoObject 技术原理解析

&#x1f31f; .NET ExpandoObject 技术原理解析 引用&#xff1a; .NET 剖析4.0上ExpandoObject动态扩展对象原理风潇潇人渺渺快意刀山中草 #mermaid-svg-RtpHctpdchPPN1Xo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mer…

放苹果(信息学奥赛一本通-T1192)

【题目描述】把M个同样的苹果放在N个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f;&#xff08;用K表示&#xff09;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一种分法。【输入】第一行是测试数据的数目…

(懒人救星版)CNN_Kriging_NSGA2_Topsis(多模型融合典范)深度学习+SCI热点模型+多目标+熵权法 全网首例,完全原创,早用早发SCI

全网首例&#xff0c;完全原创&#xff0c;早用早发SCI&#xff08;多模型融合典范&#xff09;机器学习SCI热点模型多目标熵权法(懒人救星版)BP_Kriging_NSGA2_Topsis 改进克里金工作量大&#xff1a;多模型融合创新性&#xff1a;首次结合BP神经网络和克里金多目标利用 BP神…

LeetCode热题100【第一天】

第一题 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回…

AI Linux 运维笔记

运维基本概念 IT运维是指通过专业技术手段&#xff0c;确保企业的IT系统和网络持续、安全、稳定运行&#xff0c;保障业务的连续性。运维涵盖计算机网络、应用系统、硬件环境和服务流程的综合管理。主要分为: 系统运维、数据库运维、自动化运维、容器运维、云计算运维、信创运维…

Redis性能基准测试

基准环境 机器&#xff1a;AWS EC2 c4.8xlarge&#xff08;同机部署 Redis Server 与 ReJSONBenchmark 工具&#xff0c;通过网络栈连接&#xff09;测试工具&#xff1a;ReJSONBenchmark&#xff08;Go 实现、可配置并发&#xff09;模式&#xff1a;非管线&#xff08;non-pi…

XML外部实体注入与修复方案

XML外部实体注入&#xff08;XXE&#xff09;是一种严重的安全漏洞&#xff0c;攻击者利用XML解析器处理外部实体的功能来读取服务器内部文件、执行远程请求&#xff08;SSRF&#xff09;、扫描内网端口或发起拒绝服务攻击。以下是详细解释和修复方案&#xff1a;XXE 攻击原理外…

解决高并发场景中的连接延迟:TCP 优化与队头阻塞问题剖析

你是否在高并发场景下遇到过这种情况&#xff1a;系统性能本来不错&#xff0c;但在请求量大增的时刻&#xff0c;连接延迟暴涨&#xff0c;响应时间直线飙升&#xff0c;甚至整个服务都变得不可用&#xff1f;当你打开监控时&#xff0c;CPU、内存、带宽都在正常范围内&#x…

Web学习笔记4

CSS概述1、CSS简介CSS&#xff0c;层叠样式表&#xff0c;是一种样式表语言&#xff0c;用以描述HTML的呈现内容的方式&#xff08;美化网页&#xff09;。CSS书写规则是&#xff1a;选择器{属性名&#xff1a;属性值}的键值对CSS有三种引入方式&#xff0c;分别为&#xff1a;…

Spring AI 初学者指南:从入门到实践与常用大模型介绍

作为 Java 开发者&#xff0c;当 AI 浪潮席卷而来时&#xff0c;如何在熟悉的 Spring 生态中快速拥抱大模型开发&#xff1f;Spring AI 的出现给出了答案。本文将从初学者视角出发&#xff0c;带你了解 Spring AI 的核心概念、使用方法&#xff0c;并介绍与之搭配的常用大模型&…

C#自定义控件

1。C#中控件和组件的区别&#xff1a; 一般组件派生于&#xff1a;Component类&#xff0c;所以从此类派生出的称之为组件。 一般用户控件派生于:Control类或UserControl类&#xff0c;所以从该类派生出的称之为用户控件。 他们之间的关系主要是&#xff1a;UserControl继承Con…