SSM框架,MyBatis-Plus的学习(下)

条件构造器

使用MyBatis-Plus的条件构造器,可以构建灵活高效的查询条件,可以通过链式调用来组合多个条件。

条件构造器的继承结构

Wrapper : 条件构造抽象类,最顶端父类

  • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
    • QueryWrapper : 查询/删除条件封装
    • UpdateWrapper : 修改条件封装
    • AbstractLambdaWrapper : 使用Lambda 语法
      • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
      • LambdaUpdateWrapper : Lambda 更新封装Wrapper

QueryWapper的使用

使用案例:

@org.junit.jupiter.api.Testpublic void test_select(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//        //模糊查询
//        queryWrapper.like("name","a");//名字中包含a字符
//        //范围查询
//        queryWrapper.between("age",20,30);
//        //判断不为空
//        queryWrapper.isNotNull("email");//结果的sql语句为:
//SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (username LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)//可以链式调用
queryWrapper.like("username", "a").between("age", 20, 30).isNotNull("email");userMapper.selectList(queryWrapper);}

使用步骤

  1. 创建一个QueryWrapper类型的对象,并指定其泛型(泛型为操作的数据对应的实体类类型)
  2. 用QueryWrapper类型的对象调用相应的添加条件的方法,在方法的参数列表中指定条件
  3. 最后将此QueryWrapper类型的对象加到MyBatis-Plus的crud方法的参数列表中,相应的crud方法便会对满足指定条件的数据操作

QueryWrapper的方法

  • 关于升降序:

升序降序的优先级由方法中参数的前后或者调用方法的先后决定

  • 关于and和or:

调用的多个方法之间默认使用AND连接,在调用两个方法时在中间调用一个or方法即可

@Test
public void test04() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();//将年龄大于20并且用户名中包含有a或邮箱为null的用户信息修改//UPDATE t_user SET age=?, email=? WHERE username LIKE ? AND age > ? OR email IS NULL)queryWrapper.like("username", "a").gt("age", 20).or().isNull("email");User user = new User();user.setAge(18);user.setEmail("user@atguigu.com");int result = userMapper.update(user, queryWrapper);System.out.println("受影响的行数:" + result);
}
  • 关于指定列:

查询时,默认是查询所有的列,要指定查询的列,调用QueryWrapper的select方法,参数传入要查询的列的列名即可

@Test
public void test05() {//查询用户信息的username和age字段//SELECT username,age FROM t_userQueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("username", "age");//selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值为nullList<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);maps.forEach(System.out::println);
}
  • 关于condition判断组织条件:
 @Test
public void testQuick3(){String name = "root";int    age = 18;QueryWrapper<User> queryWrapper = new QueryWrapper<>();//判断条件拼接//当name不为null拼接等于, age > 1 拼接等于判断//方案2: 拼接condition判断//每个条件拼接方法都condition参数,这是一个比较运算,为true追加当前条件!//eq(condition,列名,值)queryWrapper.eq(!StringUtils.isEmpty(name),"name",name).eq(age>1,"age",age);   
}

每个QueryWrapper的条件拼接方法中都可以在参数列表中加上一个布尔类型的参数,这个参数可以加入一个表达式,当这个参数的结果为true时该方法才执行。可以用来动态判断是否要拼接此条件。

使用queryWrapper + 实体类形式可以实现修改,但是无法将列值修改为null值

UpdateWrapper的使用

UpdateWrapper的方法与QueryWrapper的方法类似,但是UpdateWrapper有一个set方法,可以指定数据的相应列做修改,并且可以做到将数据库中的数据修改为null

@Test
public void testQuick2(){UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();//将id = 3 的email设置为null, age = 18updateWrapper.eq("id",3).set("email",null)  // set 指定列和结果.set("age",18);//如果使用updateWrapper 实体对象写null即可!int result = userMapper.update(null, updateWrapper);System.out.println("result = " + result);}

LambdaQueryWrapper和LambdaUpdateWrapper的使用

相比于 QueryWrapper,LambdaQueryWrapper 使用了实体类的属性引用(例如 User::getName、User::getAge),而不是字符串来表示字段名,这提高了代码的可读性和可维护性

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.eq(User::getName, "John").ge(User::getAge, 18).orderByDesc(User::getCreateTime).last("limit 10");
List<User> userList = userMapper.selectList(lambdaQueryWrapper);

LambdaUpdateWrapper也是类似:

@Test
public void testQuick2(){UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();//将id = 3 的email设置为null, age = 18updateWrapper.eq("id",3).set("email",null)  // set 指定列和结果.set("age",18);//使用lambdaUpdateWrapperLambdaUpdateWrapper<User> updateWrapper1 = new LambdaUpdateWrapper<>();updateWrapper1.eq(User::getId,3).set(User::getEmail,null).set(User::getAge,18);//如果使用updateWrapper 实体对象写null即可!int result = userMapper.update(null, updateWrapper);System.out.println("result = " + result);
}

MyBatis-Plus核心注解

@TableName注解

表名的注解,用来指定实体类对应的数据库中的表

默认以实体类的名字来对应表,忽略大小写,在实体类名和数据表的名字相同时(忽略大小写),可以不写此注解

当数据库的表名和实体类的命名不同时,在实体类上加上此注解,并在其value属性中指定其实体类对应的表名

@TableName("sys_user") //对应数据库表名
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}

也可以全局设置前缀,如此在对应实体类对应的数据表时,会先加上前缀,再寻找数据表

在application.yaml中:

mybatis-plus: # mybatis-plus的配置global-config:db-config:table-prefix: sys_ # 表名前缀字符串

@TableId

加在主键上的注解,当表中的主键的列名与实体类中的表示主键的属性名不一致,并不能完成驼峰映射时,可以用其value属性用来指定实体类的主键属性名对应的表中的主键列名

其type属性用来指定主键策略,即增加数据时,如何让数据库给增加的数据添加主键值。

属性类型必须指定默认值描述
valueString""主键字段名
typeEnumIdType.NONE指定主键类型

type属性可选值:

描述
AUTO数据库 ID 自增 (mysql配置主键自增长)
ASSIGN_ID(默认)分配 ID(主键类型为 Number(Long )或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
  • 使用AUTO,即使用主键自增长,表的主键要有设置自增长
  • 雪花算法可以随机生成一个不重复的long类型的数字
    • 使用雪花算法,数据库主键要是BIGINT类型的或者是VARCHAR(64)类型的
    • 实体类的主键的属性要是Long类型的

也可以全局设置主键策略:

mybatis-plus:configuration:# 配置MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 配置MyBatis-Plus操作表的默认前缀table-prefix: t_# 配置MyBatis-Plus的主键策略id-type: auto

@TableField注解

加在非主键属性上,当表中的列名与实体类中的属性不一致,并不能完成驼峰映射时,可以用其value属性用来指定实体类的属性名对应的表中的列名

除此之外,还有一个exit属性,用来表明此属性是否与数据表中的列名对应

@TableName("sys_user")
public class User {@TableIdprivate Long id;@TableField("nickname")private String name;private Integer age;private String email;
}
属性类型必须指定默认值描述
valueString""数据表字段名
existbooleantrue是否为数据库表字段

MyBatis-Plus拓展

逻辑删除实现

逻辑删除,即数据表中有一个列专门用来表示是否被删除,一个行被删除后此列的值便会改为用来表示已删除状态的值,通常,1表示逻辑已删除,0表示逻辑未删除

前提:在创建数据表时,加一个表示逻辑删除的字段,默认值约束设置为0

实体类添加逻辑删除属性:

@Data
public class User {// @TableIdprivate Integer id;private String name;private Integer age;private String email;@TableLogic//逻辑删除字段 int mybatis-plus下,默认 逻辑删除值为1 未逻辑删除 0 private Integer deleted;
}

还可以全局添加实体类的逻辑删除的属性,如此不用在实体类中声明逻辑删除的属性,实体类会默认加上逻辑删除的属性

mybatis-plus:global-config:db-config:logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)logic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

设置完逻辑删除后,mybatis-plus中所有的delete语句会更改为update语句,更改其逻辑删除字段的字段值为1

乐观锁实现

乐观锁能解决数据并发问题

MyBatis-Plus使用版本号方式实现乐观锁

前提:创建数据表时,加上一个表示版本号的字段,默认值为1

首先,添加版本号更新插件

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;
}

在实体类中加上一个表示版本号的属性,并在这个属性上加上@Version属性

@Version
private Integer version;

防全表更新和删除操作实现

针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除

添加防止全表更新和删除拦截器

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());return interceptor;
}
}

测试全部更新或者删除

@Test
public void testQuick8(){User user = new User();user.setName("custom_name");user.setEmail("xxx@mail.com");//Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of table update operation//全局更新,报错userService.saveOrUpdate(user,null);
}

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

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

相关文章

首屏性能优化:提升用户体验的秘籍

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

复盘-excel

excel-选列没有用&#xff0c;选小标题才可以 将簇状柱形图放置在一个新表上##### excel: 添加数据模型时&#xff0c;要通过套用表格格式与外部断开连接 透视分析2010年人数未解决(第四套&#xff09; 通过日期显示星期几 判断星期几 因为前面已经通过星期六&#xff0c…

03_Tomcat

文章目录 Tomcat概念自制简易的服务器JavaEE规范Tomcat安装Tomcat启动Tomcat的资源部署直接部署虚拟映射 Tomcat的设置 Tomcat 概念 服务器&#xff1a;两层含义。 软件层面&#xff1a;软件&#xff0c;可以将本地的资源发布到网络中&#xff0c;供网络上面的其他用户来访问…

grafana table合并查询

注&#xff1a;本文基于Grafana v9.2.8编写 1 问题 默认情况下table展示的是一个查询返回的多个field&#xff0c;但是我想要的数据在不同的metric上&#xff0c;比如我需要显示某个pod的读写IO&#xff0c;但是读和写这两个指标存在于两个不同的metirc&#xff0c;需要分别查…

多种方法求解数组排序

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

C++——string模拟实现

前言&#xff1a;上篇文章我们对string类及其常用的接口方法的使用进行了分享&#xff0c;这篇文章将着重进行对这些常用的接口方法的内部细节进行分享和模拟实现。 目录 一.基础框架 二.遍历字符串 1.[]运算符重载 2.迭代器 3.范围for 三.常用方法 1.增加 2.删除 3.调…

数据库-第十一章 并发控制【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下数据库系统概论中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 参考资料是王珊老师和萨师煊老师的数据库系统概论(第五版)。 数据库系统概论系列文章传送门&#xff1a; 第一章 绪论 第二/…

数据分析-Pandas数据画箱线图

数据分析-Pandas数据画箱线图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&#xff…

【重新定义matlab强大系列十七】Matlab深入浅出长短期记忆神经网络LSTM

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

音视频学习笔记——c++多线程(二)

✊✊✊&#x1f308;大家好&#xff01;本篇文章是多线程系列第二篇文章&#x1f607;。首先讲解了利用mutex解决多线程数据共享问题&#xff0c;举例更好理解lock和unlock的使用方法&#xff0c;以及错误操作造成的死锁问题&#xff0c;最后讲解了lock_guard与unique_lock使用…

Django模型层(附带test环境)

Django模型层(附带test环境) 目录 Django模型层(附带test环境)连接数据库Django ORM在models.py中建表允许为空指定默认值数据库迁移命令 开启测试环境建表语句补充(更改默认表名)数据的增加时间数据的时区 多表数据的增加一对多多对多 数据的删除修改数据查询数据查询所有数据…

鸿蒙OpenHarmony HDF 驱动开发

目录 序一、概述二、HDF驱动框架三、驱动程序四、驱动配置坚持就有收获 序 最近忙于适配OpenHarmonyOS LiteOS-M 平台&#xff0c;已经成功实践适配平台GD32F407、STM32F407、STM32G474板卡&#xff0c;LiteOS适配已经算是有实际经验了。 但是&#xff0c;鸿蒙代码学习进度慢下…

【AcWing】蓝桥杯集训每日一题Day1|二分|差分|503.借教室(C++)

503. 借教室 503. 借教室 - AcWing题库难度&#xff1a;简单时/空限制&#xff1a;1s / 128MB总通过数&#xff1a;8052总尝试数&#xff1a;26311来源&#xff1a;NOIP2012提高组算法标签二分差分 题目内容 在大学期间&#xff0c;经常需要租借教室。 大到院系举办活动&…

基于机器学习的网络入侵检测二元分类模型构建与性能评估(NSL-KDD数据集)

简介 该项目是一个基于NSL-KDD数据集的网络入侵检测系统&#xff0c;主要采用机器学习方法对网络流量数据进行使用了多种机器学习模型&#xff0c;如逻辑回归、线性SVM、多项式核SVM、高斯核SVM、决策树、随机森林、朴素贝叶斯和K近邻算法训练二元分类&#xff08;正常/异常&a…

bug总结(1)--变量取错

a c t i v i t y [ ′ t a g n a m e ′ ] 应为 activity[tag_name]应为 activity[′tagn​ame′]应为couponActivitList[0][‘name’] .隐藏的bug&#xff0c;在测试中竟然测不出来&#xff0c;而且上线了好久。为啥会出现这种低级错误呢&#xff1f;第一是写的时候不够仔细认…

Day26:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

目录 新闻列表 自写模版引用 Smarty模版引用 代码RCE安全测试 思维导图 PHP知识点&#xff1a; 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框架开发等 技术&#xff1a;输…

2024 年中国高校大数据挑战赛赛题 C:用户对博物馆评论的情感分析完整思路以及源代码分享

博物馆是公共文化服务体系的重要组成部分。国家文物局发布&#xff0c; 2021 年我国新增备案博物馆 395 家&#xff0c;备案博物馆总数达 6183 家&#xff0c;排 名全球前列&#xff1b;5605 家博物馆实现免费开放&#xff0c;占比达 90%以上&#xff1b;全国 博物馆举办展览 3…

【深度学习笔记】6_5 RNN的pytorch实现

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.5 循环神经网络的简洁实现 本节将使用PyTorch来更简洁地实现基于循环神经网络的语言模型。首先&#xff0c;我们读取周杰伦专辑歌词…

Python操作Redis 各种数据类型

本文将深入探讨如何使用Python操作Redis&#xff0c;覆盖从基础数据类型到高级功能的广泛主题。无论是字符串、列表、散列、集合还是有序集合&#xff0c;我们将一一解析&#xff0c;同时提供丰富的代码示例帮助读者更好地理解和应用。除此之外&#xff0c;本文还将介绍Redis的…

【20240309】WORD宏设置批量修改全部表格格式

WORD宏设置批量修改全部表格格式 引言1. 设置表格文字样式2. 设置表格边框样式3. 设置所有表格边框样式为075pt4. 删除行参考 引言 这两周已经彻底变为office工程师了&#xff0c;更准确一点应该是Word工程师&#xff0c;一篇文档动不动就成百上千页&#xff0c;表格图片也是上…