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

MyBatis —— 多种查询及映射关系

前言

        上一篇文章中荔枝梳理了有关MyBatis的相关环境配置和核心配置文件及其模板的设置和生成,而在这篇文章中荔枝会着重梳理MyBatis多种查询情况、特殊SQL执行以及两表联查时映射关系的处理。希望对需要的小伙伴有帮助~~~


文章目录

前言

一、多种查询情况

1.1 查询单条数据

1.2 查询多条数据

1.3 特殊SQL的执行 

1.3.1 模糊查询

1.3.2 批量删除

1.3.3 动态设置表名

1.3.4 获取自增主键

二、自定义映射

2.1 解决字段名和属性名不一致的三种方案

2.2 多对一的映射关系

2.2.1 通过级联属性赋值解决多对一映射

2.2.2 通过association解决多对一映射问题

2.2.3 association分步查询解决多对一映射问题

2.2.4 延迟加载 

2.3 一对多映射关系 

2.3.1 Collection解决一对多映射关系

2.3.2 分步查询解决一对多映射关系

总结


一、多种查询情况

        在MyBatis中,对于数据库的查询来说,如果查询出来的数据只有一条,可以通过实体类对象或者集合(list、map)来接收,如果查询的数据有多条,则一定不能通过实体类来接收,否则会抛出异常TooManyResultException。

1.1 查询单条数据

实体类对象:

User getUserById(@Param("id") Integer id);

list集合:

List<User> getAllUser(@Param("id") Integer id);

map集合

Map<String,Object> getUserByIdToMap(@Param("id") Integer id);

1.2 查询多条数据

 list集合:

List<User> getAllUser(@Param("id") Integer id);

map集合:

List<Map<String,Object>> getAllUserToMap(@Param("id") Integer id);

或者借助@MapKey注解

@MapKey("id")  //把查询到的数据的某一个字段作为key,查询到的所有数据作为值value
Map<String,Object> getAllUserToMap2(@Param("id") Integer id);

1.3 特殊SQL的执行 

在MyBatis中,大多数的查询都可以使用#{}的格式来获取参数,但是有一些特殊SQL的执行则不能直接采用#{}的格式。

1.3.1 模糊查询

采用${}格式 

<mapper namespace="com.crj.mapper.SQLMapper">
<!--    List<User> getUserByLike(@Param("username") String username);--><select id="getUserByLike" resultType="User">select * from t_user where username like '%${username}%'</select>
</mapper>

 采用concat拼接并采用#{}

<mapper namespace="com.crj.mapper.SQLMapper">
<!--    List<User> getUserByLike(@Param("username") String username);--><select id="getUserByLike" resultType="User">select * from t_user where username like concat('%',#{username},'%')</select>
</mapper>

采用" "拼接SQL 

<mapper namespace="com.crj.mapper.SQLMapper">
<!--    List<User> getUserByLike(@Param("username") String username);--><select id="getUserByLike" resultType="User">select * from t_user where username like "%"#{username}"%"</select>
</mapper>

1.3.2 批量删除

在执行批量删除的时候为什么不能使用#{}?这是因为#{}会自动加上单引号从而导致SQL异常无法实现批量删除的功能。 

<!--    int deleteMore(@Param("ids") String ids);--><delete id="deleteMore">delete from t_user where id in (${ids})</delete>

1.3.3 动态设置表名

在数据库执行完水平分表之后,MyBatis在执行数据操作的时候就需要动态设置表名从而实现分表查询。这里因为表名是不能加单引号的,所以这里还是采用${}的形式来实现动态分表查询。

<!--    List<User> getUserByTableName(@Param("tableName") String tableName);--><select id="getUserByTableName" resultType="User">select * from ${tableName} where id=1</select>

1.3.4 获取自增主键

插入数据时使用自增主键需要设置insert标签的两个属性: 

  • useGeneratedKeys:设置当前标签中的SQL使用了自增主键
  • keyProperty:将自增的主键的值赋值给传输到映射文件中参数的某个属性
<!--    void insertUser(User user);--><insert id="insertUser" useGeneratedKeys="true" keyProperty="id">insert into t_user values (null,#{username},#{password})</insert>

二、自定义映射

        在之前我们使用resultType要求字段名和属性名一致,使用的是一种默认的自动创建的映射关系。但是当字段名和属性名不一致的时候或者处理一对多和多对一的映射关系的时候,我们需要自定义映射关系resultMap

2.1 解决字段名和属性名不一致的三种方案

  • 为字段起别名,保持与属性名一致
<select id="getAllEmp" resultType="Emp">select eid,emp_name empName from t_emp
</select>
  • 在核心配置文件中借助setting标签中的mapUnderscoreToCameCase 
<!--设置mybatis的全局设置--><settings>
<!--        mapUnderscoreToCameCase:将下划线映射到驼峰命名,默认是false不支持--><setting name="mapUnderscoreToCameCase" value="true"/></settings>

 通过将mapUnderscoreToCameCase属性值设置为true,开启mybatis将下划线映射为驼峰命名的功能 

  • 使用resultMap来自定义映射
<?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.crj.mybatis.mapper.EmpMapper">
<!--    List<Emp> getAllEmp();--><resultMap id="empResultMap" type="Emp"><!--使用resultMap后建议要把所有字段名和属性之间的关系都声明出来--><id property="eid" column="eid"/><result column="emp_name" property="empName"/>  <!--注意这里的映射关系--><result column="age" property="age"/><result column="sex" property="sex"/></resultMap><select id="getAllEmp" resultMap="empResultMap">select * from t_emp</select>
</mapper>

        id:唯一标识,不能重复

        type:设置映射关系中的实体类类型

这里有两个子标签:id和result。

id:设置主键的映射关系

result:设置普通字段的映射关系

属性 :

        property:设置映射关系中的属性名,必须是type属性所设置的实体类类型的属性名

        column:设置映射关系中的字段名,是SQL语句查询出的字段名

2.2 多对一的映射关系

这里有员工和部门两张表,分别为二者创建实现类Emp和Dept。在多对一的映射关系中,我们考虑的是多个员工同属于一个部门。

package com.crj.mybatis.pojo;public class Emp {private Integer eid;private  String empName;private Integer age;private String sex;private String email;private Dept dept;@Overridepublic String toString() {return "Emp{" +"eid=" + eid +", empName='" + empName + '\'' +", age=" + age +", sex='" + sex + '\'' +", email='" + email + '\'' +", dept=" + dept +'}';}public Dept getDept() {return dept;}public void setDept(Dept dept) {this.dept = dept;}public Emp(Integer eid, String empName, Integer age, String sex, String email) {this.eid = eid;this.empName = empName;this.age = age;this.sex = sex;this.email = email;}public Emp(){}public Integer getEid() {return eid;}public void setEid(Integer eid) {this.eid = eid;}public String getEmpName() {return empName;}public void setEmpName(String empName) {this.empName = empName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}

2.2.1 通过级联属性赋值解决多对一映射

    <resultMap id="getEmpAndDept" type="Emp"><id property="eid" column="eid"/><result column="emp_name" property="empName"/><result column="age" property="age"/><result column="sex" property="sex"/><result column="did" property="dept.did"/><result column="dept_name" property="dept.deptName"/></resultMap><!--    Emp getEmpAndDept(@Param("eid") Integer eid);--><select id="getEmpAndDept" resultMap="getEmpAndDept">select * from t_emp left join t_dept on t_emp.did=t_dept.did where t_emp.eid = #{eid}</select>

2.2.2 通过association解决多对一映射问题

其中,对于association中的属性我们需要了解:

  • property:需要处理多对一映射关系的属性名
  • javaType: 该属性的类型
    <resultMap id="getEmpAndDept" type="Emp"><id property="eid" column="eid"/><result column="emp_name" property="empName"/><result column="age" property="age"/><result column="sex" property="sex"/><association property="dept" javaType="Dpet"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result></association></resultMap>

2.2.3 association分步查询解决多对一映射问题

此时association中的property属性的含义不变,但还有两个比较重要的属性需要设置相应的属性值

  • select:设置分步查询的sql的唯一标识(一般是设置多对一中一处的mapper接口全类名.方法名)
  • column:设置分布查询的条件,在这个例子中,分布查询是依据两个表之间的关系也就是did来实现的。 
  • fetchType:当开启了全局的延迟加载之后,可以通过此属性手动控制延迟加载的效果

分步查询的第一步:查询员工信息 

EmpMapper.java

package com.crj.mybatis.mapper;import com.crj.mybatis.pojo.Emp;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface EmpMapper {/*** 通过分布查询员工以及员工所对应的部门信息* 分布查询第一步:查询员工信息*/Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);
}

EmpMapper.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.crj.mybatis.mapper.EmpMapper">
<!--    分步查询,两表联查--><resultMap id="empAndDeptByStepResultMap" type="Emp"><id property="eid" column="eid"/><result column="emp_name" property="empName"/><result column="age" property="age"/><result column="sex" property="sex"/><association property="dept" select="com.crj.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo" column="did"></association></resultMap>
<!--    Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);--><select id="getEmpAndDeptByStepOne" resultMap="empAndDeptResultMapTwo">select * from t_emp where eid = #{eid}</select></mapper>

分步查询第二步:根据查询到的员工信息中的did来查询相应的部门信息

DpetMapper.java

package com.crj.mybatis.mapper;import com.crj.mybatis.pojo.Dept;
import org.apache.ibatis.annotations.Param;public interface DeptMapper {/*** 通过分布查询员工以及员工所对应的部门信息* 分布查询第二步:通过did查询员工所对应的部门*/Dept getEmpAndDeptByStepTwo(@Param("did") Integer did);}

DeptMapper.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.crj.mybatis.mapper.DeptMapper">
<!--    Dept getEmpAndDeptByStepTwo(@Param("did") Integer did);--><select id="getEmpAndDeptByStepTwo" resultType="Dept">select * from t_dept where did = #{did}</select>
</mapper>

需要注意的是,分步查询在实际的应用场景中使用的会比较多。 

注意:为什么更推荐使用分步查询呢?

这是因为通过分步查询我们可以实现MyBatis的延迟加载(懒加载 )功能,通过分步查询我们可以做到需要查询什么信息就执行什么SQL语句,比如我们仅需要查询员工信息而不需要部门的内容时,通过延迟加载我们只会执行EmpMapper中的SQL语句,同时分步查询也实现了两种不同的查询功能的隔离。MyBatis中默认是不会开启延迟加载的功能滴,

2.2.4 延迟加载 

要想实现延迟加载的功能,就必须在全局配置文件中开启相应的延迟加载的开关: 

  • lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载,默认true;
  • aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对像的所有属性。否则,每个属性会按需加载,默认false;

        开启延迟加载时针对于当前的所有的分步查询,如果哪一步不需要延迟加载可通过associationcollection中的fetchType属性设置当前的分步查间是否使用延迟加载,fetchType="lazy(延迟加载) l eager(立即加载)' 

    <settings>
<!--        开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/></settings>

2.3 一对多映射关系 

2.3.1 Collection解决一对多映射关系

Dpet.java 

//一对多的映射关系private List<Emp> emps;

DeptMapper.java 

    /*** 以部门为主表来获取部门中所有的员工信息*/Dept getDeptAndEmp(@Param("did") Integer did);

DeptMapper.xml 

<resultMap id="deptAndEmpResultMap" type="Dept"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result><!--注意区分ofType和association中属性javaType的区别--><collection property="emps" ofType="Emp"><id property="did" column="did"></id><result property="empName" column="emp_name"></result><result property="age" column="age"></result><result property="sex" column="sex"></result><result property="email" column="email"></result></collection></resultMap>
<!--    Dept getDeptAndEmp(@Param("did") Integer did);--><select id="getDeptAndEmp" resultMap="deptAndEmpResultMap">select * from t_dept left join t_emp on t_dept.did = t_emp.did where t_dept.did = #{did}</select>

2.3.2 分步查询解决一对多映射关系

分步查询的第一步:查询部门信息 

DeptMapper.java

package com.crj.mybatis.mapper;import com.crj.mybatis.pojo.Dept;
import org.apache.ibatis.annotations.Param;public interface DeptMapper {/*** 分步查询处理一对多的关系* 第一步:查询部门信息*/Dept getDeptAndEmpByStepOne(@Param("did") Integer did);}

DeptMapper.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.crj.mybatis.mapper.DeptMapper"><resultMap id="deptAndEmpByStepResultMap" type="Dept"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result><collection property="emps" select="com.crj.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo" column="did"></collection></resultMap>
<!--    Dept getDeptAndEmpByStepOne(@Param("did") Integer did);--><select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpByStepResultMap">select * from t_dept where did = #{did}</select>
</mapper>

分步查询第二步:根据查询到的员工信息中的did来查询相应的部门信息

EmpMapper.java

package com.crj.mybatis.mapper;import com.crj.mybatis.pojo.Emp;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface EmpMapper {/*** 分步查询处理一对多的关系* 第二步:根据did查询员工信息*/List<Emp> getDeptAndEmpByStepTwo();
}

EmpMapper.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.crj.mybatis.mapper.EmpMapper"><!--    List<Emp> getDeptAndEmpByStepTwo();--><select id="getDeptAndEmpByStepTwo" resultType="Emp">select * from t_emp where did = #{did}</select></mapper>

总结

        弄清楚两种映射关系以及相应的文件依赖关系和处理无疑时学习的重点,荔枝学习的时候也是感觉好像懂了,但复盘的时候还是有很多概念明显没有弄清楚。最近荔枝的学习状态有点波动,可能是摆烂了两周的缘故。。。接下来荔枝也会调整状态滴,继续学习Java后端技术栈并作出相应的Blog输出。最近看了丙哥的文章,喜欢一句话分享给大家:你知道的越多,你不知道的越多。共勉共勉哈哈哈哈~~~

今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~

相关文章:

MyBatis —— 多种查询及映射关系

前言 上一篇文章中荔枝梳理了有关MyBatis的相关环境配置和核心配置文件及其模板的设置和生成&#xff0c;而在这篇文章中荔枝会着重梳理MyBatis多种查询情况、特殊SQL执行以及两表联查时映射关系的处理。希望对需要的小伙伴有帮助~~~ 文章目录 前言 一、多种查询情况 1.1 查…...

腾讯云服务器镜像TencentOS Server操作系统详细介绍

腾讯云TencentOS Server镜像是腾讯云推出的Linux操作系统&#xff0c;完全兼容CentOS生态和操作方式&#xff0c;TencentOS Server操作系统为云上运行的应用程序提供稳定、安全和高性能的执行环境&#xff0c;TencentOS可以运行在腾讯云CVM全规格实例上&#xff0c;包括黑石物理…...

Docker 中下载各版本的 CentOS、CentOS Steam 方式

如果你跟我一样&#xff0c;想要在docker下载centos的镜像&#xff0c;但是无奈访问不了 https://hub.docker.com/&#xff0c;于是不知道有哪些tag可以下载&#xff0c;该如何办呢&#xff1f; 方法如下&#xff0c;以供参考。 访问&#xff1a;https://quay.io/repository/…...

多线程使用HashMap,HashMap和HashTable和ConcurrentHashMap区别(面试题常考),硬盘IO,顺便回顾volatile

一、回顾&#x1f49b; 谈谈volatile关键字用法 volatile能够保证内存可见性&#xff0c;会强制从主内存中读取数据&#xff0c;此时如果其他线程修改被volatile修饰的变量&#xff0c;可以第一时间读取到最新的值。 二、&#x1f499; HashMap线程不安全没有锁,HashTable线程…...

专线连接交换机设置 – 如何实现高效率的网络连接?

专线链接交换机设置 – 如何实现高效率的网络连接&#xff1f; 什么是专线连接交换机&#xff1f; 在现代互联网中&#xff0c;网络连接的快速和高效是至关重要的。尤其是对于需要大量数据传输和保证网络稳定性的企业和组织来说&#xff0c;专线连接交换机是一项非常重要的技…...

C#,数值计算——Midexp的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Midexp : Midpnt { public new double func(double x) { return funk.funk(-Math.Log(x)) / x; } public Midexp(UniVarRealValueFun funcc, double aa, d…...

微信小程序使用本地存储方法wx.setStorageSync()和wx.getStorageSync()

微信小程序的本地存储可以使用wx.setStorageSync()和wx.getStorageSync()方法实现 使用wx.setStorageSync()方法可以将数据以键值对的方式存储到本地存储中&#xff1a; wx.setStorageSync(demo, demo123);获取数据&#xff1a;使用wx.getStorageSync()方法可以从本地存储中获…...

题解:ABC317C - Remembering the Days

题解&#xff1a;ABC317C - Remembering the Days 题目 链接&#xff1a;Atcoder。 链接&#xff1a;洛谷。 难度 算法难度&#xff1a;B。 思维难度&#xff1a;B。 调码难度&#xff1a;C。 综合评价&#xff1a;普及-。 算法 深度优先搜索。 思路 先建图&#x…...

【CSS】简记CSS效果:通过transition(动画过渡属性)实现侧边栏目滑入滑出

需求 在资金明细的页面中&#xff0c;点击按钮时筛选区域从左侧滑出&#xff0c;完成筛选点击确认后调用接口完成数据查询&#xff0c;筛选区域滑入左侧&#xff1b; 基于微信小程序页面实现 wxml代码 <view><!-- 操作按钮 --><button type"primary&qu…...

LeetCode——最大子数组和(中等)

题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#x…...

Zookeeper集成SpringBoot

Curator 是 Apache ZooKeeper 的Java客户端库。 Zookeeper现有常见的Java API如&#xff1a;原生JavaAPI、Curator、ZkClient等。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…...

ModaHub魔搭社区:星环科技致力于打造更优越的向量数据库

在数字化时代,数据成为了最重要的资源之一。随着人工智能、大数据等技术的不断发展,向量数据库成为了处理这类数据的关键工具。星环科技作为一家专注于数据存储和管理技术的公司,其重要目标就是将向量数据库打造得更为优越。 在星环科技,有一个专注于向量数据库的团队。这个…...

Dubbo默认使用什么序列化框架?还有哪些?

Dubbo默认使用的序列化框架是Hessian 2.0。Hessian是一种基于二进制的序列化协议&#xff0c;它具有简单、高效的特点&#xff0c;适用于网络传输和存储数据。Hessian在Dubbo中被广泛使用&#xff0c;因为它可以在不同的编程语言之间进行对象的序列化和反序列化。 除了Hessian…...

攻防世界-What-is-this

原题 解题思路 解压后文件 没有后缀&#xff0c;不知道是什么文件。用notepad打开找不到flag。 尝试当成压缩包解压。 用stegsolve以打开图片1&#xff0c; 合成两张图片。...

[C++]构造与毁灭:深入探讨C++中四种构造函数与析构函数

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…...

【跟小嘉学 Rust 编程】二十一、网络编程

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

一文了解聚合支付

第四方支付是相对于第三方支付而提出的概念&#xff0c;又被称为“聚合支付”是指通过聚合第三方支付平台、合作银行、等多种支付工具进行的综合支付服务。 简言而之&#xff0c;把支付接口聚合到一个平台上面&#xff0c;来给商家或者个人来提供支付服务。 第四方支付集中了各…...

118.杨辉三角

一、题目 118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>>data(numRows);for(int i0;i<numRows;i){data[i].resize(i1);//扩容data[i]…...

第7节——渲染列表+Key作用

一、列表渲染 我们再react中如果渲染列表&#xff0c;一般使用map方法进行渲染 import React from "react";export default class LearnJSX2 extends React.Component {state {infos: [{name: "张三",age: 18,},{name: "李四",age: 20,},{nam…...

NTP服务器时间配置

简介 ntp服务器是一个同步时间都服务器。 开启ntpd 1.查看状态&#xff08;可以看到状态为&#xff1a;inactive&#xff0c;也就是没有启动ntp服务&#xff09; [rootlocalhost]$ systemctl status ntpd ● ntpd.service - Network Time ServiceLoaded: loaded (/usr/lib/…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点

中科院1区顶刊|IF14&#xff1a;多组学MR联合单细胞时空分析&#xff0c;锁定心血管代谢疾病的免疫治疗新靶点 当下&#xff0c;免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入&#xff0c;我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...

学习 Hooks【Plan - June - Week 2】

一、React API React 提供了丰富的核心 API&#xff0c;用于创建组件、管理状态、处理副作用、优化性能等。本文档总结 React 常用的 API 方法和组件。 1. React 核心 API React.createElement(type, props, …children) 用于创建 React 元素&#xff0c;JSX 会被编译成该函数…...

vue3 手动封装城市三级联动

要做的功能 示意图是这样的&#xff0c;因为后端给的数据结构 不足以使用ant-design组件 的联动查询组件 所以只能自己分装 组件 当然 这个数据后端给的不一样的情况下 可能组件内对应的 逻辑方式就不一样 毕竟是 三个 数组 省份 城市 区域 我直接粘贴组件代码了 <temp…...

安宝特方案丨从依赖经验到数据驱动:AR套件重构特种装备装配与质检全流程

在高压电气装备、军工装备、石油测井仪器装备、计算存储服务器和机柜、核磁医疗装备、大型发动机组等特种装备生产型企业&#xff0c;其产品具有“小批量、多品种、人工装配、价值高”的特点。 生产管理中存在传统SOP文件内容缺失、SOP更新不及、装配严重依赖个人经验、产品装…...