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

mybatis延迟加载、缓存

目录

一、所需表

二、延迟加载

1.延迟加载概念

2.立即加载和延迟加载的应用场景

3.多对一延迟加载查询演示

(1)实体类

User

Account

(2)AccountMapper接口

(3)AccountMapper.xml

(4)UserMapper接口

(5)UserMapper.xml

(6)在总配置文件(mybatis-config.xml)中开启延迟加载配置

(7)测试类

(8)运行

(9)如果测试类中的输出语句改为

4.一对多延迟加载

(1)实体类

(2)UserMapper接口

(3)UserMapper.xml文件

(4)AccountMapper接口

(5)AccountMapper.xml文件

(6)在总配置文件中开启延迟加载

(7)测试类

(8)运行

三、mybatis框架的缓存

1.概念

2.一级缓存

(1)验证一级缓存的存在

测试类

运行

(2)一级缓存失效的四种情况

①使用不同的sqlSession对象查询

测试类

运行

②使用相同的sqlSession对象进行查询,但是查询条件不同

测试类

 运行

③使用相同的sqlSession对象进行查询,但是在两次执行中间我们进行了一次增删改操作

UserMapper接口

UserMapper.xml

测试类

运行

④使用相同的sqlSession对象进行查询,但是手动清除了缓存

测试类

运行

3.二级缓存

(1)在总配置文件中开启二级缓存

(2)在映射配置文件中配置

(3)实体类实现序列化接口

(4)二级缓存必须在SqlSession关闭或提交之后

(5)证明二级缓存

测试类

运行:


一、所需表

account

user

二、延迟加载

1.延迟加载概念

立即加载:当前查询用户的时候,默认把该用户所拥有的账户信息查询出来了

延迟加载:当前查询用户的时候,没有把该用户所拥有的账户信息查询出来,而是使用账户数据的时候,再去查询账户的数据

2.立即加载和延迟加载的应用场景

(1)查询账户的时候,可以直接把用户查询出来(多对一),这个时候可以选择立即加载

(2)查询用户的时候,可以先不查账户信息,需要账户信息的时候再去查,这时选择延迟加载

3.多对一延迟加载查询演示

(1)实体类

User
package com.qcby.pojo;import java.util.Date;/*
* 一
* */
public class User {private Integer id;private String username;private Date birthday;private String sex;private String address;public User() {}public User(Integer id, String username, Date birthday, String sex, String address) {this.id = id;this.username = username;this.birthday = birthday;this.sex = sex;this.address = address;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +'}';}
}
Account
package com.qcby.pojo;/*
* 多
* */
public class Account {private Integer id;private String money;private Integer uid;//多对一private User user;public Account() {}public Account(Integer id, String money, Integer uid, User user) {this.id = id;this.money = money;this.uid = uid;this.user = user;}public Integer getUid() {return uid;}public void setUid(Integer uid) {this.uid = uid;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getMoney() {return money;}public void setMoney(String money) {this.money = money;}@Overridepublic String toString() {return "Account{" +"id=" + id +", money='" + money + '\'' +", uid=" + uid +", user=" + user +'}';}
}

(2)AccountMapper接口

package com.qcby.mapper;import com.qcby.pojo.Account;import java.util.List;public interface AccountMapper {/** 多对一:* 查询所有* */public List<Account> findAll();
}

(3)AccountMapper.xml

在 <association> 标签中,需要指定一个 column 属性,这个属性的值应该是 account 表中用来关联 user 表的外键列名: column="uid"

<?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.qcby.mapper.AccountMapper"> <!--对谁进行操作就写谁--><!--多对一:--><!--查询所有:public List<Account> findAll();--><select id="findAll" resultMap="accountMap">select * from account</select><resultMap id="accountMap" type="account"><id property="id" column="id"/><result property="money" column="money"/><result property="uid" column="uid"/><!--配置延迟加载--><association property="user" column="uid" javaType="user" select="com.qcby.mapper.UserMapper.findById"><id column="id" property="uid"/><result column="username" property="username"/><result column="birthday" property="birthday"/><result column="sex" property="sex"/><result column="address" property="address"/></association></resultMap>
</mapper>

(4)UserMapper接口

package com.qcby.mapper;import com.qcby.pojo.User;public interface UserMapper {/** 多对一:* 根据id查询* */public User findById(Integer id);
}

(5)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.qcby.mapper.UserMapper"> <!--对谁进行操作就写谁--><!--多对一--><!--根据id查询:public User findById(Integer id);--><select id="findById" parameterType="int" resultType="user">select * from user where id=#{id}</select>
</mapper>

(6)在总配置文件(mybatis-config.xml)中开启延迟加载配置

mybatis-config.xml

<settings><!--开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/><!--将积极加载改为消极加载及按需加载--><setting name="aggressiveLazyLoading" value="false"/>
</settings>

(7)测试类

package com.qcby.test;import com.qcby.mapper.AccountMapper;
import com.qcby.mapper.UserMapper;
import com.qcby.pojo.Account;
import com.qcby.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;public class demo {private InputStream inputStream;private SqlSession sqlSession;private AccountMapper accountMapper;private UserMapper userMapper;@Beforepublic void init() throws IOException {//加载配置文件inputStream= Resources.getResourceAsStream("mybatis-config.xml");//创建工厂对象SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);//创建session对象sqlSession=sqlSessionFactory.openSession();//获取到代理对象userMapper=sqlSession.getMapper(UserMapper.class);accountMapper=sqlSession.getMapper(AccountMapper.class);}/** 多对一:* account查询所有* */@Testpublic void findAllTest(){List<Account> accounts=accountMapper.findAll();for (Account account:accounts){//System.out.println("开始...");System.out.println(account.getMoney());//System.out.println("结束...");System.out.println("--------------------");}}@Afterpublic void destory() throws IOException {inputStream.close();sqlSession.close();}
}

(8)运行

可以看到此时是没有加载出来用户的信息的

(9)如果测试类中的输出语句改为

System.out.println(account.getUser().getUsername());

再运行:

可以看到此时执行了user根据id查询的sql语句

4.一对多延迟加载

(1)实体类

User类

package com.qcby.pojo;import java.util.Date;
import java.util.List;/*
* 一
* */
public class User {private Integer id;private String username;private Date birthday;private String sex;private String address;/*一对多*/private List<Account> accounts;public List<Account> getAccounts() {return accounts;}public void setAccounts(List<Account> accounts) {this.accounts = accounts;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +", accounts=" + accounts +'}';}
}

(2)UserMapper接口

/*
* 一对多:
* 查询所有
* */
public List<User> findUserAll();

(3)UserMapper.xml文件

<!--一对多-->
<!--查询所有:public List<User> findUserAll();-->
<select id="findUserAll" resultMap="userMap">select * from user
</select>
<resultMap id="userMap" type="user"><id property="id" column="id"/><result property="username" column="username"/><result property="birthday" column="birthday"/><result property="sex" column="sex"/><result property="address" column="address"/><collection property="accounts" column="id" ofType="account" select="com.qcby.mapper.AccountMapper.findAccountById"><id column="id" property="id"/><result column="money" property="money"/><result column="uid" property="uid"/></collection>
</resultMap>

(4)AccountMapper接口

/*
* 一对多:
* 根据id查询
* */
public Account findAccountById(Integer id);

(5)AccountMapper.xml文件

<!--一对多-->
<!--根据id查询:public Account findAccountById(Integer id);-->
<select id="findAccountById" parameterType="int" resultType="account">select * from account where id=#{id}
</select>

(6)在总配置文件中开启延迟加载

<settings><!--开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/><!--将积极加载改为消极加载及按需加载--><setting name="aggressiveLazyLoading" value="false"/>
</settings>

(7)测试类

/*
* 一对多:
* user查询所有
* */
@Test
public void findUserAllTest(){List<User> users=userMapper.findUserAll();for (User user:users){System.out.println(user.getUsername()+"  "+user.getAddress());System.out.println("--------------------");}
}

(8)运行

三、mybatis框架的缓存

1.概念

经常需要查询,不需要修改的数据,不特别重要的数据都可以存储到缓存中

2.一级缓存

①mybatis的一级缓存是SqlSession的缓存

②查询的时候,先从SqlSession的缓存中查找,如果有,直接返回,如果没有,再去查询数据库

(1)验证一级缓存的存在

查询两次,查看结果

查询的语句在多对一查询的时候写过了

测试类
/*
* 验证一级缓存的存在
* */
@Test
public void findUserByIdTest(){User user1=userMapper.findById(1);System.out.println(user1);User user2=userMapper.findById(1);System.out.println(user2);
}
运行

(2)一级缓存失效的四种情况

①使用不同的sqlSession对象查询
测试类
package com.qcby.test;import com.qcby.mapper.AccountMapper;
import com.qcby.mapper.UserMapper;
import com.qcby.pojo.Account;
import com.qcby.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;public class demo {private InputStream inputStream;private SqlSession sqlSession;private SqlSession sqlSession2;private AccountMapper accountMapper;private UserMapper userMapper;private UserMapper userMapper2;@Beforepublic void init() throws IOException {//加载配置文件inputStream= Resources.getResourceAsStream("mybatis-config.xml");//创建工厂对象SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);//创建session对象sqlSession=sqlSessionFactory.openSession();sqlSession2=sqlSessionFactory.openSession();//获取到代理对象userMapper=sqlSession.getMapper(UserMapper.class);userMapper2=sqlSession2.getMapper(UserMapper.class);accountMapper=sqlSession.getMapper(AccountMapper.class);}/** 一级缓存失效的四种情况:* 1.使用不同的sqlSession对象进行查询* */@Testpublic void findUserByIdTest1(){User user1=userMapper.findById(1);System.out.println(user1);User user2=userMapper2.findById(1);System.out.println(user2);}@Afterpublic void destory() throws IOException {inputStream.close();sqlSession.close();}
}
运行

②使用相同的sqlSession对象进行查询,但是查询条件不同
测试类
/** 一级缓存失效的四种情况:* 2.使用相同的sqlSession对象进行查询,但是查询条件不同* */
@Test
public void findUserByIdTest2(){User user1=userMapper.findById(1);System.out.println(user1);User user2=userMapper.findById(2);System.out.println(user2);
}
 运行

③使用相同的sqlSession对象进行查询,但是在两次执行中间我们进行了一次增删改操作
UserMapper接口
/*
* 根据id删除
* */
public int deleteById(Integer id);
UserMapper.xml
<!--根据id删除:public int deleteById(Integer id);-->
<delete id="deleteById" parameterType="int">delete from user where id=#{id}
</delete>
测试类
/** 一级缓存失效的四种情况:* 3.使用相同的sqlSession对象进行查询,但是在两次执行中间我们进行了一次增删改操作* */
@Test
public void findUserByIdTest3(){User user1= userMapper.findById(1);System.out.println(user1);userMapper.deleteById(3);sqlSession.commit();User user2=userMapper.findById(1);System.out.println(user2);
}
运行

④使用相同的sqlSession对象进行查询,但是手动清除了缓存
测试类
/** 一级缓存失效的四种情况:*  4.使用相同的sqlSession对象进行查询,但是手动清除了缓存* */
@Test
public void findUserByIdTest4(){User user1=userMapper.findById(1);System.out.println(user1);sqlSession.clearCache();//手动清理缓存User user2=userMapper.findById(1);System.out.println(user2);
}
运行

3.二级缓存

二级缓存是SqlSessionFactory级别的

(1)在总配置文件中开启二级缓存

<!--开启二级缓存-->
<settings><setting name="cacheEnabled" value="true"/><setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

(2)在映射配置文件中配置<cache>

(3)实体类实现序列化接口

(4)二级缓存必须在SqlSession关闭或提交之后

(5)证明二级缓存

二级缓存的适用对象地址不同,但是也从缓存加载,二级缓存存储的是零散数据,是组装出来的对象

测试类
package com.qcby.test;import com.qcby.mapper.UserMapper;
import com.qcby.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;public class demo2 {@Testpublic void test() throws IOException {//加载配置文件InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xml");//创建工厂对象SqlSessionFactory sqlSessionFactory=new     SqlSessionFactoryBuilder().build(inputStream);//创建session对象SqlSession sqlSession1=sqlSessionFactory.openSession();//获取到代理对象UserMapper userMapper1=sqlSession1.getMapper(UserMapper.class);//调用方法User user1=userMapper1.findById(1);System.out.println(user1);System.out.println("-----------");//手动清理缓存sqlSession1.clearCache();sqlSession1.commit();sqlSession1.close();SqlSession sqlSession2=sqlSessionFactory.openSession();UserMapper userMapper2=sqlSession2.getMapper(UserMapper.class);User user2=userMapper2.findById(1);System.out.println(user2);sqlSession2.close();inputStream.close();}
}
运行:

可以看出,sql语句只执行了一次,说明它是查的缓存,但是地址不一样,因为他从缓存里组装出来的

 

相关文章:

mybatis延迟加载、缓存

目录 一、所需表 二、延迟加载 1.延迟加载概念 2.立即加载和延迟加载的应用场景 3.多对一延迟加载查询演示 (1)实体类 User Account (2)AccountMapper接口 (3)AccountMapper.xml (4)UserMapper接口 (5)UserMapper.xml (6)在总配置文件(mybatis-config.xml)中开启延…...

云上贵州多彩宝荣获仓颉社区先锋应用奖 | 助力数字政务新突破

在信息技术应用创新的浪潮中&#xff0c;仓颉社区吸引了众多企业和开发者的积极参与&#xff0c;已有多个应用成功落地&#xff0c;展现出蓬勃的创新活力。仓颉编程语言精心遴选了在社区建设、应用创新、开源共建、技术布道等方面做出突出贡献的优秀项目应用&#xff0c;并颁发…...

设计模式02:结构型设计模式之适配器模式使用情景及其基础Demo

1.适配器模式 用途&#xff1a;接口兼容评价&#xff1a;复杂、冗余、难以调试&#xff0c;个人认为直接在旧系统那里封装一个新实现调用旧实现就好了场景&#xff1a;系统A、B、C想调用同一个功能接口&#xff0c;但是实现细节存在差异时&#xff08;其实就是入参和出参转化处…...

镭速大文件传输视频文件预览实现原理

镭速可以支持视频预览&#xff0c;在测试过程中需要大量不同格式的视频&#xff0c;如果直接去找各种格式的视频不太现实&#xff0c;所以就会用到一个视频格式转换的工具ffmpeg&#xff0c;本文将介绍ffmpeg的基本使用方法。FFmpeg 是一个免费开源的音视频处理工具&#xff0c…...

Mac上安装Label Studio

在Mac上安装Anaconda并随后安装Label Studio&#xff0c;可以按照以下步骤进行&#xff1a; 1. 在Mac上安装Anaconda 首先&#xff0c;你需要从Anaconda的官方网站下载适用于Mac的安装程序。访问Anaconda官网&#xff0c;点击“Download Anaconda”按钮&#xff0c;选择适合M…...

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本&#xff0c;并在Windows桌面中创建与修改代码&#xff0c;与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法&#xff1a;https://github.com/Martianing/gen_code git初始设置…...

低代码平台:技术复杂性的系统简化

在传统开发模式下&#xff0c;应用构建需要经历需求分析、代码开发、测试部署等多环节&#xff0c;流程繁琐且耗时&#xff0c;往往成为企业技术创新的瓶颈。低代码平台通过模块化和自动化技术重新定义开发流程&#xff0c;使开发者能够在较短时间内实现复杂的应用功能&#xf…...

物联网网关Web服务器--lighttpd服务器部署与应用测试

以下是在国产ARM处理器E2000飞腾派开发板上部署 lighttpd 并进行 CGI 应用开发的步骤&#xff1a; 1、lighttpd简介 Lighttpd 是一款轻量级的开源 Web 服务器软件&#xff0c;具有以下特点和功能&#xff1a; 特点 轻量级&#xff1a;Lighttpd 在设计上注重轻量级和高效性&a…...

Flutter+vsCode 安装问题记录

VSCode在安装完AndroidSDK以及相关插件后&#xff0c;运行Flutter项目时选择模拟器提示&#xff1a;avdmanager is missing from the Android SDK&#xff0c;确保环境变量中存在ANDROID_HOME&#xff0c;且执行了flutter config --android-sdk 地址后&#xff0c;如果还提示&a…...

【CompletableFuture实战】

CompletableFuture实战 前言 前言 过去的一年&#xff0c;匆匆忙忙&#xff0c;换了一次工作&#xff0c;写博客的习惯就落下了&#xff0c;总之&#xff0c;有点懈怠。希望今年能重拾信心&#xff0c;步入正规&#xff01; CompletableFuture的用法网上资料颇多&#xff0c;…...

【k8s面试题2025】3、练气中期

体内灵气的量和纯度在逐渐增加。 文章目录 在 Kubernetes 中自定义 Service端口报错常用控制器Kubernetes 中拉伸收缩副本失效设置节点容忍异常时间Deployment 控制器的升级和回滚日志收集资源监控监控 Docker将 Master 节点设置为可调度 在 Kubernetes 中自定义 Service端口报…...

【高可用自动化体系】自动化体系

架构设计的愿景就是高可用、高性能、高扩展、高效率。为了实现架构设计四高愿景&#xff0c;需要实现自动化系统目标&#xff1a; 标准化。 流程自助化。 可视化&#xff1a;可观测系统各项指标、包括全链路跟踪。 自动化&#xff1a;ci/cd 自动化部署。 精细化&#xff1a…...

Spring boot框架下的RocketMQ消息中间件

1. RocketMQ 基础概念 1.1 核心概念 以下是 RocketMQ 核心概念在 Spring Boot 的 Java 后端代码中的实际使用方式&#xff1a; Producer&#xff08;生产者&#xff09; 定义&#xff1a;Producer 是负责发送消息到 RocketMQ 的组件。它可以将消息发送到指定的 Topic。 实…...

http转化为https生成自签名证书

背景 项目开发阶段前后交互采用http协议&#xff0c;演示环境采用htttps协议 &#xff0c;此处为个人demo案例 组件 后端&#xff1a;springBoot 前端&#xff1a;vue web 服务&#xff1a;tomcat 部署环境&#xff1a;linux 生成自签名证书 创建目录 存储证书位置 # mkdir -p…...

关于2025年智能化招聘管理系统平台发展趋势

2025年&#xff0c;招聘管理领域正站在变革的十字路口&#xff0c;全新的技术浪潮与不断变化的职场生态相互碰撞&#xff0c;促使招聘管理系统成为重塑企业人才战略的关键力量。智能化招聘管理系统平台在这一背景下迅速崛起&#xff0c;其发展趋势不仅影响企业的招聘效率与质量…...

CentOS 9 Stream 上安装 Node.js 18.20.5

要在 CentOS 9 Stream 上安装 Node.js 18.20.5&#xff0c;可以按照以下步骤操作&#xff1a; 1. 安装依赖 首先&#xff0c;确保你已经更新了系统并安装了必要的依赖包。 sudo dnf update -y sudo dnf install -y gcc-c make2. 安装 Node.js 18.20.5 Node.js 官方提供了一…...

NSIS 创建一键安装程序

nsis 安装redis 、mysql 、jdk navicat、 notepad、 使用NSIS 创建一键安装程序 分为两步 下载 NSIS编写 一键安装代码 1.16脚本 ; 请求管理员权限运行安装程序 RequestExecutionLevel admin; 该脚本使用 HM VNISEdit 脚本编辑器向导产生; 安装程序初始定义常量 !define PRO…...

NanoKVM简单开箱测评和拆解,让普通电脑实现BMC/IPMI远程管理功能

Sipeed推出了NanoKVM&#xff0c;简直是没有BMC的台式机和工作站的福音。有了这个就可以轻松实现以往服务器才有的远程管理功能。 NanoKVM 简介 Lichee NanoKVM 是基于 LicheeRV Nano 的 IP-KVM 产品&#xff0c;继承了 LicheeRV Nano 的极致体积 和 强大功能。 NanoKVM 包含…...

【混合开发】CefSharp+Vue桌面应用程序开发

为什么选择CefSharpVue做桌面应用程序 CefSharp 基于 Chromium Embedded Framework (CEF) &#xff0c;它可以将 Chromium 浏览器的功能嵌入到 .NET 应用程序中。通过 CefSharp&#xff0c;开发者可以在桌面应用程序中集成 Web 技术&#xff0c;包括 HTML、JavaScript、CSS 等…...

2024最新版JavaScript逆向爬虫教程-------基础篇之Chrome开发者工具学习

目录 一、打开Chrome DevTools的三种方式二、Elements元素面板三、Console控制台面板四、Sources面板五、Network面板六、Application面板七、逆向调试技巧 7.1 善用搜索7.2 查看请求调用堆栈7.3 XHR 请求断点7.4 Console 插桩7.5 堆内存函数调用7.6 复制Console面板输出 工…...

下定决心不去读研了。。。

大家好&#xff0c;我是苍何。 之前发表过一篇文章&#xff0c;表达了自己读研的困惑和纠结&#xff0c;得到了大家很多的建议&#xff0c;也引起了很多人的共鸣&#xff0c;在留言区分享了自己的故事&#xff0c;看着这些故事&#xff0c;我觉得都够苍何写一部小说了。 可惜苍…...

Java21 正则表达式

在 Java 21 中&#xff0c;正则表达式主要通过 java.util.regex 包提供支持&#xff0c;其核心组件包括 Pattern、Matcher 和 String 类中自带的方法&#xff08;如 replaceAll 和 matches&#xff09;。以下是关于正则表达式在 Java 21 中的详细介绍及一些新的特性或用法。 核…...

Docker安装PostGreSQL docker安装PostGreSQL 完整详细教程

Docker安装PostGreSQL docker安装PostGreSQL 完整详细教程 Docker常用命令大全Docker 运行命令生成Docker 上安装 PostGreSQL 14.15 的步骤&#xff1a;1、拉取 PostGreSQL 14.15 镜像2、创建并运行容器3、测试连接4、设置所有IP都可以运行连接进入容器内 修改配置文件关闭容器…...

leetcode:205. 同构字符串(python3解法)

难度&#xff1a;简单 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符的顺序。不同字符不能映射到同一个字…...

【Javascript Day9】对象定义、数组中对象元素排序、对象在内存中存储方法、对象构建联系

目录 . 取值运算符 > 用于对象属性或方法的调用操作 [] 取值运算符 > 可用于数组下标或者对象属性的取值操作 数组对象的排序 对象在内存中存储方式 对象的三种定义方式 1. 字面量对象 2. 基于Object构造对象 3. 自定义对象构造器创建对象 对象的构建练习 . 取值…...

运维作业一

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 2、写一个 shel1 脚本,实现批量添加 20个用户,用户名为user01-20,密码为user 后面跟5个随机字符。 首先&#xff0c;获得随机字符&#xff0c;需下载pwgen&am…...

数仓建模(三)建模三步走:需求分析、模型设计与数据加载

本文包含&#xff1a; 数据仓库的背景与重要性数据仓库建模的核心目标本文结构概览&#xff1a;需求分析、模型设计与数据加载 目录 第一部分&#xff1a;需求分析 1.1 需求分析的定义与目标 1.2 需求分析的步骤 1.2.1 业务需求收集 1.2.2 技术需求分析 1.2.3 成果输出…...

C语言的网络编程

C语言的网络编程 引言 随着互联网的快速发展&#xff0c;网络编程已经成为计算机科学与技术领域中不可或缺的一部分。C语言作为一种底层语言&#xff0c;以其高效、快速和灵活的特性&#xff0c;广泛应用于网络编程中。本文将深入探讨C语言在网络编程中的应用&#xff0c;包括…...

EE213 Lab3 virtuoso NAND NOR INV XOR HA designlayout(min size layout method)

目录 0 前言 1 设计目标 2 减小面积的layout画法 3 NAND 4 NOR 5 INV 6 XOR 7 HA 0 前言 记录一下来到skd上的强度比较大的一门课&#xff0c;数字集成电路2的lab设计还是蛮好的&#xff0c;该帖非详细教程只是单纯的写一些思虑并用作笔记&#xff0c;新手小白欢迎交…...

Qt——QTableWidget 限制单元格输入范围的方法(正则表达式输入校验法、自定义代理类MyItemDelegrate)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》...

mono3d汇总

lidar坐标系 lidar坐标系可以简单归纳为标准lidar坐标系和nucense lidar坐标系&#xff0c;参考链接。这个坐标系和车辆的ego坐标系是一致的。 标准lidar坐标系 opendet3d&#xff0c;mmdetection3d和kitt都i使用了该坐标系 up z^ x front| /| /left y <------ 0kitti采…...

机器学习第一道菜(一):线性回归的理论模型

机器学习第一道菜&#xff08;一&#xff09;&#xff1a;线性回归的理论模型 一、问题&#xff1a;千金买笑1.1 散点图1.2 机器学习能搞啥 二、模型的建立2.1 线性回归2.2 回归模型 前面讲了机器学习的“四大绝技”&#xff0c;今天&#xff0c;开始研究第一绝技“回归”&…...

Unity的Transform类

1.position 游戏对象的世界坐标以(0, 0, 0)为原点 2.localPosition 本地坐标&#xff0c;相对父物体坐标 3.eulerAngles 相对世界的欧拉角 4.localEulerAngles 本地欧拉角 5.rotation 相对世界四元数 6.localRotation 本地四元…...

指针的进阶

指针的主题&#xff0c;我们在初级阶段的《指针》章节已经接触过了&#xff0c;我们知道了指针的概念&#xff1a; 1. 指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节&#xff08;32位平台/64位平台&#xff0…...

每日学习30分轻松掌握CursorAI:Cursor插件系统与扩展功能

Cursor插件系统与扩展功能 一、课程概述 今天我们将学习Cursor AI的插件系统&#xff0c;了解如何通过插件扩展和增强IDE功能。由于Cursor AI基于VS Code开发&#xff0c;我们可以利用丰富的VS Code插件生态系统。 1.1 学习目标 了解插件系统原理掌握插件安装管理使用常用开…...

【WEB】网络传输中的信息安全 - 加密、签名、数字证书与HTTPS

文章目录 1. 概述2. 网络传输安全2.1.什么是中间人攻击2.2. 加密和签名2.2.1.加密算法2.2.2.摘要2.2.3.签名 2.3.数字证书2.3.1.证书的使用2.3.2.根证书2.3.3.证书链 2.4.HTTPS 1. 概述 本篇主要是讲解讲一些安全相关的基本知识&#xff08;如加密、签名、证书等&#xff09;&…...

Dexie.js内存管理技巧:在大型数据集操作中避免浏览器崩溃

Dexie.js 内存管理技巧&#xff1a;避免浏览器崩溃 在使用 Dexie.js 操作 大型数据集 时&#xff0c;如果不注意内存管理&#xff0c;可能会导致浏览器内存溢出&#xff08;OOM&#xff0c;Out of Memory&#xff09;或崩溃。因此&#xff0c;以下 内存管理技巧 可用于优化性能…...

vscode项目依赖问题

必读 一定要将前端下拉的项目备份一下&#xff0c;很容易运行导致依赖报错&#xff0c;重新下载 命令 使用幽灵分解器安装 pnpm install 替代 npm install 设置淘宝NPM镜像源 yarn config set registry https://registry.npmmirror.com 查看目前依赖包的版本 npm list ant-d…...

LLMs之RAG:《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读

LLMs之RAG&#xff1a;《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读 导读&#xff1a;这篇论文针对在资源受限的边缘设备上部署检索增强生成 (RAG) 系统的挑战&#xff0c;提出了一种名为 EdgeRAG 的高效方法。EdgeRAG 通过巧妙地结合预计算、在线生成和缓存策…...

宇泰串口卡驱动在Ubuntu22.04编译、安装汇总

从官网下载驱动官网地址 上传到Ubuntu, 目录结构如下&#xff1a; 驱动源代码: 驱动代码是基于开源项目编译来的 编译路径不能有中文路径&#xff0c;否则可能有类似错误 源码是基于Linux2.3内核编译&#xff0c;我当前是6.8.0-51&#xff0c;数据结构有升级&#xff0c;需要调…...

python管理工具:conda部署+使用

python管理工具&#xff1a;conda部署使用 一、安装部署 1、 下载 - 官网下载&#xff1a; https://repo.anaconda.com/archive/index.html - wget方式&#xff1a; wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh2、 安装 在conda文件的…...

(三)html2canvas将HTML 转为图片并实现下载

将 HTML 转为图片并实现下载&#xff0c;通常可以使用一个叫做 html2canvas 的 JavaScript 库。html2canvas 能够将 HTML 元素及其样式渲染成一个画布 (Canvas)&#xff0c;然后将该画布转换为图片格式&#xff08;如 PNG 或 JPEG&#xff09;&#xff0c;最终提供下载功能。 …...

安装Docker流程

1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 2.配置Docker的yum库 首先要安装一个…...

flutter 使用google_mlkit_image_labeling做图片识别

在AI横行的如今&#xff0c;相信大家或多或少都做过跟AI接轨的需求了吧&#xff1f;今天我说的是关于图片识别的需求&#xff0c;flutter的专属图片识别插件google_mlkit_image_labeling。 google_mlkit_image_labeling它是Google旗下的Google Cloud Vision API中分支出来的一部…...

宝塔php7.4安装报错,无法安装,php8以上可以安装,以下的不行,gd库什么的都正常

宝塔的依赖问题导致的问题&#xff0c;最后手动挂载后才解决。。。废了三天三夜终于搞好了。。。。无语&#xff5e; 建议&#xff1a;不要一直升级宝塔版本&#xff0c;升级前备份或者开服务商的实例镜像&#xff0c;方便恢复&#xff0c;不然&#xff0c;可就GG了&#xff5…...

python中的RPA->playwright自动化录制脚本实战案例笔记

playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器&#xff1a;cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令&#xff1a; playwright codegen…...

Python在DevOps中的应用:自动化CI/CD管道的实现

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 在现代软件开发中&#xff0c;DevOps理念的引入极大地提升了开发与运维的协作效率&#xff0c;而持续集成&#xff08…...

Centos 离线安装杀毒软件

离线部署实现&#xff1a; 1、去官网下载对应的软件包&#xff0c;centos就下载 .rpm软件包。https://www.clamav.net/downloads2、将下载的软件包上传到服务器后使用rpm命令进行安装&#xff0c;软件包里面已经将相关依赖这些打包好了&#xff0c;直接安装就行。 rpm -ivh --…...

TiDB使用过程中需要注意的坑点:避免踩雷

TiDB使用过程中需要注意的坑点&#xff1a;避免踩雷 TiDB作为一个分布式数据库&#xff0c;虽然在许多场景下表现出色&#xff0c;但在使用过程中也有一些“坑”需要开发者特别注意。尤其是在生产环境中&#xff0c;踩雷可能会导致性能问题&#xff0c;甚至系统宕机。今天&…...

Mysql--实战篇--大数据量表的分页优化(自增长主键,子查询主键主查询全部,查询条件加索引,覆盖索引等)

当Mysql数据表存储大量数据时&#xff08;百万级别数据&#xff09;&#xff0c;分页查询的性能问题是一个常见的挑战。特别是当使用LIMIT和OFFSET时&#xff0c;随着OFFSET的增加&#xff0c;查询性能会显著下降。原因在于MySQL需要扫描并跳过前面的行&#xff0c;这会导致I/O…...