不同查询构建器的使用方式(Mybatis、Mybatis-Plus、Mybatis-Flex、Spring Data JPA、QueryDsl)

目录

    • 一、SQL查询需求
    • 二、【Mybaits】xml方式
    • 三、【Mybatis-Plus】QueryWrapper方式
    • 四、【Mybatis-Flex】QueryWrapper方式
    • 五、【Mybatis-Flex】QueryWrapper & APT方式
    • 六、【Spring Data JPA】Specification方式
    • 七、【Spring Data JPA】Specification & MetaModel方式
    • 八、【Spring Data JPA】QueryDsl方式

一、SQL查询需求

实现如下3个查询:

-- 查询1
SELECT 
* 
FROM SAMPLE 
WHERE
id = 1 
AND name LIKE '%ha%' 
AND create_time BETWEEN '2014-11-24' AND '2024-11-24'  -- 查询2
SELECT 
* 
FROM SAMPLE 
WHERE
id = 1 
OR name LIKE '%ha%' 
OR create_time BETWEEN '2014-11-24' AND '2024-11-24'  -- 查询3
SELECT 
* 
FROM SAMPLE 
WHERE
( id = 1 OR name LIKE '%ha%')
AND create_time BETWEEN '2014-11-24' AND '2024-11-24' 

查询参数:

package com.luo.query;class SampleQuery {private Long id;private String name;private LocalDateTime startDate;private LocalDateTime endDate;//省略getter/setter...
}

Sample数据对象:

package com.luo.po;class Sample {private Long id;private String name;private LocalDateTime createTime;//省略getter/setter...
}

二、【Mybaits】xml方式

定义dao接口:

package com.luo.dao;class SamplerMapper {List<Sample> select1(SampleQuery query);List<Sample> select2(SampleQuery query);List<Sample> select3(SampleQuery query);
}

定义mapper.xml,使用xml编写动态sql条件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.luo.dao.SampleMapper">   <select id="select1" resultType="com.luo.po.Sample">SELECT *FROM SAMPLE<where><if test="id != null">AND id = #{id}</if><if test="name != null">AND name LIKE CONCAT('%',#{name},'%')</if><if test="startDate != null and endDate != null">AND create_time BETWEEN #{startDate} AND #{endDate}</if></where></select><select id="select2" resultType="com.luo.po.Sample">SELECT *FROM SAMPLE<where><if test="id != null">OR id = #{id}</if><if test="name != null">OR name LIKE CONCAT('%',#{name},'%')</if><if test="startDate != null and endDate != null">OR create_time BETWEEN #{startDate} AND #{endDate}</if></where></select><select id="select3" resultType="com.luo.po.Sample">SELECT *FROM SAMPLE<where><if test="id != null or name != null">(<if test="id != null">id = #{id} OR </if><if test="name != null">name LIKE CONCAT('%',#{name},'%')</if>)</if>            <if test="startDate != null and endDate != null">AND create_time BETWEEN #{startDate} AND #{endDate}</if></where></select>
</mapper>

三、【Mybatis-Plus】QueryWrapper方式

定义dao接口,使用Mybatis-Plus QueryWrapper 动态构建查询条件:

import com.baomidou.mybatisplus.core.mapper.BaseMapper
import com.baomidou.mybatisplus.core.toolkit.Wrappers;public interface SampleMapper extends BaseMapper<Sample> {default List<Sample> select1(SampleQueryDto query) {return this.selectList(Wrappers.<Sample>lambdaQuery().eq(Objects.nonNull(query.getId()), Sample::getId, query.getId()).like(Objects.nonNull(query.getName()), Sample::getName, query.getName()).between(Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate()), Sample::getCreateTime, query.getStartDate(), query.getEndDate()));}default List<Sample> select2(SampleQueryDto query) {return this.selectList(Wrappers.<Sample>lambdaQuery().or().eq(Objects.nonNull(query.getId()), Sample::getId, query.getId()).or().like(Objects.nonNull(query.getName()), Sample::getName, query.getName()).or().between(Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate()), Sample::getCreateTime, query.getStartDate(), query.getEndDate()));}default List<Sample> select3(SampleQueryDto query) {return this.selectList(Wrappers.<Sample>lambdaQuery().between(Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate()), Sample::getCreateTime, query.getStartDate(), query.getEndDate()).and(Objects.nonNull(query.getId()) || Objects.nonNull(query.getName()),wrapper -> wrapper.eq(Objects.nonNull(query.getId()), Sample::getId, query.getId()).or().like(Objects.nonNull(query.getName()), Sample::getName, query.getName())));}
}

四、【Mybatis-Flex】QueryWrapper方式

定义dao接口,使用Mybatis-Flex QueryWrapper 动态构建查询条件:

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.query.QueryWrapperpublic interface SampleMapper extends BaseMapper<Sample> {default List<Sample> select1(SampleQueryDto query) {return this.selectListByQuery(QueryWrapper.create().eq(Sample::getId, query.getId(), Objects.nonNull(query.getId())).like(Sample::getName, query.getName(), Objects.nonNull(query.getName())).between(Sample::getCreateTime, query.getStartDate(), query.getEndDate(), Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate())));}default List<Sample> select2(SampleQueryDto query) {return this.selectListByQuery(QueryWrapper.create().or(Sample::getId).eq(query.getId(), Objects.nonNull(query.getId())).or(Sample::getName).like(query.getName(), Objects.nonNull(query.getName())).or(Sample::getCreateTime).between(query.getStartDate(), query.getEndDate(), Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate())));}default List<Sample> select3(SampleQueryDto query) {return this.selectListByQuery(QueryWrapper.create().between(Sample::getCreateTime, query.getStartDate(), query.getEndDate(), Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate())).and(queryWrapper -> {queryWrapper.eq(Sample::getId, query.getId(), Objects.nonNull(query.getId())).or(Sample::getName).like(query.getName(), Objects.nonNull(query.getName()));}, Objects.nonNull(query.getId()) || Objects.nonNull(query.getName())));}
}

五、【Mybatis-Flex】QueryWrapper & APT方式

定义dao接口,使用Mybatis-Flex QueryWrapper 和 基于APT生成的查询辅助类 动态构建查询条件:

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.query.QueryWrapper;
import static com.luo.po.table.SampleTableDef.SAMPLE;public interface SampleMapper extends BaseMapper<Sample> {default List<Sample> select1(SampleQueryDto query) {return this.selectListByQuery(QueryWrapper.create().where(SAMPLE.ID.eq(query.getId(), Objects.nonNull(query.getId()))).and(SAMPLE.NAME.like(query.getName(), Objects.nonNull(query.getName()))).and(SAMPLE.CREATE_TIME.between(query.getStartDate(), query.getEndDate(), Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate()))));}default List<Sample> select2(SampleQueryDto query) {return this.selectListByQuery(QueryWrapper.create().where(SAMPLE.ID.eq(query.getId(), Objects.nonNull(query.getId()))).or(SAMPLE.NAME.like(query.getName(), Objects.nonNull(query.getName()))).or(SAMPLE.CREATE_TIME.between(query.getStartDate(), query.getEndDate(), Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate()))));}default List<Sample> select3(SampleQueryDto query) {return this.selectListByQuery(QueryWrapper.create().where(SAMPLE.CREATE_TIME.between(query.getStartDate(), query.getEndDate(), Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate()))).and(SAMPLE.ID.eq(query.getId(), Objects.nonNull(query.getId())).or(SAMPLE.NAME.like(query.getName(), Objects.nonNull(query.getName())))));}
}

六、【Spring Data JPA】Specification方式

定义仓库接口,使用Spring Data JPA Specification构建查询条件:

import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.util.CollectionUtils;import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;/*** 示例仓库(Specification)** @author luohq* @date 2024-11-25 13:01* @link https://docs.spring.io/spring-data/jpa/reference/jpa/specifications.html*/
public interface SampleRepo1 extends JpaRepository<Sample, String>, JpaSpecificationExecutor<Sample>, QuerydslPredicateExecutor<Sample> {default List<Sample> select1(SampleQuery query) {//构建查询条件Specification<Sample> specification = new Specification<>() {@Overridepublic Predicate toPredicate(Root<Sample> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {List<Predicate> predicates = new ArrayList<>(3);if (Objects.nonNull(query.getId())) {predicates.add(cb.equal(root.get("id"), query.getId()));}if (Objects.nonNull(query.getName())) {predicates.add(cb.like(root.get("name"), "%" + query.getName() + "%"));}if (Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate())) {predicates.add(cb.between(root.get("createTime"), query.getStartDate(), query.getEndDate()));}return cb.and(predicates.toArray(Predicate[]::new));}};//执行查询return this.findAll(specification);}default List<Sample> select2(SampleQuery query) {//构建查询条件Specification<Sample> specification = new Specification<>() {@Overridepublic Predicate toPredicate(Root<Sample> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {List<Predicate> predicates = new ArrayList<>(3);if (Objects.nonNull(query.getId())) {predicates.add(cb.equal(root.get("id"), query.getId()));}if (Objects.nonNull(query.getName())) {predicates.add(cb.like(root.get("name"), "%" + query.getName() + "%"));}if (Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate())) {predicates.add(cb.between(root.get("createTime"), query.getStartDate(), query.getEndDate()));}if (CollectionUtils.isEmpty(predicates)) {//默认添加一个成立条件,避免多个or条件为空时拼接0=1predicates.add(cb.equal(cb.literal(1), 1));}return cb.or(predicates.toArray(Predicate[]::new));}};//执行查询return this.findAll(specification);}default List<Sample> select3(SampleQuery query) {//构建查询条件Specification<Sample> specification = new Specification<>() {@Overridepublic Predicate toPredicate(Root<Sample> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {List<Predicate> predicates = new ArrayList<>(2);if (Objects.nonNull(query.getId())) {predicates.add(cb.equal(root.get("id"), query.getId()));}if (Objects.nonNull(query.getName())) {predicates.add(cb.like(root.get("name"), "%" + query.getName() + "%"));}if (CollectionUtils.isEmpty(predicates)) {//默认添加一个成立条件,避免多个or条件为空时拼接0=1predicates.add(cb.equal(cb.literal(1), 1));}Predicate group1 = cb.or(predicates.toArray(Predicate[]::new));predicates = new ArrayList<>(1);if (Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate())) {predicates.add(cb.between(root.get("createTime"), query.getStartDate(), query.getEndDate()));}Predicate group2 = cb.and(predicates.toArray(Predicate[]::new));return cb.and(group1, group2);}};//执行查询return this.findAll(specification);}
}

七、【Spring Data JPA】Specification & MetaModel方式

定义仓库接口,使用Spring Data JPA Specification 和 动态生成的JPA元模型 构建查询条件:

import com.luo.po.Sample;
import com.luo.po.Sample_;
import com.luo.query.SampleQuery;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.util.CollectionUtils;import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;/*** 示例仓库(Specification、MetaModel)** @author luohq* @date 2024-11-25 13:01* @link https://docs.spring.io/spring-data/jpa/reference/jpa/specifications.html* @link https://docs.jboss.org/hibernate/jpamodelgen/1.3/reference/en-US/html_single/*/
public interface SampleRepo2 extends JpaRepository<Sample, String>, JpaSpecificationExecutor<Sample>, QuerydslPredicateExecutor<Sample> {default List<Sample> select1(SampleQuery query) {//构建查询条件Specification<Sample> specification = new Specification<>() {@Overridepublic Predicate toPredicate(Root<Sample> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {List<Predicate> predicates = new ArrayList<>(3);if (Objects.nonNull(query.getId())) {predicates.add(cb.equal(root.get(Sample_.ID), query.getId()));}if (Objects.nonNull(query.getName())) {predicates.add(cb.like(root.get(Sample_.NAME), "%" + query.getName() + "%"));}if (Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate())) {predicates.add(cb.between(root.get(Sample_.CREATE_TIME), query.getStartDate(), query.getEndDate()));}return cb.and(predicates.toArray(Predicate[]::new));}};//执行查询return this.findAll(specification);}default List<Sample> select2(SampleQuery query) {//构建查询条件Specification<Sample> specification = new Specification<>() {@Overridepublic Predicate toPredicate(Root<Sample> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {List<Predicate> predicates = new ArrayList<>(3);if (Objects.nonNull(query.getId())) {predicates.add(cb.equal(root.get(Sample_.ID), query.getId()));}if (Objects.nonNull(query.getName())) {predicates.add(cb.like(root.get(Sample_.NAME), "%" + query.getName() + "%"));}if (Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate())) {predicates.add(cb.between(root.get(Sample_.CREATE_TIME), query.getStartDate(), query.getEndDate()));}if (CollectionUtils.isEmpty(predicates)) {//默认添加一个成立条件,避免多个or条件为空时拼接0=1predicates.add(cb.equal(cb.literal(1), 1));}return cb.or(predicates.toArray(Predicate[]::new));}};//执行查询return this.findAll(specification);}default List<Sample> select3(SampleQuery query) {//构建查询条件Specification<Sample> specification = new Specification<>() {@Overridepublic Predicate toPredicate(Root<Sample> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {List<Predicate> predicates = new ArrayList<>(2);if (Objects.nonNull(query.getId())) {predicates.add(cb.equal(root.get(Sample_.ID), query.getId()));}if (Objects.nonNull(query.getName())) {predicates.add(cb.like(root.get(Sample_.NAME), "%" + query.getName() + "%"));}if (CollectionUtils.isEmpty(predicates)) {//默认添加一个成立条件,避免多个or条件为空时拼接0=1predicates.add(cb.equal(cb.literal(1), 1));}Predicate group1 = cb.or(predicates.toArray(Predicate[]::new));predicates = new ArrayList<>(1);if (Objects.nonNull(query.getStartDate()) && Objects.nonNull(query.getEndDate())) {predicates.add(cb.between(root.get(Sample_.CREATE_TIME), query.getStartDate(), query.getEndDate()));}Predicate group2 = cb.and(predicates.toArray(Predicate[]::new));return cb.and(group1, group2);}};//执行查询return this.findAll(specification);}
}

八、【Spring Data JPA】QueryDsl方式

定义仓库接口,使用 Spring Data JPA 和 QueryDsl 构建查询条件:

import com.luo.po.Sample;
import static com.luo.po.QSample.sample;
import com.luo.query.SampleQuery;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.Expressions;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;/*** 示例仓库(Specification、QueryDsl)** @author luohq* @date 2024-11-25 13:01* @link https://docs.spring.io/spring-data/jpa/reference/jpa/specifications.html* @link https://docs.spring.io/spring-data/jpa/reference/repositories/core-extensions.html#core.extensions.querydsl*/
public interface SampleRepo3 extends JpaRepository<Sample, String>, JpaSpecificationExecutor<Sample>, QuerydslPredicateExecutor<Sample> {default List<Sample> select1(SampleQuery query) {//Predicate predicate = sample.id.eq(query.getId())//        .and(sample.name.contains(query.getName()))//        .and(sample.createTime.between(query.getStartDate(), query.getEndDate()));//构建查询条件List<BooleanExpression> predicates = new ArrayList<>();if (query.getId() != null) {predicates.add(sample.id.eq(query.getId()));}if (query.getName() != null) {predicates.add(sample.name.contains(query.getName()));}if (query.getStartDate() != null && query.getEndDate() != null) {predicates.add(sample.createTime.between(query.getStartDate(), query.getEndDate()));}//避免空指针异常if (predicates.isEmpty()) {predicates.add(Expressions.asBoolean(true).isTrue());}//合并查询条件BooleanExpression predicate = Expressions.allOf(predicates.toArray(new BooleanExpression[predicates.size()]));//执行查询Iterable<Sample> all = this.findAll(predicate);return StreamSupport.stream(all.spliterator(), false).collect(Collectors.toList());}default List<Sample> select2(SampleQuery query) {//Predicate predicate = sample.id.eq(query.getId())//        .or(sample.name.contains(query.getName()))//        .or(sample.createTime.between(query.getStartDate(), query.getEndDate()));//构建查询条件List<BooleanExpression> predicates = new ArrayList<>();if (query.getId() != null) {predicates.add(sample.id.eq(query.getId()));}if (query.getName() != null) {predicates.add(sample.name.contains(query.getName()));}if (query.getStartDate() != null && query.getEndDate() != null) {predicates.add(sample.createTime.between(query.getStartDate(), query.getEndDate()));}//避免空指针异常if (predicates.isEmpty()) {predicates.add(Expressions.asBoolean(true).isTrue());}//合并查询条件BooleanExpression predicate = Expressions.anyOf(predicates.toArray(new BooleanExpression[predicates.size()]));//执行查询Iterable<Sample> all = this.findAll(predicate);return StreamSupport.stream(all.spliterator(), false).collect(Collectors.toList());}default List<Sample> select3(SampleQuery query) {//Predicate predicate = sample.createTime.between(query.getStartDate(), query.getEndDate())//        .and(sample.id.eq(query.getId())//                .or(sample.name.contains(query.getName()))//        );//构建查询条件 - 分组1List<BooleanExpression> predicates = new ArrayList<>();if (query.getStartDate() != null && query.getEndDate() != null) {predicates.add(sample.createTime.between(query.getStartDate(), query.getEndDate()));}//避免空指针异常if (predicates.isEmpty()) {predicates.add(Expressions.asBoolean(true).isTrue());}//合并查询条件BooleanExpression group1 = Expressions.allOf(predicates.toArray(new BooleanExpression[predicates.size()]));//构建查询条件 - 分组2predicates = new ArrayList<>();if (query.getId() != null) {predicates.add(sample.id.eq(query.getId()));}if (query.getName() != null) {predicates.add(sample.name.contains(query.getName()));}//避免空指针异常if (predicates.isEmpty()) {predicates.add(Expressions.asBoolean(true).isTrue());}//合并查询条件BooleanExpression group2 = Expressions.anyOf(predicates.toArray(new BooleanExpression[predicates.size()]));//合并分组条件Predicate predicate = Expressions.allOf(group1, group2);//执行查询Iterable<Sample> all = this.findAll(predicate);return StreamSupport.stream(all.spliterator(), false).collect(Collectors.toList());}
}

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

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

相关文章

计算机网络socket编程(2)_UDP网络编程实现网络字典

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(2)_UDP网络编程实现网络字典 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨…

简单链式表

# 完成双向循环链表的判空、尾插、遍历、尾删 class Node:def __init__(self, value):self.value valueself.next Noneself.prev None class Linklist:def __init__(self,nodeNone):self.head nodeself.size 0def is_empty(self):return self.size 0def add_tail(self,va…

流水线切分策略;通过自适应的重采样和重计算策略来优化计算资源和内存使用

目录 流水线切分策略 1,2,3,4,5指的计算任务(数据切分) 大方块代表GPU计算 黄色代表显存 通过自适应的重采样和重计算策略来优化计算资源和内存使用 一是自适应重计算(Adaptive Recomputation) 二是自适应划分(Adaptive Partitioning) 流水线切分策略 1,2,3,4,5指…

git: 修改gitlab仓库提交地址

git: 修改gitlab仓库提交地址 右键git bash here 1、进入到项目my-project所在位置 2、查看当前项目远程仓库地址 3、修改远程仓库地址 4、再次查看新的远程仓库地址以确认修改成功 cd /my-project git remote -v # 查看当前远程仓库地址 git remote set-url origin 新的Gi…

不只是请求和响应:使用Fiddler抓包URL和Method全指南(中)

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 不只是请求和响应&#xff1a;使用Fiddler抓包HTTP协议全指南(上)-CSDN博客https://blog.csdn.net/Chunfeng6yugan/article/details/144005872?spm1001.2014.3001.5502 &#x1f649;在(上)篇博客中&#xf…

卷积神经网络(CNN)中的批量归一化层(Batch Normalization Layer)

批量归一化层&#xff08;BatchNorm层&#xff09;&#xff0c;或简称为批量归一化&#xff08;Batch Normalization&#xff09;&#xff0c;是深度学习中常用的一种技术&#xff0c;旨在加速神经网络的训练并提高收敛速度。 一、基本思想 为了让数据在训练过程中保持同一分布…

前端速通(CSS)

1.CSS介绍 1.什么是CSS? CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用于控制网页的外观和布局的样式表语言。它与HTML&#xff08;超文本标记语言&#xff09;紧密配合&#xff0c;负责页面元素的样式定义&#xff0c;如字体、颜色、尺…

webkit浏览器内核编译(2024年11月份版本)

webkit浏览器内核编译 本文详细介绍了如何安装和配置Webkit的编译环境和工具的安装&#xff0c;以及在Windows上编译和运行WebKit浏览器引擎的过程&#xff0c;包括安装依赖、设置环境变量、生成解决方案并最终运行附带的MiniBrowser示例。 一、WebKit简介 WebKit 是一个开源的…

SQL注入--理论--堆叠注入

什么是堆叠注入&#xff1f; 在SQL语句操作的时候&#xff0c;每个语句都是以分号;标志结尾的。 在我们注入的过程中&#xff0c;通过使用多个分号同时进行多个SQL语句的注入&#xff0c;就是堆叠注入。 例如&#xff1a; ?inject1;handler 1919810931114514 open;handler 1…

鸿蒙操作系统(HarmonyOS)

鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司开发的一款面向未来的全场景智慧生活操作系统。它旨在为不同设备的智能化、互联与协同提供统一的语言。鸿蒙提出的基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;是其核心竞争力之一。这一理念不仅使得…

C++趣味编程玩转物联网:用树莓派Pico实现一位数码管动态显示

七段数码管是一种经典的电子显示器件&#xff0c;广泛应用于数字时钟、电子仪表等设备。本文将通过树莓派Pico开发板&#xff0c;介绍如何用C代码控制一位七段数码管显示数字。作为一个嵌入式开发项目&#xff0c;这不仅是初学者理解数码管工作原理的好机会&#xff0c;也是C开…

本机上装好的ubuntu 全部的开发软件 如何备份以后移到另一台电脑上 还不会出现引导错误?

在Ubuntu系统上备份和迁移所有开发软件&#xff0c;可以按照以下步骤进行&#xff1a; 步骤 1: 备份已安装的软件列表 你可以使用dpkg命令来生成已安装软件的列表&#xff0c;并将其保存到一个文件中&#xff1a; dpkg --get-selections > installed_packages.txtDiffCop…

【Cesium】--viewer,entity,dataSource

viewer&#xff0c;entity&#xff0c;dataSource的关系 viewer.entities.add({}) 通过viwer.entities.add()直接加载的entity&#xff0c;默认是在viewer.entities(即viewer.dataSourceDisplay.defaultDataSource.entities)中&#xff0c;不会加载在viewer.dataSource中。 w…

Paddle Inference部署推理(三)

三&#xff1a;Paddle Inference推理 导出模型 Paddle Inference支持使用飞桨静态图模型进行推理&#xff0c;您可以通过以下两种方式获取静态图模型&#xff1a; &#xff08;1&#xff09;飞桨框架导出推理模型 飞桨框架在训练模型过程中&#xff0c;会在本地存储最终训练…

【国产MCU系列】-GD32F470-内部集成电路总线接口(I2C)

内部集成电路总线接口(I2C) 文章目录 内部集成电路总线接口(I2C)1、GD32F4的I2C模块介绍2、I2C控制器寄存器列表3、I2C工作模式3.1 I2C通讯流程3.2 主机模式发送数据流程3.3 主机模式数据接收流程3.4 DMA模式下数据传输4、I2C控制器相关API介绍5、I2C使用示例5.1 I2C主机模…

什么是Spring IOC和Spring AOP?

IOC就是控制反转&#xff0c;控制反转就是对组件对象控制权的转移&#xff0c;从程序代码本身转移到了外部容器。它把由程序代码直接操控的对象的调用权交给容器&#xff0c;通过容器实现对象组件的管理和装配。 Srping IOC负责创建对象&#xff0c;管理对象&#xff0c;装配对…

非交换几何与黎曼ζ函数:数学中的一场革命性对话

非交换几何与黎曼ζ函数&#xff1a;数学中的一场革命性对话 非交换几何&#xff08;Noncommutative Geometry, NCG&#xff09;是数学的一个分支领域&#xff0c;它将经典的几何概念扩展到非交换代数的框架中。非交换代数是一种结合代数&#xff0c;其中乘积不是交换性的&…

【CSP CCF记录】201803-1第13次认证 跳一跳

题目 样例输入 1 1 2 2 2 1 1 2 2 0 样例输出 22 思路 没有技术含量的一道题&#xff0c;解题的关键是理解游戏规则。用state标记跳跃状态&#xff0c;以下是对游戏规则的分析&#xff1a; 1. state1&#xff0c;跳到方块上但没跳到中心&#xff0c;得1分 2. state2&#xf…

ALSA(2) ---- DMA实践

DMA实践 本篇文章主要是学习alsa高级音频框架总结而来&#xff0c;ALSA的Platform侧ADMA&#xff0c;学习总结而来&#xff0c;adma驱动来源于telechips产商805x芯片&#xff1b; ADMA物理拓扑图 ADMA物理拓扑图如上&#xff0c;RX和TX ADMA是接收和发送控制器&#xff0c;Ar…

【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…