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

MyBatis系列四: 动态SQL

动态SQL语句-更复杂的查询业务需求

  • 官方文档
  • 基本介绍
  • 案例演示
    • if标签应用实例
    • where标签应用实例
    • choose/when/otherwise应用实例
    • foreach标签应用实例
    • trim标签应用实例[使用较少]
    • set标签应用实例[重点]
    • 课后练习

上一讲, 我们学习的是 MyBatis系列三: 原生的API与配置文件详解

现在打开mybatis项目

在这里插入图片描述

官方文档

文档地址:
https://mybatis.org/mybatis-3/zh_CN/dynamic-sql.html

为什么需要动态SQL
1.动态 SQLMyBatis 的强大特性之一
2.使用 JDBC 或其它类似的框架, 根据不同条件拼接 SQL 语句非常麻烦, 例如拼接时要确保不能忘记添加必要的空格, 还要注意去掉列表最后一个列名的逗号等.
3.SQL 映射语句中的强大的动态 SQL 语句, 可以很好地解决这个问题.

基本介绍

●基本介绍
1.在一个实际的项目中, sql语句往往是比较复杂的
2.为了满足更加复杂的业务需求, MyBatis的设计者, 提供了动态生成SQL的功能
●动态SQL必要性
1.比如我们查询Monster 时, 如果程序员输入的age 不大于0, 我们的sql语句就不带age
2.更新Monster对象时, 没有设置新的属性值, 就保持原来的值, 设置了新的值, 才更新.
●解决方案
1.从上面的需求我们可以看出, 有时我们在生成sql语句时, 在同一个方法中, 还要根据不同的情况生成不同的sql语句.
2.解决方案: MyBatis提供的动态SQL 机制.

●动态SQL常用标签
动态SQL提供了如下几种常用的标签, 类似我们Java的控制语句:
1.if [判断]
2.where [拼接 where 语句]
3.choose / when / otherwise [类似javaswitch 语句, 注意是单分支]
4.foreach [类似 in]
5.trim [替换关键字 / 定制元素的功能]
6.set [在updateset 中, 可以保证进入 set 标签的属性被修改, 而没有进入set的, 保持原来的值]

案例演示

1.在原来的mybatis项目中, 新建dynamic-sql子项目 [参考], 演示动态SQL的使用

2.新建Module后, 先创建需要的包, 再将需要的文件 / 资源拷贝过来(这里我们拷贝Monster.java, resources/jdbc.propertiesmybatis-config.xml)

3.拷贝MonsterMapper.java, MonsterMapper.xmlMonsterMapperTest.java, 做一个比较 干净的讲解环境

if标签应用实例

●需求: 请查询age 大于 10 的所有妖怪, 如果程序员输入的age 不大于 0, 则输出所有的妖怪!

1.修改MonsterMapper.java, 增加方法接口

public interface MonsterMapper {//根据age查询结果public List<Monster> findMonsterByAge(@Param(value = "age") Integer age);
}

2.修改MonsterMapper.xml

<mapper namespace="com.zzw.mapper.MonsterMapper"><!--   1.配置/实现public List<Monster> findMonsterByAge(@Param(value = "age")Integer age);2.请查询`age` 大于 `10` 的所有妖怪, 如果程序员输入的`age` 不大于 `0`, 则输出所有的妖怪!3.如果我们按照以前方式来配置->问题? 如果使用原来的#{age} 在test表达式是取不出入参值4.解决方案是使用@Param --><select id="findMonsterByAge" parameterType="Integer" resultType="Monster"><!--这里能用简写是因为mybatis-config.xml文件里配置了别名-typeAliases-->SELECT * FROM `monster` where 1 = 1<if test="age > 0">AND `age` > #{age}</if></select>
</mapper>

3.测试MonsterAnnotationTest

@Test
public void findMonsterByAge() {List<Monster> monsters= monsterMapper.findMonsterByAge(-1);for (Monster monster : monsters) {System.out.println("monster--" + monster);}if (sqlSession != null) {sqlSession.close();}System.out.println("操作成功");
}

where标签应用实例

●需求: 请查询id 大于 20 的, 并且名字是 “牛魔王” 的所有妖怪. 注意, 如果名字为空, 或者输入的id小于 0, 则不拼接 sql语句(梳理: 如果名字为空, 就不带名字条件; 如果输入的id小于 0, 就不带id的条件)

1.修改MonsterMapper.java, 增加方法接口

public interface MonsterMapper {//根据id和名字来查询结果public List<Monster> findMonsterByIdAndName(Monster monster);
}

2.修改MonsterMapper.xml

<!--
1.配置/实现public List<Monster> findMonsterByIdAndName(Monster monster);
2.请查询`id` 大于 `20` 的, 并且名字是 "牛魔王" 的所有妖怪.注意, 如果名字为空, 或者输入的`id`小于 `0`, 则不拼接 `sql`语句(梳理: 如果名字为空, 就不带名字条件; 如果输入的`id`小于 `0`, 就不带`id`的条件)
3.where + if : WHERE `id` > #{id} AND `name` = #{name};
4.如果我们入参是对象, test表达式中, 直接使用对象的属性名即可
5.where标签, 会在组织动态sql时, 加上where
6.mybatis底层自动地去掉多余的AND
-->
<select id="findMonsterByIdAndName" parameterType="Monster" resultType="Monster">SELECT * FROM `monster`<where><if test="id >= 0">AND `id` > #{id}</if><if test="name != null and name != ''">AND `name` = #{name}</if></where>
</select>

3.测试MonsterAnnotationTest

@Test
public void findMonsterByIdAndName() {Monster monster = new Monster();monster.setId(20);monster.setName("牛魔王");List<Monster> monsters = monsterMapper.findMonsterByIdAndName(monster);for (Monster m : monsters) {System.out.println("m=" + m);}if (sqlSession != null) {sqlSession.close();}System.out.println("操作成功");
}

choose/when/otherwise应用实例

●需求:
1) 如果给的name不为空, 就按名字查询妖怪.
2) 如果指定的id>0, 就按id来查询妖怪.
3) 如果前面两个条件都不满足, 就默认查询 salary > 100
4) 要求使用 choose/when/otherwise 标签实现, 传入参数要求使用Map

1.修改MonsterMapper.java, 增加方法接口

public interface MonsterMapper {//测试choose标签的使用public List<Monster> findMonsterByIdOrName_choose(Map<String, Object> map);
}

2.修改MonsterMapper.xml

<!--
1.配置/使用public List<Monster> findMonsterByIdOrName_choose(Map<String, Object> map);
2.  1) 如果给的`name`不为空, 就按名字查询妖怪.2) 如果指定的`id>0`, 就按`id`来查询妖怪.3) 如果前面两个条件都不满足, 就默认查询 `salary > 100`的4) 使用mybatis 提供choose-when-otherwise
-->
<select id="findMonsterByIdOrName_choose" parameterType="map" resultType="Monster">SELECT * FROM `monster`<choose><when test="name != null and name != ''">WHERE `name` = #{name}</when><when test="id > 0">WHERE `id` > #{id}</when><otherwise>WHERE `salary` > 100</otherwise></choose>
</select>

3.测试MonsterAnnotationTest

@Test
public void findMonsterByIdOrName_choose() {Map<String, Object> map = new HashMap<>();map.put("id", -1);//map.put("name", "牛魔王");List<Monster> monsters = monsterMapper.findMonsterByIdOrName_choose(map);for (Monster monster : monsters) {System.out.println("monster--" + monster);}if (sqlSession != null) {sqlSession.close();}System.out.println("查询成功");
}

foreach标签应用实例

●需求: 查询id20, 22, 34的妖怪

1.修改MonsterMapper.java, 增加方法接口

public interface MonsterMapper {//测试foreach标签的使用public List<Monster> findMonsterById_forEach(Map<String, Object> map);
}

2.修改MonsterMapper.xml

<!--
1.配置/实现public List<Monster> findMonsterById_forEach(Map<String, Object> map);
2.查询`id` 为 `20, 22, 34`的妖怪
3.使用foreach标签
4.入参map 中 会如何传入id值 k-v, ids - [集合, 比如List 10,12,14], 即map 入参中应当有 ids-[10,12,14]
-->
<select id="findMonsterById_forEach" resultType="Monster" parameterType="map">SELECT * FROM `monster`<!--解读1. where标签2. 再写入相应的处理代码, 比如判断ids 是否为空.. if3. 如果ids不为空, 则使用foreach标签进行遍历4. collection="ids" 对应你的入参map的 key - ids5. item="id" 在遍历ids集合时, 每次取出的值, 对应的变量id6. open="(" 对应的就是sql (10,12,14) 的第一 (7. separator="," 遍历出来的多个值的 分隔符号8. close=")" 对应的就是sql (10,12,14)  的最后 )9. #{id} 对应的就是 item="id"--><if test="ids != null and ids != ''"><where>`id` IN<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach></where></if>
</select>

3.测试MonsterAnnotationTest

@Test
public void findMonsterById_forEach() {Map<String, Object> map = new HashMap<>();//map.put("ids", Arrays.asList(10, 12));List<Monster> monsters = monsterMapper.findMonsterById_forEach(map);for (Monster monster : monsters) {System.out.println("monster--" + monster);}if (sqlSession != null) {sqlSession.close();}System.out.println("查询成功");
}

trim标签应用实例[使用较少]

trim可以替换一些关键字. 要求: 按名字和年龄查询妖怪, 如果sql语句开头有 and | or 就替换成 where

1.修改MonsterMapper.java, 增加方法接口

public interface MonsterMapper {//trim标签的使用public List<Monster> findMonsterByName_Trim(Map<String, Object> map);
}

2.修改MonsterMapper.xml

<!--
1.配置/实现public List<Monster> findMonsterByName_Trim(Map<String, Object> map);
2.按名字和年龄查询妖怪, 如果sql语句开头有 and | or 就替换成 where
3.分析: 如果要实现这个功能, 其实使用where标签 [加入where 同时会去掉多余的and]
4.trim prefix="WHERE" prefixOverrides="and|or|zzw" 如果子句的开头为 "AND" 或 "OR" 或 "zzw"
, 就去除
-->
<select id="findMonsterByName_Trim" parameterType="map" resultType="Monster">SELECT * FROM `monster`<trim prefix="WHERE" prefixOverrides="and|or|zzw"><if test="name != null and name != ''">and `name` = #{name}</if><if test="age != null and age != ''">AND `age` > #{age}</if></trim>
</select>

3.测试MonsterAnnotationTest

@Test
public void findMonsterByName_Trim() {Map<String, Object> map = new HashMap<>();map.put("age", 30);map.put("name", "牛魔王");List<Monster> monsters = monsterMapper.findMonsterByName_Trim(map);for (Monster monster : monsters) {System.out.println("monster--" + monster);}if (sqlSession != null) {sqlSession.close();}System.out.println("操作成功");
}

set标签应用实例[重点]

●需求: 请对指定id的妖怪进行 修改, 如果没有设置新的属性, 则保存原来的值
- 先回顾传统的方式是如何处理的? -> 麻烦
- 使用set标签搞定

1.修改MonsterMapper.java, 增加方法接口

public interface MonsterMapper {//测试set标签public void updateMonster_set(Map<String, Object> map);
}

2.修改MonsterMapper.xml

<!--
1.配置/实现public void updateMonster_set(Map<String, Object> map);
2.请对指定id的妖怪进行 修改, 如果没有设置新的属性, 则保存原来的值
3.入参要根据sql语句来配合 map [age-10, email-'9789@qq.com'...]
4.set标签会处理多余的 ,
-->
<update id="updateMonster_set" parameterType="map">UPDATE `monster`<set><if test="age != null and age != ''">`age` = #{age},</if><if test="birthday != null and birthday != ''">`birthday` = #{birthday},</if><if test="email != null and email != ''">`email` = #{email},</if><if test="name != null and name != ''">`name` = #{name},</if><if test="gender != null and gender != ''">`gender` = #{gender},</if><if test="salary != null and salary != ''">`salary` = #{salary},</if></set>WHERE `id` = #{id}
</update>

3.测试MonsterAnnotationTest

@Test
public void updateMonster_set() {Map<String, Object> map = new HashMap<>();map.put("id", 5);//map.put("name", "牛魔王6");//map.put("age", 18);//map.put("birthday", "2000-10-15 12:12:12");monsterMapper.updateMonster_set(map);//增删改需要提交事务if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("修改成功");
}

课后练习

自己创建个新的项目完成.
● 要求属性
1. 编号- id
2. 外号 -nickname
3. 本领 - skill
4. 排行 - rank
5. 薪水 - salary
6. 入伙日期 - days (要求可以保存 年-月-日 时:分:秒)

● 完成功能
1. 创建表hero
2. 编写方法, 添加hero记录 [方法就在HeroMapper.xml配置] ➡️
3. 编写方法: 查询rank大于 10 的所有hero, 如果输入的rank 不大于 0, 则输出所有hero ➡️
4. 编写方法: 查询rank3, 6, 8[rank可变] 的hero ➡️
5. 编写方法: 修改hero信息, 如果没有设置新的属性值, 则保持原来的值 ➡️
6. 编写方法: 可以根据id查询hero, 如果没有传入id, 就返回所有hero ➡️
7. 自己完成, 会有新的体会.

● 环境准备
1.新建hero

USE mybatis;
CREATE TABLE `hero` (
`id` INT NOT NULL AUTO_INCREMENT,
`nickname` VARCHAR(255) NOT NULL,
`skill` VARCHAR(255) NOT NULL,
`rank` TINYINT NOT NULL,
`salary` DOUBLE NOT NULL,
`days` TIMESTAMP NOT NULL,
PRIMARY KEY(id)
)CHARSET=utf8

2.在原来的mybatis项目中, 新建homework-hero子项目 [参考]

3.新建Module后, 先创建需要的包, 再将需要的文件 / 资源拷贝过来(这里我们拷贝com.zzw.entity.Hero.java, resources/jdbc.propertiesmybatis-config.xml)

@Getter
@Setter
@ToString
public class Hero {private Integer id;private String nickname;private String skill;private Integer rank;private Double salary;private Date days;
}

4.拷贝com.zzw.mapper.HeroMapper.java接口, com.zzw.mapper.HeroMapper.xmlcom.zzw.mapper.HeroMapperTest.java, 做一个比较 干净的讲解环境

编写方法: 添加hero记录 ⬆️
1.HeroMapper

public interface HeroMapper {//添加hero记录public void addHero(Hero hero);
}

2.HeroMapper.xml

<mapper namespace="com.zzw.mapper.HeroMapper"><!--1.配置/实现public void addHero(Hero hero)2.添加hero记录--><insert id="addHero" parameterType="Hero">INSERT INTO `hero` (`nickname`, `skill`, `rank`, `salary`, `days`)VALUES (#{nickname}, #{skill}, #{rank}, #{salary}, #{days});</insert>
</mapper>

3.测试HeroMapperTest

public class HeroMapperTest {//属性private SqlSession sqlSession;private HeroMapper heroMapper;//编写方法完成初始化@Beforepublic void init() {sqlSession = MyBatisUtils.getSqlSession();heroMapper = sqlSession.getMapper(HeroMapper.class);System.out.println("heroMapper=" + heroMapper.getClass());}@Testpublic void addHero() {Hero hero = new Hero();hero.setNickname("花和尚");hero.setSkill("倒拔垂杨柳");hero.setRank(13);hero.setSalary(7500.0);hero.setDays(new Date());heroMapper.addHero(hero);//增删改需要提交事务if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("操作成功");}

编写方法: 查询rank大于 10 的所有hero, 如果输入的rank 不大于 0, 则输出所有hero ⬆️
1.HeroMapper

public interface HeroMapper {//查询rank大于 10 的所有hero, 如果输入的rank 不大于 0, 则输出所有heropublic List<Hero> findHeroByRank(Map<String, Object> map);
}

2.HeroMapper.xml

<mapper namespace="com.zzw.mapper.HeroMapper"><!--1.配置/实现public void findHeroByRank(HashMap<String, Object> map);2.查询rank大于 10 的所有hero, 如果输入的rank 不大于 0, 则输出所有hero--><select id="findHeroByRank" parameterType="map" resultType="Hero">SELECT * FROM `hero` WHERE 1 = 1<if test="rank > 0">AND `rank` > #{rank}</if></select>
</mapper>

3.测试HeroMapperTest

public class HeroMapperTest {//属性private SqlSession sqlSession;private HeroMapper heroMapper;//编写方法完成初始化@Beforepublic void init() {sqlSession = MyBatisUtils.getSqlSession();heroMapper = sqlSession.getMapper(HeroMapper.class);System.out.println("heroMapper=" + heroMapper.getClass());}@Testpublic void findHeroByRank() {Map<String, Object> map = new HashMap<>();map.put("rank", 10);List<Hero> heroes = heroMapper.findHeroByRank(map);for (Hero hero : heroes) {System.out.println("hero--" + hero);}//关闭连接if (sqlSession != null) {sqlSession.close();}System.out.println("查询成功");}

编写方法: 查询rank 为 3, 6, 8[rank可变] 的hero ⬆️
1.HeroMapper

public interface HeroMapper {//查询rank 为 3, 6, 8[rank可变] 的heropublic List<Hero> findHeroByRank_choose(Map<String, Object> map);
}

2.HeroMapper.xml

<mapper namespace="com.zzw.mapper.HeroMapper"><!--1.配置/实现public List<Hero> findHeroByRank_choose(Map<String, Object> map);2.查询rank 为 3, 6, 8[rank可变] 的hero3.入参map k-v key-ranks 值 List - [4, 12, 13]--><select id="findHeroByRank_choose" parameterType="map" resultType="Hero">SELECT * FROM `hero`<!--解读1.where标签2.对ranks是否为空做判断3.如果ranks不为空, 则使用foreach做判断4.collection="ranks" 对应入参map 的key5.item="rank" 在遍历ranks集合时, 每次取出的值, 叫做变量rank6.open="(" 对应的就是sql (4, 12, 13) 第一(7.separator="," 遍历出来的多个值的 分隔符号8.close=")" 对应的就是sql (4, 12, 13) 最后)9.#{rank} 对应的就是 item="rank"--><where><if test="ranks != null and ranks != ''">`rank` IN<foreach collection="ranks" item="rank" open="(" separator="," close=")">#{rank}</foreach></if></where></select>
</mapper>

3.测试HeroMapperTest

public class HeroMapperTest {//属性private SqlSession sqlSession;private HeroMapper heroMapper;//编写方法完成初始化@Beforepublic void init() {sqlSession = MyBatisUtils.getSqlSession();heroMapper = sqlSession.getMapper(HeroMapper.class);System.out.println("heroMapper=" + heroMapper.getClass());}@Testpublic void findHeroByRank_choose() {Map<String, Object> map = new HashMap<>();map.put("ranks", Arrays.asList(4, 12, 13));List<Hero> heroes = heroMapper.findHeroByRank_choose(map);for (Hero hero : heroes) {System.out.println("hero--" + hero);}if (sqlSession != null) {sqlSession.close();}System.out.println("查询成功");}

编写方法: 修改hero信息, 如果没有设置新的属性值, 则保持原来的值 ⬆️
1.HeroMapper

public interface HeroMapper {//修改hero信息, 如果没有设置新的属性值, 则保持原来的值public void updateHeroById_set(Hero hero);
}

2.HeroMapper.xml

<mapper namespace="com.zzw.mapper.HeroMapper"><!--1.配置/实现public void updateHeroById_set(Hero hero);2.修改hero信息, 如果没有设置新的属性值, 则保持原来的值--><update id="updateHeroById_set" parameterType="hero">UPDATE `hero`<set><if test="nickname != null and nickname != ''">`nickname` = #{nickname},</if><if test="rank != null and rank != ''">`rank` = #{rank},</if><if test="skill != null and skill != ''">`skill` = #{skill},</if><if test="salary != null and salary != ''">`salary` = #{salary},</if><if test="days != null and days != ''">`days` = #{days},</if></set>WHERE id = #{id}</update>
</mapper>

3.测试HeroMapperTest

public class HeroMapperTest {//属性private SqlSession sqlSession;private HeroMapper heroMapper;//编写方法完成初始化@Beforepublic void init() {sqlSession = MyBatisUtils.getSqlSession();heroMapper = sqlSession.getMapper(HeroMapper.class);System.out.println("heroMapper=" + heroMapper.getClass());}@Testpublic void updateHeroById_set() {Hero hero = new Hero();hero.setNickname("豹子头");hero.setRank(5);hero.setSalary(120000.0);hero.setId(4);heroMapper.updateHeroById_set(hero);//增删改需要提交事务if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("操作成功");}

编写方法: 可以根据id查询hero, 如果没有传入id, 就返回所有hero ⬆️
1.HeroMapper

public interface HeroMapper {//可以根据id查询hero, 如果没有传入id, 就返回所有heropublic List<Hero> findHeroById(@Param(value = "id") Integer id);
}

2.HeroMapper.xml

<mapper namespace="com.zzw.mapper.HeroMapper"><!--1.配置/实现public List<Hero> findHeroById(@Param(value = "id") Integer id);2.可以根据id查询hero, 如果没有传入id, 就返回所有hero--><select id="findHeroById" parameterType="Integer" resultType="Hero">SELECT * FROM `hero`<choose><when test="id != null and id != ''">WHERE `id` = #{id}</when></choose></select>
</mapper>

3.测试HeroMapperTest

public class HeroMapperTest {//属性private SqlSession sqlSession;private HeroMapper heroMapper;//编写方法完成初始化@Beforepublic void init() {sqlSession = MyBatisUtils.getSqlSession();heroMapper = sqlSession.getMapper(HeroMapper.class);System.out.println("heroMapper=" + heroMapper.getClass());}@Testpublic void findHeroById() {List<Hero> heroes = heroMapper.findHeroById(1);for (Hero hero : heroes) {System.out.println("hero--" + hero);}if (sqlSession != null) {sqlSession.close();}System.out.println("查询成功");}

接下来我们学习, mybatis映射关系在这里插入图片描述
💐💐💐💐💐💐💐💐给个赞, 点个关注吧, 各位大佬!💐💐💐💐💐💐💐💐

💐💐💐💐💐💐💐💐祝各位2024年大吉大运💐💐💐💐💐💐💐💐💐💐
请添加图片描述

相关文章:

MyBatis系列四: 动态SQL

动态SQL语句-更复杂的查询业务需求 官方文档基本介绍案例演示if标签应用实例where标签应用实例choose/when/otherwise应用实例foreach标签应用实例trim标签应用实例[使用较少]set标签应用实例[重点]课后练习 上一讲, 我们学习的是 MyBatis系列三: 原生的API与配置文件详解 现在…...

Jenkins构建 Maven项目(微服务)并自动发布

前面讲了docker 安装Jenkins和gitlab代码管理工具&#xff0c;接下来我们讲一下Jenkins怎么构建 Maven项目。 1. 首先Jenkins配置下面3中工具类 首先是在本地安装三个jenkins自动配置相关的工具 1.1 JDK 由于我们使用docker来启动jenkins&#xff0c;其自带有jdk&#xff0c;…...

简单易用的多功能图床Picsur

什么是 Picsur &#xff1f; Picsur 是一款易于使用、可自行托管的图片分享服务&#xff0c;类似于 Imgur&#xff0c;并内置转换功能。支持多种格式的图片&#xff0c;包括 QOI、JPG、PNG、WEBP&#xff08;支持动画&#xff09;、TIFF、BMP、GIF&#xff08;支持动画&#xf…...

数据库-查询语句习题

SELECT Sname 姓 名,year of birth: 出生年,YEAR(GETDATE())-Sage BIRTHYEAR,LOWER(SNAME) SNAME --起别名 没有特殊字符不需要引号&#xff0c;有特殊字符要加引号&#xff1b;别名&#xff08;解释作用显示给用户看&#xff09;用空格或as连接 FROM STUDENT; --消除重复行 DI…...

进程间通信以及线程的同步互斥机制

1.进程间通信机制 常用的六种通信机制&#xff1a; 管道、消息队列、共享内存、信号灯集、信号、Socket 管道&#xff08;Pipe&#xff09;和无名管道&#xff08;匿名管道&#xff09;&#xff1a; 管道是一种半双工的通信方式&#xff0c;数据只能单向流动&#xff0c;通常…...

优思学院|做车企的质量工程师转行跳槽能干嘛?

前言 质量工程师&#xff0c;是现代制造业和服务业中不可或缺的重要角色。他们负责制定和执行提高产品质量和优化业务流程的战略。这不仅涉及设立质量标准、开发测试系统&#xff0c;还包括记录生产过程中的问题并找到解决方案。尤其在汽车行业&#xff0c;由于对质量的高度要…...

ctfshow-web入门-命令执行(web53-web55)

目录 1、web53 2、web54 3、web55 1、web53 这里的代码有点不一样&#xff0c;说一下这两种的区别&#xff1a; &#xff08;1&#xff09;直接执行 system($c); system($c);这种方式会直接执行命令 $c 并将命令的输出直接发送到标准输出&#xff08;通常是浏览器&#xff…...

【INTEL(ALTERA)】make: nios2-swexample-create:未找到命令

目录 说明 解决方法 说明 由于外部内存接口英特尔 Stratix 10 FPGA IP 出现问题&#xff0c;如果在 Windows 平台上使用英特尔 Quartus Prime Pro Edition Software v20.4 或更早版本的"使用软Nios处理器进行片上调试"选项&#xff0c;编译Nios II 片上处理器调试…...

一周刷爆leetcode!(b站视频)

文章目录 一、排序思想的题目二、使用步骤1. 一、排序思想的题目 跟着b站一周刷爆leetcode这个视频开始刷一下leetcode的题目 进行一下记录啥的 二、使用步骤 1. 315. 计算右侧小于当前元素的个数 代码如下&#xff1a; 写了一下暴力解法&#xff0c;没有通过 使用归并排序…...

1.xshell传不了文件输出0000如何解决.....2.k8s中metalLB文件内容

xshell传不了文件输出0000如何解决 centos版本 1,因为没有工具下载即可 yum -y install lrzszk8s中metalLB文件内容 2.metalLB文件内容 cat metallb-native.yaml apiVersion: v1 kind: Namespace metadata:labels:pod-security.kubernetes.io/audit: privilegedpod-securit…...

01- ES6语法

1.ES6相关概念 1.1 什么是ES6 1.1.1 简介 ES6&#xff0c; 全称 ECMAScript 6.0 &#xff0c;是 JavaScript 的下一个版本标准&#xff0c;2015.06 发版。 ES6 主要是为了解决 ES5 的先天不足&#xff0c;比如 JavaScript 里并没有类的概念&#xff0c;但是目前浏览器的 Ja…...

STM32MP135裸机编程:配置RCC,修改主频到1GHz

0 工具准备 STM32CubeMX v6.11.1 STM32CubeIDE v1.15 STM32CubeProgrammer v2.16.0 STM32MP13xx参考手册 STM32MP13勘误手册 STM32MP135AD数据手册 正点原子stm32MP135开发板 1 确认时钟源 本例使用的时钟源均由外部晶振提供&#xff0c;分别是24MHz的HSE、32.768KHz的LSE。原…...

观察 jvm 运行时数据区内存大小(native memory tracking)

jvm 运行时数据区 jvm 运行时数据区包括且不限于以下几个部分: 堆(heap): 用于存储对象实例和数组。堆内存的分配和释放由垃圾回收器进行管理。方法区(method area): 用于存储类的信息、静态变量、常量等。jdk 8 后方法区位于 metaspace。虚拟机栈(vm stack): 用于存储方法的…...

【论文阅读】-- 时间空间化:用于深度分类器训练的可扩展且可靠的时间旅行可视化

Temporality Spatialization: A Scalable and Faithful Time-Travelling Visualization for Deep Classifier Training 摘要1 引言2 动机3 问题定义4 方法论4.1 时空复合体4.2 复数约简 5 实验6 相关工作7 结论参考文献 摘要 时间旅行可视化回答了深度分类器的预测是如何在训练…...

Windows系统部署本地SQL_Server指引

Windows系统部署本地SQL_Server指引 此指引文档环境为Windows10系统&#xff0c;部署SQL_Server 2019为例&#xff0c;同系列系统软件安装步骤类似。 一、部署前准备&#xff1b; 下载好相关镜像文件&#xff1b;设备系统启动后&#xff0c;将不必要的软件停用&#xff0c;避…...

Aptos Builder Jam 亚洲首站|议程公布,无限畅想 Aptos 生态未来

作为一个新兴的 Layer1 公链&#xff0c;Aptos 自诞生之日起的理想便是 “A Layer 1 for everyone” 当 Web3 深陷熊市阴影之时&#xff0c;Aptos 奋力为开发者找到了全新的技术路径&#xff0c;正有 200 项目正在开发&#xff0c;并且已有大量 DeFi 项目落实部署工作&#xff…...

Vue3使用component动态展示组件

前言&#xff1a; 最近在研究gitHub中的一个项目并将与自己之前完成的项目进行结合&#xff0c;其中有一个功能就是需要使用根据不同的字段&#xff0c;渲染不同的组件&#xff0c;查阅资料发现可以使用component完成这个功能&#xff0c;在实现的过程中也会遇见一些坑&#x…...

嵌入式中间件_2.嵌入式中间件的分类

1.中间件的分类 中间件的范围十分广泛&#xff0c;针对不同的应用需求涌现出了多种各具特色的中间件产品。因此&#xff0c;在不同的角度或不同的层次上&#xff0c;对中间件的分类也会有所不同。 根据IDC在1998年对中间件进行的分类&#xff0c;把中间件分为终端仿真/屏幕转换…...

论文精读——KAN

目录 1.研究背景 2.关键技术 2.1 原始公式 2.2 KAN结构 2.3 缩放定律 3.技术扩展 4.模型效果 5.相关讨论 6.总结 文章标题&#xff1a;《KAN: Kolmogorov–Arnold Networks》 文章地址&#xff1a; KAN: Kolmogorov-Arnold Networks (arxiv.org)https://arxiv.org/a…...

全国产城市轨道交通运营公安AI高清视频监控系统

方案简介 城市轨道交通运营公安高清视频监控系统解决方案针对运营部门和公安部门的安保需求&#xff0c;选用华维视讯的各类前端和视频编解码、控制产品&#xff0c;通过统一平台提供视频监控服务和智能应用&#xff0c;满足轨道交通运营业主客运组织和抢险指挥的需求&#xff…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...