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

MyBatis-常用SQL操作

一、动态SQL

1.概述】

1.1动态SQL: 是 MyBatis 的强大特性之一,解决拼接动态SQL时候的难题,提高开发效

1.2分类:

  • if

  • choose(when,otherwise)

  • trim(where,set)

  • foreach

2.if

2.1 做 where 语句后面条件查询的,if 语句是可以拼接多条的。

2.2 需求:根据学生name 做模糊查询

代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wjcoder.mapper.StudentMapper"><select id="selectLikeName" resultType="cn.wjcoder.domain.Student">select id,name,agefrom studentwhere age = 20<if test="name != null">and name like concat(#{name},'%')</if></select>
</mapper>
public interface StudentMapper {List<Student> selectLikeName(String name);
}

3.choose、when、otherwise

3.1概述:

不想使用所有条件时候,他们可以从多个条件中选择一个使用,相当于java 的 if ... else if ... else。

3.2需求:按年龄20查找,如果id 不空按id 查找,名字不空按名字查找,否则按班级id 查找

<select id="selectChoose" resultType="cn.wjcoder.domain.Student">select <include refid="baseSql"/>from studentwhere age = 20<choose><when test="id != null">and id = #{id}</when><when test="name != null">and name like concat(#{name},'%')</when><otherwise>and class_id = #{clsTd}</otherwise></choose></select>
 List<Student> selectChoose(@Param("id") Long id,
@Param("name") String name,@Param("clsId") Long clsId);

3.3不传 id 参数,传入name = 'z'  

3.4不传入 id 参数和 name 参数

4.trim、where、set

4.1trim

  • trim : 用于去掉或者添加标签中的内容
  • prefix:可以在 trim 标签内容前面添加内容

  • prefixOverrides:可以覆盖前面的某些内容  

  • suffix:在 trim 标签后面添加内容  

  • suffixOverrides:去掉 trim 标签内容最后面的值  

4.2where

  • where 后面直接跟 if  

  • age null  

  •  使用了 where 标签之后,解决了这些问题

4.3set

  • set 元素可以用于动态包含需要更新的列

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wjcoder.mapper.StudentMapper"><sql id="baseSql">id,name,age</sql><update id="updateSet">update student<set><if test="name != null">name =#{name},</if><if test="age != null">age = #{age},</if></set><where><if test="id != null">id = #{id}</if></where></update>
void updateSet(@Param("age") Integer age,@Param("name")String name,@Param("clsId") Long clsId,@Param("id")Long id);

5.foreach

  • foreach :用于对集合遍历。 动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)

<select id="selectForeach" resultType="cn.wjcoder.domain.Student">select * from student<where><foreach collection="ids" item="id" index="i" open="id in(" close=")" separator=",">#{id}</foreach></where></select>
List<Student> selectForeach(@Param("ids") List<Long> ids);

  • collection:传参的数组集合

  • item:遍历拿到的每一个元素

  • index:索引

  • open : foreach 标签内容的开始符

  • close : foreach 标签内容的结束符

  • separator:分隔符

  • 取值取的就是 item 的元素值

  • 注意:当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

6.script

  • script:要在带注解的映射器接口类中使用动态 SQL,可以使用 script 元素。

  • 使用注解操作 mybatis

需求:查询所有的学生信息,用注解方式实现

@Select("select * from student")List<Student> selectAll();

更新学生信息,使用 script 标签

@Update({"<script>","update student","  <set>","    <if test='name != null'>name=#{name},</if>","    <if test='age != null'>age=#{age},</if>","    <if test='clsId != null'>class_id=#{clsId},</if>","  </set>","where id=#{id}","</script>"})void updateStu(@Param("age") Integer age,@Param("name")String name,@Param("clsId") Long clsId,@Param("id")Long id);

7.bind

  • bind 元素允许你在 OGNL 表达式以外创建一个变量,并将其绑定到当前的上下文。

  • 需求:通过用户name 进行模糊查询

<select id="listLike" resultType="cn.sycoder.domain.Student"><bind name="ret" value="'%' + name + '%'"/>select * from studentwhere name like #{ret}</select>

二、MyBatis api

1.概述

*官方的不用

  • 用下面这种 

2.SqlSession

2.1概述:

通过这个接口SqlSession来执行命令,获取映射器实例和管理事务,SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对象包含创建 SqlSession 实例的各种方法。而 SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 创建的,它可以从 XML、注解或 Java 配置代码来创建 SqlSessionFactory。

2.2SqlSessionFactoryBuilder

  • 有 5 个 builder 方法
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)

2.3SqlSessionFactory

  • 获取方式
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);

  • 最终会将xml 配置文件,或者 properties 配置转换成一个 Configuration ,最后一个 build 方法接受一个 Configuration 实例。Configuration 类包含了对一个 SqlSessionFactory 实例你可能关心的所有内容。

  • Configuration 类信息

  • 提供了六个方法创建 SqlSession 的实例
SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();
  •  主要支持如下操作
    • 事务处理:你希望在 session 作用域中使用事务作用域,还是使用自动提交(auto-commit)?(对很多数据库和/或 JDBC 驱动来说,等同于关闭事务支持)

    • 数据库连接:你希望 MyBatis 帮你从已配置的数据源获取连接,还是使用自己提供的连接?

    • 语句执行:你希望 MyBatis 复用 PreparedStatement 和/或批量更新语句(包括插入语句和删除语句)吗?

  • 默认的 openSession() 方法没有参数,它会创建具备如下特性的 SqlSession:

    • 事务作用域将会开启(也就是不自动提交

    • 将由当前环境配置的 DataSource 实例中获取 Connection 对象。(mybatis-config.xml)

    • 事务隔离级别将会使用驱动或数据源的默认设置(mysql 默认REPEATABLE_READ)

    • 预处理语句不会被复用,也不会批量处理更新。

  • 如果你需要开启事务自动提交

    • autoCommit 可选参数传递 true 值即可开启自动提交功能

  • 如果你需要提供数据库隔离级别

    • 修改这个的值TransactionIsolationLevel ,提供了枚举

如果你需要修改执行类型

  • 修改ExecutorType值

    • ExecutorType.SIMPLE:该类型的执行器没有特别的行为。它为每个语句的执行创建一个新的预处理语句。

    • ExecutorType.REUSE:该类型的执行器会复用预处理语句。

    • ExecutorType.BATCH:该类型的执行器会批量执行所有更新语句,如果 SELECT 在多个更新中间执行,将在必要时将多条更新语句分隔开来,以方便理解。

2.4SqlSession

  • 语句执行方法:这些方法被用来执行定义在 SQL 映射 XML 文件中的 SELECT、INSERT、UPDATE 和 DELETE 语句。

    <T> T selectOne(String statement, Object parameter)
    <E> List<E> selectList(String statement, Object parameter)
    <T> Cursor<T> selectCursor(String statement, Object parameter)
    <K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
    int insert(String statement, Object parameter)
    int update(String statement, Object parameter)
    int delete(String statement, Object parameter)
  • RowBounds(可用于分页需求)

    int offset = 100;
    int limit = 25;
    RowBounds rowBounds = new RowBounds(offset, limit);
  • 立即批量更新方法(如果不调用这个方法,批处理不执行,只是缓存而已)

    List<BatchResult> flushStatements()
  • 事务控制方法

    void commit()
    void commit(boolean force)
    void rollback()
    void rollback(boolean force)
  • 本地缓存:Mybatis 使用到了两种缓存:

    • 本地缓存(local cache):每当一个新 session 被创建,MyBatis 就会创建一个与之相关联的本地缓存

    • 二级缓存(second level cache)

    • 清空本地缓存(一般不去动)

      void clearCache()
    • 确保 SqlSession 被关闭:如果没有使用新特性的方式,一定要finally手动关闭

      void close()

2.5使用映射器

  • 方法
<T> T getMapper(Class<T> type)
  • 自定义方法执行最终都是调用 mybatis 的方法实现
public interface AuthorMapper {// (Author) selectOne("selectAuthor",5);Author selectAuthor(int id);// (List<Author>) selectList(“selectAuthors”)List<Author> selectAuthors();// (Map<Integer,Author>) selectMap("selectAuthors", "id")@MapKey("id")Map<Integer, Author> selectAuthors();// insert("insertAuthor", author)int insertAuthor(Author author);// updateAuthor("updateAuthor", author)int updateAuthor(Author author);// delete("deleteAuthor",5)int deleteAuthor(int id);
}
  • 映射器注解

  • 映射注解示例

插入语句

@Insert("insert into table3 (id, name) values(#{nameId}, #{name})")
int insertTable3(Name name);

 查询语句

@Results(id = "userResult", value = {@Result(property = "id", column = "uid", id = true),@Result(property = "firstName", column = "first_name"),@Result(property = "lastName", column = "last_name")
})
@Select("select * from users where id = #{id}")
User getUserById(Integer id);

三、分页查询

1.概述

MyBatis 分页插件 PageHelper:是一款非常不错,并且企业用得很多的mybatis 分页插件

2.如何使用

2.1引入分页插件

导入 maven 依赖 pom

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.0</version>
</dependency>

2.2配置拦截插件

  • 在 spring 中配置

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 注意其他配置 --><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><!--使用下面的方式配置参数,一行配置一个 --><value>params=value1</value></property></bean></array></property>
</bean>
  • 在 MyBatis 配置 xml 中配置拦截器插件
<!--plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:properties?, settings?,typeAliases?, typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?, databaseIdProvider?, mappers?
-->
<plugins><!-- com.github.pagehelper为PageHelper类所在包名 --><plugin interceptor="com.github.pagehelper.PageInterceptor"><!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --><property name="param1" value="value1"/></plugin>
</plugins>

2.3分页插件参数介绍

pageNum : 当前页码,pageSize : 每页显示的数量,list : 分页后的集合数据,total : 总记录数,

pages : 总页数,prePage : 上一页,nextPage: 下一页。

2.4具体使用

  • 开启分页拦截查询
//①:开启分页功能,参数1是当前页码,参数是每页显示的条数
PageHelper.startPage(1, 2);
  • 执行查询
//②:开始执行结果,返回list
List<Student> list = mapper.selectAll();
Page page = (Page) list;
PageInfo<Student> info = new PageInfo<>(list);
System.out.println(list);

page 里面包含的属性

private int pageNum;
private int pageSize;
private long total;
private int pages;

四、实战SQL常用操作

1.插入时获取主键

1.1注解方式

1.2xml 配置的方式

<insert id="insertXml" useGeneratedKeys="true" keyProperty="id" keyColumn="id">insert into student values(null,#{name},#{age},#{classId})
</insert>

2.模糊查询

<select id="listLike1" resultType="cn.sycoder.domain.Student">select * from studentwhere name like concat('%',#{name},'%')
</select>
  • select * from student where name like ?

3.批量操作

3.1批量插入

  • 开启sqlSession 批处理 ExecutorType.BATCH,但是记得刷新 statements session.flushStatements();
try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH,true)) {StudentMapper mapper = session.getMapper(StudentMapper.class);Student student = new Student();mapper.insert(student);Student student1 = new Student();mapper.insert(student1);List<BatchResult> batchResults = session.flushStatements();} catch (Exception e) {e.printStackTrace();
}
  •  使用 foreach
<insert id="batchInsert" useGeneratedKeys="true" keyColumn="id" keyProperty="id">insert into student (name,age) values<foreach collection="list"  item="stu"  separator=",">(#{stu.name},#{stu.age})</foreach>
</insert>
int batchInsert(List<Student> list);

3.2批量删除

  • $(ids)

    @Delete("delete from student where id in(${ids})")
    int deleteBatch(String ids);
  • foreach

    <delete id="del">delete from student <where><foreach collection="ids"  item="id" index="i" open="id in(" close=")" separator=",">#{id}</foreach></where>
    </delete>

    3.3批量修改(用处不大)

  • 如果是给某一堆id 修改相同属性值,可以使用foreach

相关文章:

MyBatis-常用SQL操作

一、动态SQL 1.概述】 1.1动态SQL&#xff1a; 是 MyBatis 的强大特性之一&#xff0c;解决拼接动态SQL时候的难题&#xff0c;提高开发效 1.2分类&#xff1a; if choose(when,otherwise) trim(where,set) foreach 2.if 2.1 做 where 语句后面条件查询的,if 语句是可以…...

DSPE-PEG-TCO;磷脂-聚乙二醇-反式环辛烯科研用化学试剂简介

中文名称 磷脂-聚乙二醇-反式环辛烯 英文名称 DSPE-PEG-TCO 外观&#xff1a;粉末或半固体&#xff0c;取决于分子量。 溶剂&#xff1a;溶于大部分有机溶剂&#xff0c;如&#xff1a;DCM、DMF、DMSO、THF等等。在水中有很好的溶解性 稳定性&#xff1a;冷藏保存&#xff…...

华为OD机试真题Java实现【最小施肥机能效】真题+解题思路+代码(20222023)

最小施肥机能效 某农场主管理了一大片果园,fields[i]表示不同果林的面积,单位:( m 2 m^2 m2),现在要为所有的果林施肥且必须在 n 天之内完成,否则影响收成。 小布是果林的工作人员,他每次选择一片果林进行施肥,且一片果林施肥完后当天不再进行施肥作业。 假设施肥机的…...

【问题记录】【排查问题的方法总结】vue3中数据失去响应式?为什么数据变了,视图只更新了一次就不再更新了?

一、问题概述&#xff1a; 持续请求的数据变动之后&#xff0c;控制台输出绑定的响应式变量 mapObj 的确变了&#xff0c;但是视图上只更新了一次&#xff0c;后续就不再更新了。 二、排查过程&#xff1a; PC上用定时器setInterval模拟数据(全是小于0的数据)更新&#xff0…...

基于遗传算法的柔性生产调度研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

Heroku的12条准则

I. Codebase One codebase tracked in revision control, many deploys 要有代码仓库&#xff0c;多版本控制&#xff0c;如使用git来管理代码仓库。 II. Dependencies Explicitly declare and isolate dependencies 明确声明依赖&#xff0c;隔离依赖。强依赖往往会导致连…...

Qt图片定时滚动

目录参考结构PicturePlay.promain.cpppictureplay.hpictureplay.cpppictureplay.ui效果参考 Qt图片浏览器 QT制作一个图片播放器 Qt中自适应的labelpixmap充满窗口后&#xff0c;无法缩小只能放大 可以显示jpg、jpeg、png、bmp。可以从电脑上拖动图到窗口并显示出来或者打开文件…...

深度学习引言

动手学深度学习pytorch版-笔记原文链接日常生活中的机器学习机器学习中的关键组件数据模型目标函数优化算法各种机器学习问题监督学习回归分类标记问题搜索推荐系统序列学习无监督学习与环境互动强化学习特点小结原文链接 动手学深度学习pytorch中文版 日常生活中的机器学习 …...

ESP32 WIFI使用介绍

ESP32 WIFI 概述 WIFI 库支持配置及监控 ESP32 WIFI 连网功能。支持配置 station 模式&#xff08;即 STA 模式或 WIFI 客户端模式&#xff09;&#xff0c;此时 ESP32 连接到接入点&#xff08;AP&#xff09;。AP 模式&#xff08;即 soft-AP 模式或接入点模式&#xff09;&…...

JavaEE简单实例——MyBatis的一对一映射的嵌套查询的简单介绍和基础配置

简单介绍&#xff1a; 在前一章我们介绍了关于MyBatis的多表查询的时候的对应关系&#xff0c;其中有三种对应关系&#xff0c;分别是一对一&#xff0c;一对多&#xff0c;多对多的关系。如果忘记了这三种方式的对应形式可以去前面看看&#xff0c;一定要记住这三种映射关系的…...

详解指针(进阶版)(1)

前言&#xff1a;总篇章分为&#xff08;1&#xff09;和&#xff08;2&#xff09;&#xff0c;本篇内容包括&#xff1a;指针数组&#xff0c;数组指针&#xff0c;&数组名与数组名的区分 数组传参 &#xff0c;函数指针&#xff0c;函数指针数组 part 1&#xff1a;指…...

【OJ】盐荒子孙

&#x1f4da;Description: 盐体图 盐是对人类生存具有重要意义的物质之一。当中国古人从肉食为主转向谷食为主的时候&#xff0c;吃盐的需求就发生了&#xff0c;因为动物血肉里面包含有足够人体所需的盐分&#xff0c;而谷 物本身不包含盐分。在长达几十万年的旧石器时代&…...

Java数据结构 —— 手写线性结构(稀疏数组、栈、队列、链表)

目录 稀疏数组 顺序表 链表 单向顺序链表 双向链表 双向循环链表求解约瑟夫环&#xff08;Joseph&#xff09; 栈 顺序栈 队列 顺序队列 顺序循环队列 稀疏数组 当一个数组中大部分值为0,或者相同时&#xff0c;可以采用稀疏数组的方式来保存&#xff0c;从而节约存储…...

docker部署gitlab过程中遇到的一些问题记录

文章目录用nginx代理docker部署的gitlab服务密码重置docker0网卡异常离线安装apt的包用nginx代理docker部署的gitlab服务 一般咱们不会去暴露很多端口给外面&#xff0c;所以部署完gitlab后&#xff0c;我希望能够用nginx来代理我们的gitlab服务。 gitlab的docker部署参考这个…...

数组的定义与使用

文章目录 数组的基本概念数组的基本用法数组与方法互操作一、数组的基本概念 数组&#xff1a;可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。 注意&#xff1a;1. 数组中存放的元素其类型相同 2. 数组的空间是连在一起的 3. 每个空间有自己的编号&#xff0…...

SAP ABAP用程序删除开发KEY

在BASISI系统管理中&#xff0c;用户的开发Key存储在DEVACCESS表中&#xff0c;如果由于审计需要删除一些用户的开发Key&#xff0c;而系统有限制SM30, SE16 or SE16N 等事务码的使用&#xff0c;你就可以通过一个小程序去删除开发Key。 代码如下&#xff1a; REPORT ZBCDEV…...

安卓设备TF卡概率性无法识别问题

现象 使用t卡的设备出货前检测是正常的,放在仓库中或出货后再开机,有概率的机器无法识别,重新插拔或重启无效,拔下来放pc电脑上识别后再插回设备则恢复正常能识别。 设备信息 系统: Android 8.1.0 数量:抽检有12%的设备无法识别 TF卡:SanDisk Ultra 64GB 10 A1 microS…...

linux安装nodejs和微信小程序自动化部署操作

一.运行环境安装 Node.js 并且版本大于 8.0基础库版本为 2.7.3 及以上开发者工具版本为 1.02.1907232 及以上安装node.js(1).下载node包官网地址:https://nodejs.org/en/download/如果英文不好的,可以看中文网站:https://nodejs.org/zh-cn/download/点击上面的进行下载,当然,也…...

JavaScript高级 Proxy Reflect

1. Proxy 1. 监听对象的变化 有一个对象&#xff0c;我们希望监听这个对象中的属性被设置或获取的过程 我们可以通过 Object.defineProperty 来实现 const obj {name: "why",age: 18,height: 1.88 }// 需求: 监听对象属性的所有操作 // 监听属性的操作 // 1.针对…...

Eth-trunk :LACP模式链路聚合实战

Eth-trunk : LACP模式链路聚合实战 需求描述 PC1和PC3数据vlan10 &#xff0c;网段为192.168.10.0 /24PC2和PC4数据vlan20 &#xff0c;网段为192.168.20.0 /24确保设备之间互联互通&#xff0c;使用最大互联带宽并没有环路确保相同网段的PC可以互通判断交换机之间的每个端口…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失&#xff1f; 直观示例说明 为什么上下文如此重要&#xff1f; 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程&#xff0c;代码应该如何实现 推荐方案&#xff1a;使用 ManagedE…...

Vue 实例的数据对象详解

Vue 实例的数据对象详解 在 Vue 中,数据对象是响应式系统的核心,也是组件状态的载体。理解数据对象的原理和使用方式是成为 Vue 专家的关键一步。我将从多个维度深入剖析 Vue 实例的数据对象。 一、数据对象的定义方式 1. Options API 中的定义 在 Options API 中,使用 …...

解密鸿蒙系统的隐私护城河:从权限动态管控到生物数据加密的全链路防护

摘要 本文以健康管理应用为例&#xff0c;展示鸿蒙系统如何通过细粒度权限控制、动态权限授予、数据隔离和加密存储四大核心机制&#xff0c;实现复杂场景下的用户隐私保护。我们将通过完整的权限请求流程和敏感数据处理代码&#xff0c;演示鸿蒙系统如何平衡功能需求与隐私安…...