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高清视频监控系统
方案简介 城市轨道交通运营公安高清视频监控系统解决方案针对运营部门和公安部门的安保需求,选用华维视讯的各类前端和视频编解码、控制产品,通过统一平台提供视频监控服务和智能应用,满足轨道交通运营业主客运组织和抢险指挥的需求ÿ…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
