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.动态 SQL
是 MyBatis
的强大特性之一
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
[类似java
的 switch
语句, 注意是单分支]
4.foreach
[类似 in
]
5.trim
[替换关键字 / 定制元素的功能]
6.set
[在update
的 set
中, 可以保证进入 set
标签的属性被修改, 而没有进入set
的, 保持原来的值]
案例演示
1.在原来的mybatis
项目中, 新建dynamic-sql
子项目 [参考], 演示动态SQL
的使用
2.新建Module
后, 先创建需要的包, 再将需要的文件 / 资源拷贝过来(这里我们拷贝Monster.java
, resources/jdbc.properties
和 mybatis-config.xml
)
3.拷贝MonsterMapper.java
, MonsterMapper.xml
和 MonsterMapperTest.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标签应用实例
●需求: 查询id
为 20, 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. 编写方法: 查询rank
为 3, 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.properties
和 mybatis-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.xml
和 com.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代码管理工具,接下来我们讲一下Jenkins怎么构建 Maven项目。 1. 首先Jenkins配置下面3中工具类 首先是在本地安装三个jenkins自动配置相关的工具 1.1 JDK 由于我们使用docker来启动jenkins,其自带有jdk,…...

简单易用的多功能图床Picsur
什么是 Picsur ? Picsur 是一款易于使用、可自行托管的图片分享服务,类似于 Imgur,并内置转换功能。支持多种格式的图片,包括 QOI、JPG、PNG、WEBP(支持动画)、TIFF、BMP、GIF(支持动画…...
数据库-查询语句习题
SELECT Sname 姓 名,year of birth: 出生年,YEAR(GETDATE())-Sage BIRTHYEAR,LOWER(SNAME) SNAME --起别名 没有特殊字符不需要引号,有特殊字符要加引号;别名(解释作用显示给用户看)用空格或as连接 FROM STUDENT; --消除重复行 DI…...

进程间通信以及线程的同步互斥机制
1.进程间通信机制 常用的六种通信机制: 管道、消息队列、共享内存、信号灯集、信号、Socket 管道(Pipe)和无名管道(匿名管道): 管道是一种半双工的通信方式,数据只能单向流动,通常…...

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

ctfshow-web入门-命令执行(web53-web55)
目录 1、web53 2、web54 3、web55 1、web53 这里的代码有点不一样,说一下这两种的区别: (1)直接执行 system($c); system($c);这种方式会直接执行命令 $c 并将命令的输出直接发送到标准输出(通常是浏览器ÿ…...
【INTEL(ALTERA)】make: nios2-swexample-create:未找到命令
目录 说明 解决方法 说明 由于外部内存接口英特尔 Stratix 10 FPGA IP 出现问题,如果在 Windows 平台上使用英特尔 Quartus Prime Pro Edition Software v20.4 或更早版本的"使用软Nios处理器进行片上调试"选项,编译Nios II 片上处理器调试…...
一周刷爆leetcode!(b站视频)
文章目录 一、排序思想的题目二、使用步骤1. 一、排序思想的题目 跟着b站一周刷爆leetcode这个视频开始刷一下leetcode的题目 进行一下记录啥的 二、使用步骤 1. 315. 计算右侧小于当前元素的个数 代码如下: 写了一下暴力解法,没有通过 使用归并排序…...
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, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。 ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念,但是目前浏览器的 Ja…...

STM32MP135裸机编程:配置RCC,修改主频到1GHz
0 工具准备 STM32CubeMX v6.11.1 STM32CubeIDE v1.15 STM32CubeProgrammer v2.16.0 STM32MP13xx参考手册 STM32MP13勘误手册 STM32MP135AD数据手册 正点原子stm32MP135开发板 1 确认时钟源 本例使用的时钟源均由外部晶振提供,分别是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系统,部署SQL_Server 2019为例,同系列系统软件安装步骤类似。 一、部署前准备; 下载好相关镜像文件;设备系统启动后,将不必要的软件停用,避…...

Aptos Builder Jam 亚洲首站|议程公布,无限畅想 Aptos 生态未来
作为一个新兴的 Layer1 公链,Aptos 自诞生之日起的理想便是 “A Layer 1 for everyone” 当 Web3 深陷熊市阴影之时,Aptos 奋力为开发者找到了全新的技术路径,正有 200 项目正在开发,并且已有大量 DeFi 项目落实部署工作ÿ…...
Vue3使用component动态展示组件
前言: 最近在研究gitHub中的一个项目并将与自己之前完成的项目进行结合,其中有一个功能就是需要使用根据不同的字段,渲染不同的组件,查阅资料发现可以使用component完成这个功能,在实现的过程中也会遇见一些坑&#x…...
嵌入式中间件_2.嵌入式中间件的分类
1.中间件的分类 中间件的范围十分广泛,针对不同的应用需求涌现出了多种各具特色的中间件产品。因此,在不同的角度或不同的层次上,对中间件的分类也会有所不同。 根据IDC在1998年对中间件进行的分类,把中间件分为终端仿真/屏幕转换…...

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

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

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...