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

springboot组件使用-mybatis组件使用

文章目录

    • springboot使用mybatis组件
      • 1. 添加依赖
      • 2. 配置数据源
      • 3. 创建实体类
      • 4. 创建Mapper接口
      • 5. 创建Mapper XML文件
      • 6. 使用Mapper
      • 7. 启动类配置
    • mybtis 动态SQL
      • 1. `@Mapper` 注解
      • 2. `@Select` 注解
      • 3. `@Insert` 注解
      • 4. `@Update` 注解
      • 5. `@Delete` 注解
      • 6. `@Results` 注解
      • 7. `@Param` 注解
      • 8. `@CacheNamespace` 注解
      • 9. `@Options` 注解
      • 10. `@ResultMap` 注解
      • 总结
    • mybatis XML标签
      • 1. `<mapper>` 标签
      • 2. `<select>` 标签
      • 3. `<insert>` 标签
      • 4. `<update>` 标签
      • 5. `<delete>` 标签
      • 6. `<resultMap>` 标签
      • 7. `<collection>` 标签
      • 8. `<include>` 标签
      • 9. `<if>` 标签
      • 10. `<choose>`、`<when>` 和 `<otherwise>` 标签
      • 11. `<foreach>` 标签
      • 12. `<trim>` 标签
      • 总结
    • 注意
    • 参考文献

springboot使用mybatis组件

在Spring Boot项目中加入MyBatis组件,可以方便地进行数据库操作。以下是详细的步骤:

1. 添加依赖

首先,在pom.xml文件中添加MyBatis和数据库驱动的依赖。例如,如果你使用的是MySQL数据库,可以添加以下依赖:

<dependencies><!-- Spring Boot Starter Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL Connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency><!-- MyBatis Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency>
</dependencies>

2. 配置数据源

application.propertiesapplication.yml文件中配置数据源信息。例如,在application.properties文件中添加以下配置:

# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# MyBatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity

3. 创建实体类

创建与数据库表对应的实体类。例如:

package com.example.demo.entity;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax protectedById;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private Integer age;// Getters and Setters
}

4. 创建Mapper接口

创建MyBatis的Mapper接口,并使用@Mapper注解标记。例如:

package com.example.demo.mapper;import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT * FROM user")List<User> findAll();
}

5. 创建Mapper XML文件

src/main/resources/mapper目录下创建Mapper的XML文件。例如,创建UserMapper.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.demo.mapper.UserMapper"><select id="findAll" resultType="com.example.demo.entity.User">SELECT * FROM user</select>
</mapper>

6. 使用Mapper

在Service层或Controller层中使用Mapper进行数据库操作。例如,在Service层中:

package com.example.demo.service;import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getAllUsers() {return userMapper.findAll();}
}

7. 启动类配置

确保在Spring Boot启动类上添加@MapperScan注解,以扫描Mapper接口。例如:

package com.example.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

通过以上步骤,你就可以在Spring Boot项目中成功加入MyBatis组件,并进行数据库操作了。

mybtis 动态SQL

在 MyBatis 中,除了使用 XML 映射文件来定义 SQL 语句之外,还可以使用注解(Annotations)的方式来编写 SQL 语句。这种方式可以让 SQL 语句更紧密地与 Java 代码结合,使得代码结构更加清晰。下面是一些常用的 MyBatis 注解及其使用方法。

1. @Mapper 注解

@Mapper 注解用于标记一个接口为 MyBatis 的 Mapper 接口。这个接口将包含一系列的 CRUD 方法。

import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper {// 方法定义
}

2. @Select 注解

@Select 注解用于定义一个 SELECT 语句。

import org.apache.ibatis.annotations.Select;
import com.example.demo.model.User;@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User getUserById(Long id);
}

3. @Insert 注解

@Insert 注解用于定义一个 INSERT 语句。如果需要获取自动生成的主键值,可以使用 @Options 注解。

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;@Mapper
public interface UserMapper {@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")@Options(useGeneratedKeys = true, keyProperty = "id")void insertUser(User user);
}

4. @Update 注解

@Update 注解用于定义一个 UPDATE 语句。

import org.apache.ibatis.annotations.Update;@Mapper
public interface UserMapper {@Update("UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}")void updateUser(User user);
}

5. @Delete 注解

@Delete 注解用于定义一个 DELETE 语句。

import org.apache.ibatis.annotations.Delete;@Mapper
public interface UserMapper {@Delete("DELETE FROM user WHERE id=#{id}")void deleteUser(Long id);
}

6. @Results 注解

@Results 注解用于定义结果映射。它可以帮助处理复杂的结果集,比如一对一(One-to-One)或一对多(One-to-Many)的关系。

import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.ResultType;
import org.apache.ibatis.annotations.ResultMap;
import com.example.demo.model.User;
import com.example.demo.model.Address;@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "age", column = "age"),@Result(property = "address", column = "address_id",one = @One(select = "com.example.demo.mapper.AddressMapper.getAddressById"))})User getUserById(Long id);
}

7. @Param 注解

@Param 注解用于指定 SQL 语句中的参数名称。

import org.apache.ibatis.annotations.Param;@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%')")List<User> findUsersByName(@Param("name") String name);
}

8. @CacheNamespace 注解

@CacheNamespace 注解用于定义缓存的命名空间,可以指定缓存的实现类等。

import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.cache.decorators.Synchronized;@Mapper
@CacheNamespace(implementation = SynchronizedCache.class)
public interface UserMapper {// 方法定义
}

9. @Options 注解

@Options 注解用于定义 SQL 执行后的一些选项,如获取自动生成的主键等。

import org.apache.ibatis.annotations.Options;@Mapper
public interface UserMapper {@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")@Options(useGeneratedKeys = true, keyProperty = "id")void insertUser(User user);
}

10. @ResultMap 注解

@ResultMap 注解用于引用已经定义好的结果映射。

import org.apache.ibatis.annotations.ResultMap;@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")@ResultMap("UserResultMap")User getUserById(Long id);
}

总结

使用 MyBatis 的注解可以让你在 Java 代码中直接定义 SQL 语句,这种方式更加简洁,特别是在一些简单的 CRUD 操作中。然而,对于复杂的 SQL 逻辑或者需要高度定制化的映射关系,XML 映射文件仍然是一种非常好的选择。在实际开发中,可以根据具体情况选择最适合的方式来定义 SQL 语句和结果映射。

mybatis XML标签

MyBatis 是一个优秀的持久层框架,它支持定制化的 SQL、存储过程以及高级映射。在 MyBatis 中,XML 映射文件用于定义 SQL 语句、结果映射以及其他与数据库交互相关的配置。下面是 MyBatis 中常用的一些 XML 标签及其用途。

1. <mapper> 标签

<mapper> 标签用于定义一个映射器接口,它包含一系列 SQL 语句和结果映射。

<mapper namespace="com.example.demo.mapper.UserMapper"><!-- SQL 语句和结果映射定义 -->
</mapper>

2. <select> 标签

<select> 标签用于定义一个 SELECT 语句。

<select id="getUserById" parameterType="long" resultType="com.example.demo.model.User">SELECT * FROM user WHERE id = #{id}
</select>

3. <insert> 标签

<insert> 标签用于定义一个 INSERT 语句。

<insert id="insertUser" parameterType="com.example.demo.model.User">INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>

4. <update> 标签

<update> 标签用于定义一个 UPDATE 语句。

<update id="updateUser" parameterType="com.example.demo.model.User">UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}
</update>

5. <delete> 标签

<delete> 标签用于定义一个 DELETE 语句。

<delete id="deleteUser" parameterType="long">DELETE FROM user WHERE id=#{id}
</delete>

6. <resultMap> 标签

<resultMap> 标签用于定义复杂的结果映射关系,它可以处理一对一(One-to-One)、一对多(One-to-Many)或多对一(Many-to-One)的关系。

<resultMap id="UserResultMap" type="com.example.demo.model.User"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/><association property="address" javaType="com.example.demo.model.Address" resultMap="AddressResultMap"/>
</resultMap>

7. <collection> 标签

<collection> 标签用于处理一对多关系。

<resultMap id="UserResultMap" type="com.example.demo.model.User"><id property="id" column="id"/><result property="name" column="name"/><collection property="orders" ofType="com.example.demo.model.Order" select="getOrdersById"/>
</resultMap>

8. <include> 标签

<include> 标签用于引用外部 SQL 片段。

<sql id="commonColumns">name, age</sql><select id="getAllUsers" resultType="com.example.demo.model.User">SELECT ${commonColumns} FROM user
</select>

9. <if> 标签

<if> 标签用于条件判断,可以动态地构建 SQL 语句。

<select id="findUsersByName" parameterType="string" resultType="com.example.demo.model.User">SELECT * FROM user WHERE 1=1<if test="name != null">AND name LIKE '%${name}%'</if>
</select>

10. <choose><when><otherwise> 标签

<choose><when><otherwise> 标签用于实现多条件判断。

<select id="findUsers" parameterType="com.example.demo.model.SearchCriteria" resultType="com.example.demo.model.User">SELECT * FROM user WHERE<choose><when test="name != null">name LIKE '%${name}%'</when><when test="age != null">age = ${age}</when><otherwise>1 = 1</otherwise></choose>
</select>

11. <foreach> 标签

<foreach> 标签用于处理集合参数,常用于批量操作。

<insert id="batchInsert" parameterType="java.util.List">INSERT INTO user(name, age) VALUES<foreach item="item" index="index" collection="list" open="(" separator=")," close=")">#{item.name}, #{item.age}</foreach>
</insert>

12. <trim> 标签

<trim> 标签用于动态拼接 SQL 语句,并提供去除前导或尾随空白的功能。

<select id="findUsers" parameterType="com.example.demo.model.SearchCriteria" resultType="com.example.demo.model.User">SELECT * FROM user WHERE<trim prefix="WHERE" prefixOverrides="AND|OR"><if test="name != null">AND name LIKE '%${name}%'</if><if test="age != null">OR age = ${age}</if></trim>
</select>

总结

以上是 MyBatis 中常用的 XML 标签及其用途。通过这些标签,可以灵活地定义 SQL 语句、结果映射以及其他与数据库交互相关的配置。掌握这些标签的使用方法,可以帮助你更好地利用 MyBatis 处理复杂的数据库操作。

注意

  • sql的配置有两种方式:动态SQL和xml配置
  • 推荐使用xml配置,原因如下:

某些场景下,可能需要对迁移到其他类型数据库,使用xml配置:

  1. 可以不需要改动代码, 而仅需复制一份xml, 针对新的类型的数据库进行兼容性改造。
  2. 新旧数据库切换时,在发生异常时,可以切换回旧的数据库操作,保证业务连续性。

参考文献

官网中文文档

相关文章:

springboot组件使用-mybatis组件使用

文章目录 springboot使用mybatis组件1. 添加依赖2. 配置数据源3. 创建实体类4. 创建Mapper接口5. 创建Mapper XML文件6. 使用Mapper7. 启动类配置 mybtis 动态SQL1. Mapper 注解2. Select 注解3. Insert 注解4. Update 注解5. Delete 注解6. Results 注解7. Param 注解8. Cache…...

Ribbon 源码分析【Ribbon 负载均衡】

前言 在 Spring Cloud 2020 版本以后&#xff0c;移除了对 Netflix 的依赖&#xff0c;也就移除了负载均衡器 Ribbon&#xff0c;Spring Cloud 官方推荐使用 Loadbalancer 替换 Ribbon&#xff0c;而在 LoadBalancer 之前 Spring Cloud 一直使用的是 Ribbon 来做负载[均衡器的…...

Python | Leetcode Python题解之第385题迷你语法分析器

题目&#xff1a; 题解&#xff1a; class Solution:def deserialize(self, s: str) -> NestedInteger:if s[0] ! [:return NestedInteger(int(s))stack, num, negative [], 0, Falsefor i, c in enumerate(s):if c -:negative Trueelif c.isdigit():num num * 10 int…...

进程间通信-进程池

目录 理解​ 完整代码 完善代码 回收子进程&#xff1a;​ 不回收子进程&#xff1a; 子进程使用重定向优化 理解 #include <iostream> #include <unistd.h> #include <string> #include <vector> #include <sys/types.h>void work(int rfd) {…...

【PYTHON 基础系列-request 模块介绍】

一、requests库简介 使用requests库能快速构建 HTTP 请求&#xff0c;而无需深入了解底层网络协议细节。其API设计直观&#xff0c;使得发送请求就像调用函数一样简单&#xff0c;同时提供了丰富的选项以满足复杂网络交互的需求。这种设计使得无论是初学者还是经验丰富的开发者…...

springboot 实现策略模式通过id进入不同的服务类service

在Spring Boot中实现策略模式&#xff0c;通常是将不同的算法封装在单独的类中&#xff0c;并使它们可以相互替换。这些类通常都实现同一个接口。在Spring Boot应用中&#xff0c;你可以通过Spring的依赖注入&#xff08;DI&#xff09;来管理这些策略类的实例&#xff0c;并通…...

AUC真的什么情形下都适合吗

AUC(Area Under the ROC Curve)是一个广泛使用的性能评价指标,它衡量了分类模型在不同阈值下区分正类和负类的能力。然而,在某些情况下,AUC可能不是最准确的评价指标,以下是几种可能的情况: 数据极度不均衡:在数据极度不均衡的情况下,即使模型只预测多数类,AUC也可能…...

Flutter基本组件Text使用

Text是一个文本显示控件&#xff0c;用于在应用程序界面中显示单行或多行文本内容。 Text简单Demo import package:flutter/material.dart;class MyTextDemo extends StatelessWidget {const MyTextDemo({super.key});overrideWidget build(BuildContext context) {return Sca…...

DDS基本原理--FPGA学习笔记

DDS信号发生器原理&#xff1a; timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2024/09/04 15:20:30 // Design Name: hilary // Module Name: DDS_Module //module DDS_Module(Clk,Reset_n,Fword,Pword,Data);input Clk;input Reset_n;input [31:0]…...

有temp表包含A,B两列,使用SQL,对B列进行处理,形成C列,按A列顺序,B列值不变,则C列累计技术,B列值变化,则C列重新开始计数

有temp表&#xff0c;使用SQL&#xff0c;对B列进行处理&#xff0c;形成C列&#xff0c;按A列顺序&#xff0c;B列值不变&#xff0c;则C列累计技术&#xff0c;B列值变化&#xff0c;则C列重新开始计数 建表语句如下 CREATE TABLE temp(A STRING ,B STRING );INSERT INTO …...

【H2O2|全栈】关于HTML(6)HTML基础(五 · 完结篇)

HTML基础知识 目录 HTML基础知识 前言 准备工作 标签的具体分类&#xff08;五&#xff09; 本文中的标签在什么位置中使用&#xff1f; 表单&#xff08;二&#xff09; 下拉选择菜单 文本域 案例 拓展标签 iframe框架 案例 预告和回顾 后话 前言 本系列博客介…...

2024第三届大学生算法大赛 真题训练一 解题报告 | 珂学家

前言 题解 这是第三届大学生算法大赛(第二届为清华社杯)的赛前练习赛一. 这是上界比赛的体验报告: 2023第二届“清华社杯”大学生算法大赛 解题报告(流水账版) | 珂学家&#xff0c;个人还是非常推荐这个比赛。 难度分布&#xff1a;4 easy/4 mid-hard/2 hard 赛前练习赛一…...

IIS网站允许3D模型类型的文件

参与threejs项目的研发&#xff0c;本地开发完成后&#xff0c;发布后使用时发现模型文件不能正常获取资源&#xff0c;原因是IIS站点默认不支持模型类型。 一开始是通过直接在IIS网站管理中的类型添加来实现网站对类型的支持。 后来发现一段对于后端来说可以直接实现代码上添加…...

Linux 性能调优之CPU上下文切换

写在前面 博文内容为 Linux 性能指标 CPU 上下文切换认知内容涉及&#xff1a; 上下文认知&#xff0c;发生上下文切换的场景有哪些上下文指标信息查看&#xff0c;内核上下文切换事件跟踪&#xff0c;系统上下文切换统计上下文异常场景分析&#xff0c;CPU亲和性配置优化上下文…...

【无标题】符文价值的退化页

我们利用现有的符文体系建立了一个健全的符文扩展空间&#xff0c;可假若符文让我们感到十分困惑&#xff0c;我们不介意毁灭它们&#xff0c;让一切回到没有字迹的蛮荒纪。 如此&#xff0c;眼睛也失去了作用。我们的成GUO也会给后来者提供又是一DUI 令人眼花缭乱的无用符咒。…...

DFS 算法:洛谷B3625迷宫寻路

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…...

结构开发笔记(七):solidworks软件(六):装配摄像头、摄像头座以及螺丝,完成摄像头结构示意图

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141931518 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

Android 15 新特性快速解读指南

核心要点 16K 页面大小支持目前作为开发人员选项提供&#xff0c;并非强制要求。 引入多项提升开发体验、多语言支持、多媒体功能、交互体验和隐私安全的更新。 重点关注前台服务限制、Window Insets 行为变化、AndroidManifest 文件限制等适配要求。 开发体验 ApplicationS…...

【机器人工具箱Robotics Toolbox开发笔记(十九)】机器人工具箱Link类函数参数说明

​机器人工具箱中的Link对象保存于机器人连杆相关的所有信息,如运动学参数、刚体惯性参数、电机和传动参数等。 与Link对象有关参数如表1所示。 表1 Link对象参数 参 数 意 义 参 数 意 义 A 连杆变换矩阵 islimit 测试关节是否超过软限制 RP RP关节类型 isrevo…...

排查SQL Server中的内存不足及其他疑难问题

文章目录 引言I DMV 资源信号灯资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)查询性能计数器什么是内存授予?II DBCC MEMORYSTATUS 查询内存对象III DBCC 命令释放多个 SQL Server 内存缓存 - 临时度量值IV 等待资源池 %ls (%ld)中的内存…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

第21节 Node.js 多进程

Node.js本身是以单线程的模式运行的&#xff0c;但它使用的是事件驱动来处理并发&#xff0c;这样有助于我们在多核 cpu 的系统上创建多个子进程&#xff0c;从而提高性能。 每个子进程总是带有三个流对象&#xff1a;child.stdin, child.stdout和child.stderr。他们可能会共享…...

django paramiko 跳转登录

在使用Django框架结合Paramiko进行SSH远程操作时&#xff0c;通常涉及到自动化脚本的执行&#xff0c;比如远程服务器上的命令执行、文件传输等。如果你的需求是“跳转登录”&#xff0c;即在登录远程服务器后&#xff0c;再通过该服务器的SSH连接跳转到另一台服务器&#xff0…...

Android Camera Hal中通过Neon指令优化数据拷贝

背景描述&#xff1a; Camera apk普通相机模式录像操作时&#xff0c;一般是同时请求两个流&#xff0c;即预览流和录像流。对于两个流输出图像格式和分辨率相同的情况下&#xff0c;是不是可以通过一个流拷贝得到另一个流的数据&#xff0c;进而节省掉一个Sensor输出处理两次…...

【Redis】数据库与缓存一致性

目录 1、背景2、核心问题3、常见解决方案【1】缓存更新策略[1]旁路缓存模式&#xff08;Cache-Aside&#xff09;[2]写穿透模式&#xff08;Write-Through&#xff09;[3]写回模式 【2】删除与更新策略[1]先更新数据库再删除缓存[2]先删除缓存再更新数据库 【3】一致性保障机制…...