当前位置: 首页 > 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…...

python连接mysql数据库、FastAPI、mysql-connector-python

方法工具一、FastAPI 建议使用fast api中的pymysql pip3 install fastapi pip3 install pydantic pip3 install "uvicorn[standard]" pip3 中的3是 Python 3 版本的包管理器命令&#xff0c;用于安装和管理 Python 3 版本的第三方库。在某些系统中&#xff0c;同时…...

【idea】解决springboot项目中遇到的问题

一、Maven报错Could not find artifact com.mysql:mysql-connector-j:pom:unknown in aliyunmaven解决及分析 报错 创建springboot项目&#xff0c;勾选数据库驱动&#xff0c;springboot版本为3&#xff0c;现在改成了2.7.2&#xff0c;Maven就发生了报错Could not find art…...

ubuntu22.04禁止自动休眠的几种方式

在Ubuntu 20.04中&#xff0c;您可以通过以下几种方式禁用自动休眠功能&#xff1a; 使用systemd设置: sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 修改/etc/systemd/logind.conf文件: sudo nano /etc/systemd/logind.conf 找…...

智能网站管理系统

智能网站管理系统&#xff0c;即智能化的网站管理工具&#xff0c;是为了提高网站管理效率和简化操作流程而开发的一种软件系统。它集合了各种先进的技术和功能&#xff0c;为网站管理员提供了一套强大而可靠的解决方案。 智能网站管理系统的核心功能是网站内容管理。传统的网站…...

Android Service学习笔记

1、Service介绍 Android Service&#xff08;服务&#xff09;是 Android 四大组件之一&#xff0c;主要作用是执行后台操作。它是一个后台运行的组件&#xff0c;执行长时间运行且不需要用户交互的任务。即使应用被销毁也依然可以工作。 Service并不是运行在一个独立的进程当…...

amr文件怎么转换成mp3?超好用的四种转换方法介绍!

amr文件怎么转换成mp3&#xff1f;在当今数字化时代&#xff0c;音频格式的多样性给我们带来了更广泛的选择&#xff0c;其中AMR格式就是其中之一&#xff0c;AMR格式在录音和通话领域得到广泛应用&#xff0c;但与此同时&#xff0c;它也存在一些挑战和局限性&#xff0c;尽管…...

翻转数位00

题目链接 翻转数位 题目描述 注意点 可以将一个数位从0变为1找出能够获得的最长的一串1的长度&#xff08;必须是连续的&#xff09; 解答思路 参照题解使用动态规划解决本题&#xff0c;对于任意一个位置i&#xff0c;dp[i][0]表示到达且包含第i位不翻转0最长1的长度&…...

工具:安装R语言的R包的各种方法

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 R语言提供的大量R包为众多研究者提供了足够的工具&#xff0c;但是如何安装R包是很多人在使…...

注意力机制和Transformer模型各部分功能解释

文章目录 Transformer1、各部分功能解释2、通过例子解释a.输入预处理位置编码b.Encoder 的处理c.Decoder的输入Decoder的工作流程d.输出预测总结 Attention代码和原理理解 Transformer 运行机理&#xff1a; &#xff08;1&#xff09;假设我们需要进行文本生成任务。我们将已…...

短路是怎么形成的

1. 短路分为电源短路和用电器短路。 电源短路&#xff1a;电流不经过任何用电器&#xff0c;直接由正极经过导线流向负极&#xff0c;由于电源内阻很小&#xff0c;导致短路电流很大&#xff0c;特别容易烧坏电源。 用电器短路&#xff1a;也叫部分电路短路&#xff0c;即一根…...

网站建设与管理总结报告/如何优化关键词

刷题主页 在上次打劫完一条街道之后和一圈房屋后&#xff0c;小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为“根”。 除了“根”之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地…...

南通制作手机网站/互联网公司排名100强

最近在做一个字体编辑的软件&#xff0c;其中需要用 TextArea 接受用户输入&#xff0c;并转换成 Text 保留在 图片上&#xff0c;碰到了字符自动换行的问题&#xff0c;开始是在 TextArea 的text 里 追加 "\n" , 但后来找到了一种更简单的办法&#xff0c;就是动态控…...

沈阳市网站建设/公众号推广方案

2019独角兽企业重金招聘Python工程师标准>>> 安装环境&#xff1a;Centos jdk 1.7 nexus-2.x nexus (maven私服安装包)下载地址是http://www.sonatype.org/nexus/go nexus 版本小提示&#xff1a; 安装包解压后会在同级目录中&#xff0c;出现两个文件夹&#xff…...

制作京东网站建设/今天的新闻发布会

如果你真的就看完了《 packetdrill框架点滴剖析以及TCP重传的一个细节》&#xff0c;我觉得你应该有一个疑问&#xff0c;那就是RH发行版使用的2.6.32内核真的使用了PRR降窗算法吗&#xff1f;为此&#xff0c;我把故事再撸一遍。按照标准的2.6.32内核&#xff0c;第一次收到SA…...

腾宁科技做网站399元全包/如何做seo搜索引擎优化

Java 设计模式 Prototype 原型 模式 Prototype 模式用于不能根据类来来生产实例时&#xff0c;而根据现有的实例来生成新的实例。 原型&#xff1a;负责定义用于复制现有实例来生成新实例的方法。具体的原型&#xff1a;负责实现复制现有实例并生成新实例的方法。使用者&#x…...

国外网站博客网站也可以做引流/seo网站排名优化快速排

下面是mongodb的一些基本概念&#xff1a; 文档是MongoDB中数据的基本单元&#xff0c;类似关系数据库中的行。集合&#xff0c;是存储文档的容器&#xff0c;类似关系数据库中的表。MongoDB的单个实例容纳多个数据库&#xff0c;每个数据库都有自己的集合和权限。每一个文档都…...