后端杂七杂八系列篇一

后端杂七杂八系列篇一

  • ① MySQL选择合适的数据类型
    • ① Char与Varchar
    • ② Text与Blob
  • ② @EqualsAndHashCode(callSuper = true)的作用
  • ③ mybatis-plus 相关
    • ① 主键生成策略
    • ② 使用Model实现CRUD
    • ③ Wrapper的用法
      • ① Wrapper的继承关系
      • ② 项目中最常用的warpper [LambdaQueryWrapper]
      • ③ 项目中第二常用的warpper [LambdaQueryChainWrapper]
    • ③ Java 中的lambdaQuery()
    • ④ and 和 or的用法(Wrapper)
      • ① where A=? and B=? 形式
      • ② where A=? or B=? 形式
      • ③ where A=? and (B...)
      • ④ where A=? and (B...) or C
    • ⑤ and 和 or的用法(lambdaQuery())
      • where A=? and B=?
      • where A=? or B=?
      • where A=? or(C=? and D=?)
      • where (A=?andB=?)or(C=?andD=?)
      • whert A =? or (B=? and ( C=? or D=?))
  • ④ @CacheEvict 注解

① MySQL选择合适的数据类型

① Char与Varchar

char与varchar都是用来存储字符串的,但他们保存和检索的方式不同


char属于固定长度的字符类型,varchar属于可变长度的字符类型。

char是固定长度的,所以它的处理速度比varchar快得多,但是其缺点是浪费存储空间。对于长度变化不大并且对查询速度有较高要求的数据可以考虑使用char类型来存储。

② Text与Blob

在保存较大文本时,通常会使用text或者blob。二者之间的主要差别是blob能用来保存二进制数据text只能保存字符数据

删除操作时(delete):MySQL并不会回收这条记录占据的存储空间以及索引位,而是空在那里等待新的数据来弥补这个空洞。若一时半会没有数据来填补这个空洞,就会形成资源浪费。

Blob和Text值因为占据大量空间,特别是在执行了大量的删除操作时,如果不采取操作一定会造成性能问题。

因此存在Blob或者Text等占大量空间的表,当执行大量删除操作的时候建议定期使用OPTIMIZE TABLE功能对这类表进行碎片整理,避免因为“空洞”导致性能问题。

查询的时候(select):使用select * 就不是很好的操作,会遍历大量数据,造成性能问题。最好用的时候查,不用的时候不用查。

如果优化的话,建议将这些Blob的数据,都放到一张表中,例如文件表,这样哪怕业务表select * 也无所谓了。

② @EqualsAndHashCode(callSuper = true)的作用

@EqualsAndHashCode是java的自带的注解,通常用于在子类中自动生成 equals 和 hashCode 方法,同时考虑到了父类的成员变量

class Person {private String name;private int age;
}@EqualsAndHashCode(callSuper = true)
class Student extends Person {private int studentId;
}

如果你使用了 @EqualsAndHashCode(callSuper = true),那么在生成 equals 和 hashCode 方法时,会考虑到Person 类中的 name 和 age字段。


如果你使用了 @EqualsAndHashCode(callSuper = false),只会考虑 studentId 字段。

③ mybatis-plus 相关

① 主键生成策略

@TableId , 该注解提供了各种的主键生成策略

自动生成策略(AUTO策略)
@TableId(value=“id”,type = IdType.AUTO) // value:指定的是表中主键名称。

跟随数据库表的主键递增策略前提是数据库表的主键要设置为自增。

INPUT策略
@TableId(type = IdType.INPUT)

需要 我们手动的插入id

ASSIGN_ID策略(使用雪花算法生成)
@TableId(type = IdType.ASSIGN_ID)

由雪花算法,生成Long 类型的id

ASSIGN_UUID策略(使用uuid生成主键)
@TableId(type = IdType.ASSIGN_ID)

由UUID的编码规则,生成String 类型的id

NONE策略(不指定主键生成策略)
@TableId(type = IdType.NONE)

NONE策略表示不指定主键生成策略,所以这个注释加不加无所谓

② 使用Model实现CRUD

直接定义Bean的时候实现Model类,该类的作用是能通过实体直接进行crud操作而不需要进行调用dao

前提是“必须存在对应的原始mapper并继承baseMapper并且可以使用的前提下”。

@EqualsAndHashCode(callSuper = true)
@Data
@Accessors(chain = true)
public class User extends Model<User> {private Long id;private String name;private Integer age;private String email;
}
//前提:必须写入mapper
public interface UserMapper extends BaseMapper<User> {}

Model类 自身实现了 insert() ,insertOrUpdate(),deleteById(Serializable id),deleteById() ,delete(Wrapper queryWrapper),updateById(),update(Wrapper updateWrapper),selectAll(),selectList(Wrapper queryWrapper),selectOne(Wrapper queryWrapper),selectPage(E page, Wrapper queryWrapper),selectCount(Wrapper queryWrapper)

@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleTest {@Testpublic void aInsert() {User user = new User();user.setName("咩咩");user.setAge(5);user.setEmail("miemie@mp.com");Assert.assertTrue(user.insert());// 成功可以直接获取 IDSystem.err.println("\n插入成功 ID 为:" + user.toString());}@Testpublic void bDelete() {Assert.assertTrue(new User().setId(3L).deleteById());Assert.assertTrue(new User().delete(new QueryWrapper<User>().lambda().eq(User::getName, "Sandy")));List<User> userList=new User().selectAll();userList.forEach(u->System.out.print(u));}@Testpublic void cUpdate() {Assert.assertTrue(new User().setId(1L).setEmail("ab@c.c").updateById());Assert.assertTrue(new User().update(new UpdateWrapper<User>().lambda().set(User::getAge, 3).eq(User::getId, 2)));}

③ Wrapper的用法

① Wrapper的继承关系

在这里插入图片描述

在这里插入图片描述

② 项目中最常用的warpper [LambdaQueryWrapper]

        // 使用lambdaQueryLambdaQueryWrapper<SysDroneInfo> wrapper = Wrappers.lambdaQuery();// 无人机名称if (StrUtil.isNotBlank(sysDroneInfo.getDroneName())) {wrapper.eq(SysDroneInfo::getDroneName, sysDroneInfo.getDroneName());}// 无人机型号if (StrUtil.isNotBlank(sysDroneInfo.getDroneManufacturer())) {wrapper.eq(SysDroneInfo::getDroneManufacturer, sysDroneInfo.getDroneManufacturer());}// 无人机状态if (StrUtil.isNotBlank(sysDroneInfo.getStatus())) {wrapper.eq(SysDroneInfo::getStatus, sysDroneInfo.getStatus());}return baseMapper.selectPage(page, wrapper);
LambdaQueryWrapper<MerchantApply> lambdaQueryWrapper = new LambdaQueryWrapper();lambdaQueryWrapper.eq(MerchantApply::getStatus, MerchantApplyEnums.STATUS.CONFIRM.getCode()).eq(MerchantApply::getIsDelete, MerchantApplyEnums.DEL_FLAG.NOT_DELETE.getCode()).and(wrapper ->{wrapper.eq(MerchantApply::getUniscid, uniscid).or().eq(MerchantApply::getApplicant, merchantInformation.getCreateBy());}).last("limit 1");

(status = ? AND is_delete = ? AND (uniscid = ? OR applicant = ?)) limit 1



③ 项目中第二常用的warpper [LambdaQueryChainWrapper]


LambdaQueryChainWrapper有以下方法获取数据:

  1. page():分页
  2. list():列表(常用)
  3. one():获取1个。若有多个结果,则报异常。此方法只用于只有一个结果的情况。(最常用)
List<BannerItem> bannerItems = new LambdaQueryChainWrapper<>(bannerItemMapper).eq(BannerItem::getBannerId, id).list();
BannerItem bannerItem = new LambdaQueryChainWrapper<>(bannerItemMapper).eq(BannerItem::getId, id).one();




QuryWrapper的用法

   @Testpublic void testQueryWrapper() {// 查询条件构造器QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();wrapper.eq("banner_id", id);// 查询操作List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper)}

③ Java 中的lambdaQuery()

Lambda 查询条件是通过 Java 的 lambda 表达式来构建的,它提供了更加灵活和可读性更高的查询条件构建方式。Lambda 查询条件可以与实体类中的属性进行绑定,并且能够自动推断属性类型,减少了代码的冗余。


lambdaQuery() 方法与MybatisPlus中的 wrapper 并不是直接等价的,但它们都用于构建查询条件。

//SELECT id,name,age,sex FROM student WHERE (name = ? AND age = ?)
List<Student> list = studentService.lambdaQuery().eq(Student::getName, "1").eq(Student::getAge, 1).list();     

lambdaQuery和MP对应关系




④ and 和 or的用法(Wrapper)

在 MybatisPlus 中,and() 和or() 方法是一个常用的链式调用方法,用于构建复杂的查询条件。它接受一个参数,通常是 Lambda 表达式或者其他的条件构造器,用于进一步定义查询条件。

QueryWrapper<User> queryWrapper = new QueryWrapper<>();  
queryWrapper.and(i -> i.eq(User::getName, "John").like(User::getEmail, "example@email.com"));  
List<User> users = userService.list(queryWrapper);

在上面的示例中,and() 方法传入了三个参数,分别代表年龄等于20、状态不等于0和地址模糊匹配 “street”。

需要注意的是,and() 方法只是用于组合多个查询条件,它本身并不执行查询操作。最终的查询操作需要调用相应的 Mapper 或 Service 层的方法来执行。


① where A=? and B=? 形式

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
eq("attr_id",key).
eq("catelog_id",catelogId);

② where A=? or B=? 形式

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
eq("attr_id",key).
or().
eq("catelog_id",catelogId);

③ where A=? and (B…)

 SELECT*FROM projectWHERE type = 1 AND (DATE_FORMAT(create_time, '%Y-%m') <= '2022-01');
projectMapper.selectList(new LambdaQueryWrapper<Project>().eq(Project::getType,1).and(qw -> qw.apply("DATE_FORMAT(create_time, '%Y-%m') <= '" + dateStr + "'")));
SELECT
*
FROMemployee_project
WHEREstate IS NOT NULLAND flag = 1AND (under_project_time IS NULLOR DATE_FORMAT(under_project_time, '%Y-%m-%d') >= '2022-07-27');
employeeProjectMapper.selectList(new LambdaQueryWrapper<EmployeeProject>().isNotNull(EmployeeProject::getState).eq(EmployeeProject::getFlag, 1).and(qw -> qw.isNull(EmployeeProject::getUnderProjectTime).or().apply("DATE_FORMAT(under_project_time, '%Y-%m-%d') >= DATE_FORMAT(NOW(),'%Y-%m-%d')")));

④ where A=? and (B…) or C

SELECT
*
FROMcustomer
WHEREtaxpayer_identification_number = '912102113000000000'AND (parent_id = 111OR contact_number = '88')AND NAME = '啦啦啦'OR number <> 1AND company_type = 1;
// 示例二
customerMapper.selectList(new LambdaQueryWrapper<Customer>().eq(Customer::getTaxpayerIdentificationNumber,"912102113000000000").and(qw -> qw.eq(Customer::getParentId,111).or().eq(Customer::getContactNumber,"88")).eq(Customer::getName, "啦啦啦").or().ne(Customer::getNumber, 1).eq(Customer::getCompanyType,1));

⑤ and 和 or的用法(lambdaQuery())

where A=? and B=?

//SELECT id,name,age,sex FROM student WHERE (name = ? AND age = ?)
List<Student> list = studentService.lambdaQuery().eq(Student::getName, "1").eq(Student::getAge, 1).list();     

where A=? or B=?

//SELECT id,name,age,sex FROM student WHERE (name = ? OR age = ?)
List<Student> list = studentService.lambdaQuery().eq(Student::getName, "1").or().eq(Student::getAge, 12).list();

where A=? or(C=? and D=?)

//SELECT id,name,age,sex FROM student WHERE (name = ? OR (name = ? AND age = ?)) 
List<Student> list =studentService.lambdaQuery().eq(Student::getName, "1").or(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12)).list();      

where (A=?andB=?)or(C=?andD=?)

// SELECT id,name,age,sex FROM student WHERE ((name = ? AND age = ?) OR (name = ? AND age = ?)) 
List<Student> list =studentService.lambdaQuery().and(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12)).or(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12)).list();  

whert A =? or (B=? and ( C=? or D=?))

// SELECT * FROM student WHERE ((name <> 1) OR (name = 1 AND (age IS NULL OR age >= 11)))
List<Student> list =studentService.lambdaQuery().and(wp -> wp.ne(Student::getName, "1")).or(wp ->wp.eq(Student::getName, "1").and(wpp -> wpp.isNull(Student::getAge).or().ge(Student::getAge, 11))).list();

④ @CacheEvict 注解

@CacheEvict 注解用于清空缓存。

@CacheEvict(value = "myCache", key = "#id")
public void deleteById(Long id) {// 删除操作
}

我们定义了一个 deleteById 方法,它用于删除指定 id 的数据。在方法上使用了 @CacheEvict 注解,表示在删除操作执行后清空名为 myCache 的缓存中的 key 为 id 的缓存数据。

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

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

相关文章

[NISACTF 2022]level-up

[NISACTF 2022]level-up wp level 1 robots.txt 通过目录爆破&#xff0c;发现存在 robots.txt 文件&#xff08;或者说查看源码&#xff0c;源码中有 disallow 提示&#xff0c;说明存在 robots.txt 文件&#xff09;&#xff1a; dirsearch -u "http://node5.anna.n…

Docker入门教程(详解)

Docker容器化 一 入门 1. 引言 &#xff08;1&#xff09;单机部署 场景&#xff1a; 将多个应用部署一台服务器上。 问题 每个应用软件&#xff0c;都会消耗物理资源&#xff0c;共用计算机资源&#xff0c;彼此之间会形成竞争关系。 &#xff08;2&#xff09;多机部署 …

python django 生鲜商城管理系统

python django 生鲜商城管理系统,包含用户端和管理端 功能&#xff1a; 用户端&#xff1a;商城主页展示&#xff0c;登录&#xff0c;注册&#xff0c;用户中心&#xff0c;购物车&#xff0c;我的订单&#xff0c;购物车结算 管理端&#xff1a;登录&#xff0c;商品&…

SpringBoot: 通过MyBatis访问ClickHouse

一、ClickHouse中建表&#xff0c;添加数据 二、SpringBoot项目添加mybatis、clickhouse、druid相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version></dependency>…

opencv入门到精通——Canny边缘检测

目录 理论 OpenCV中的Canny Edge检测 附加资源 在本章中&#xff0c;我们将学习 Canny边缘检测的概念 OpenCV函数: cv.Canny() 理论 Canny Edge Detection是一种流行的边缘检测算法。它由John F. Canny发明 1.这是一个多阶段算法&#xff0c;我们将经历每个阶段。 2.降…

原生JS调用OpenAI GPT接口并实现ChatGPT逐字输出效果

效果&#xff1a; 猜你感兴趣&#xff1a;springbootvue实现ChatGPT逐字输出打字效果 附源码&#xff0c;也是小弟原创&#xff0c;感谢支持&#xff01; 没废话&#xff0c;上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><me…

09、docker 安装nacos并配置mysql存储配置信息

docker 安装nacos并配置mysql存储配置信息 1、docker启动nacos的各种方式2、Docker安装nacos3、MySQL中新建nacos的数据库4、挂载数据or配置目录5、运行 1、docker启动nacos的各种方式 内嵌derby数据源 docker run -d \ -e PREFER_HOST_MODEhostname \ -e SPRING_DATASOURCE_…

软件测试技术复习点

1 术语含义&#xff08;故障、错误、失效、测试用例&#xff09; 故障&#xff08;Fault&#xff09;&#xff1a;故障是软件中的静态缺陷&#xff1b; 故障屏蔽&#xff1a;软件中的某个故障可能被其他一个或多个故障屏蔽&#xff1b; 错误&#xff08;Error&#xff09;&…

1 电科院FTU检测标准学习笔记-外观检查

作者简介&#xff1a; 本人从事电力系统多年&#xff0c;岗位包含研发&#xff0c;测试&#xff0c;工程等&#xff0c;具有丰富的经验 在配电自动化验收测试以及电科院测试中&#xff0c;本人全程参与&#xff0c;积累了不少现场的经验 目录 **前言****检测大纲****外观与结构…

LeetCode 2397. 被列覆盖的最多行数,状态压缩优化回溯法

一、题目 1、题目描述 给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix &#xff1b;另给你一个整数 numSelect&#xff0c;表示你必须从 matrix 中选择的 不同 列的数量。 如果一行中所有的 1 都被你选中的列所覆盖&#xff0c;则认为这一行被 覆盖 了。 形式上&am…

【目标检测实验系列】YOLOv5模型改进:融合混合注意力机制CBAM,关注通道和空间特征,助力模型高效涨点!(内含源代码,超详细改进代码流程)

自我介绍&#xff1a;本人硕士期间全程放养&#xff0c;目前成果:一篇北大核心CSCD录用,两篇中科院三区已见刊&#xff0c;一篇中科院四区在投。如何找创新点&#xff0c;如何放养过程厚积薄发&#xff0c;如何写中英论文&#xff0c;找期刊等等。本人后续会以自己实战经验详细…

开源协议简介和选择

软件国产化已经提到日程上了&#xff0c;先来研究一下开源协议。 引言 在追求“自由”的开源软件领域的同时不能忽视程序员的权益。为了激发程序员的创造力&#xff0c;现今世界上有超过60种的开源许可协议被开源促进组织&#xff08;Open Source Initiative&#xff09;所认可…

SpingBoot的项目实战--模拟电商【3.购物车模块】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.功能需求 二.代码编写 …

Git(2):Git环境的安装

本教程里的git命令例子都是在Git Bash中演示的&#xff0c;会用到一些基本的linux命令&#xff0c;在此为大家提前列举&#xff1a; ls/ll 查看当前目录cat 查看文件内容touch 创建文件vi vi编辑器&#xff08;使用vi编辑器是为了方便展示效果&#xff0c;学员可以记事本、edi…

使用异构图学习破解推荐系统 - 第 1 部分

Lokesh Sharma – Medium 一、说明 所以&#xff0c;这是独家新闻&#xff1a;异质图拥有一个充满潜力的世界&#xff0c;而常规图却无法做到这一点。传统的同构图很难处理不同关系和边类型的复杂性。现在是大炮的时候了——先进的架构可以解决具有多种边缘和关系类型的数据集的…

Nacos学习思维导图

一、服务注册 参考文档&#xff1a;http://www.bryh.cn/a/118936.html https://blog.csdn.net/Saintmm/article/details/121981184 二、服务续约 参考文档&#xff1a;http://www.bryh.cn/a/118936.html https://blog.csdn.net/Saintmm/article/details/121981184 三、服务…

清风数学建模排版

Overview 链接&#xff1a;https://pan.baidu.com/s/11QBw3zBFNicwQWvWCfW1Gg?pwdepnz 提取码&#xff1a;epnz Latex 范文排版练习 b站刘海洋latex工作室&#xff0c;待还愿 Word基础 Word VBA&#xff0c;待还愿 fnF4&#xff1a;重复上一步操作 ctrlY&#xff1a;恢…

DispatcherServlet请求处理流程

前言 DispatcherServlet 是 Spring MVC 的核心类&#xff0c;它本质是一个 Servlet&#xff0c;负责接管 HTTP 请求并把它分发给对应的处理器处理&#xff0c;最后处理响应结果渲染页面。 DispatcherServlet 本身并不复杂&#xff0c;它提供了一个模板方法doDispatch()来处理请…

进阶学习——Linux系统中重点‘进程’

目录 一、程序和进程的关系 1.程序 2.进程 2.1线程 2.2协程 3.进程与线程的区别 4.总结 4.1延伸 5.进程使用内存的问题 5.1内存泄漏——Memory Leak 5.2内存溢出——Memory Overflow 5.3内存不足——OOM&#xff08;out of memory&#xff09; 5.4进程使用内存出现…

如何正确使用docker搭建靶场--pikachu

在Linux中搭建靶场——pikachu 1.开启docker systemctl start docker 2.查看docker状态 systemctl status docker 3.查看docker存在那些镜像 docker images 4.拉取镜像&#xff0c;这里是以pikachu为例因此需要一个php5的版本 &#xff08;1&#xff09;打开代理&#xff…