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高清视频监控系统
方案简介 城市轨道交通运营公安高清视频监控系统解决方案针对运营部门和公安部门的安保需求,选用华维视讯的各类前端和视频编解码、控制产品,通过统一平台提供视频监控服务和智能应用,满足轨道交通运营业主客运组织和抢险指挥的需求ÿ…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
