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

JDBC工具类

目录

引言

一、JDBC连接数据库步骤

1. 加载驱动

2. 获取连接(URL 用户名  密码)

3. 编写sql

4. 获取执行sql的stmt的对象

5. 执行sql  拿到结果集

6. 遍历结果集

7. 关闭资源(先开的后关 后开的先关)

二、JDBC工具类

版本一:基础JDBC工具类(JdbcUtils)

版本二:配置化JDBC工具类(JdbcUtils2)

版本三:连接池JDBC工具类(JdbcUtils3)

测试

总结


引言

        JDBC(Java Database Connectivity)是Java连接数据库的标准API,但在实际开发中直接使用原始JDBC API会带来大量重复代码。本文将介绍三种不同版本的JDBC工具类实现,展示如何通过逐步优化来提高开发效率和代码质量。

一、JDBC连接数据库步骤

1. 加载驱动

        首先,需要加载数据库驱动。驱动是各个数据库生产商提供的实现类,用于实现JDBC接口规范。对于MySQL数据库,需要导入mysql-connector-java-5.1.13-bin.jar驱动包。

        在Java代码中,通常使用以下方式加载驱动:

Class.forName("com.mysql.jdbc.Driver");

​注意​​:通过Class.forName("com.mysql.jdbc.Driver")加载驱动,可以避免直接使用new Driver()方式带来的依赖问题和驱动jar包加载两次的问题。

2. 获取连接(URL 用户名  密码)

        加载驱动后,需要获取数据库连接。使用DriverManager类的getConnection方法,传入数据库连接URL、用户名和密码。

String url = "jdbc:mysql:///spring_db"; // 如果是本地数据库,localhost:3306可以省略
String user = "root";
String password = "12345";
Connection conn = DriverManager.getConnection(url, username, password);

​URL格式​​:jdbc:mysql://localhost:3306/spring_db

  • jdbc:主协议

  • mysql:子协议(可能变化)

  • localhost:主机

  • 3306:默认端口号

  • spring_db:数据库名称

3. 编写sql

        接下来,编写需要执行的SQL语句。SQL语句可以是查询、插入、更新或删除操作。

String sql = "SELECT * FROM t_user";

4. 获取执行sql的stmt的对象

        有两种方式获取执行SQL的对象:StatementPreparedStatement

Statement

   Statement接口用于执行静态SQL语句,但存在SQL注入问题(字符串拼接)。

Statement stmt = conn.createStatement();

​注意​​:Statement接口虽然简单易用,但在处理用户输入时容易受到SQL注入攻击。例如,如果用户输入的用户名或密码包含恶意SQL代码,可能会导致数据库泄露或被篡改。

PreparedStatement

   PreparedStatementStatement的子接口,支持预编译SQL语句,采用占位符的形式,能有效防止SQL注入问题。推荐使用。

String sql = "SELECT * FROM t_user WHERE username = ? AND password = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username); // 设置第一个参数
pstmt.setString(2, password); // 设置第二个参数

​注意​​:使用PreparedStatement时,SQL语句中的参数用?占位符代替,再通过setXxx方法设置具体值。这种方式不仅提高了代码的可读性和可维护性,还能有效防止SQL注入攻击。

5. 执行sql  拿到结果集

        执行SQL语句并获取结果集。如果是查询语句,返回的结果集封装在ResultSet接口中。

ResultSet rs = pstmt.executeQuery(); // 查询语句
// int affectedRows = pstmt.executeUpdate(); // 增删改语句

​注意​​:executeQuery方法用于执行查询语句,返回一个ResultSet对象;executeUpdate方法用于执行增删改语句,返回受影响的行数。

6. 遍历结果集

        遍历ResultSet结果集,获取查询的数据。

while (rs.next()) {int id = rs.getInt("id");String username = rs.getString("username");String password = rs.getString("password");String email = rs.getString("email");System.out.println(id + ", " + username + ", " + password + ", " + email);
}

​注意​​:ResultSet内部维护一个游标,默认指向第一行数据之前,调用next()方法向下移动游标。获取值的方法有多种,如getIntgetString等,可以根据字段类型选择合适的方法。

7. 关闭资源(先开的后关 后开的先关)

        最后,必须关闭所有打开的资源,包括ResultSetStatementConnection对象。关闭资源的代码一般放在finally块中,确保一定会执行。

if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}
}
if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}
}
if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}
}

​注意​​:关闭资源的顺序应与打开的顺序相反,即先开的后关,后开的先关。这样可以确保资源的正确释放,避免内存泄漏和资源占用问题。

        通过以上步骤,我们可以使用JDBC连接数据库并执行SQL操作。结合PreparedStatement可以有效防止SQL注入问题,确保数据库操作的安全性。

二、JDBC工具类

版本一:基础JDBC工具类(JdbcUtils)

        这是最基础的JDBC工具类实现(加载驱动,获取连接和关闭资源可提取出来,重复使用,即JDBC工具类1.0版本),主要解决了驱动加载和连接获取的基本需求。

package com.qcby.utils;import com.mysql.jdbc.Driver;import java.sql.*;/*** JDBC工具类 简化开发* 减少重复性代码* JDBC的工具类 1.0版本*/
public class JdbcUtils {/*** 加载驱动*/public static void createDriver(){try{//2种//1.直接调用方法DriverManager.registerDriver(new Driver());//2.反射加载//Class.forName("com.mysql.jdbc.Driver");}catch (Exception e){e.printStackTrace();}}/*** 获取连接* @return*/public static Connection getConnection(){Connection connection=null;try {//1.加载驱动createDriver();//2.获取连接connection=DriverManager.getConnection("jdbc:mysql:///spring_db","root","12345");}catch (SQLException e){e.printStackTrace();}return connection;}/*** 关闭资源*///1.查询 重载方法public static void close(Connection connection, ResultSet resultSet, Statement statement){try{resultSet.close();statement.close();connection.close();}catch (SQLException e){e.printStackTrace();}}//2.增删改public static void close(Connection connection, Statement statement){try{statement.close();connection.close();}catch (SQLException e){e.printStackTrace();}}
}

特点分析

  1. ​优点​​:

    • 简单直接,适合小型项目或快速原型开发

    • 封装了基本的连接获取和资源关闭操作

  2. ​缺点​​:

    • 硬编码数据库连接信息,不利于维护

    • 每次调用都会重复注册驱动(虽然JDBC规范允许重复注册,但不推荐)

    • 缺乏异常处理机制

    • 没有连接池支持,性能较差

版本二:配置化JDBC工具类(JdbcUtils2)

        这个版本通过读取配置文件来提高灵活性,解决了硬编码问题。

package com.qcby.utils;import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** JDBC的工具类 2.0版本(智能一些),编写properties属性文件,程序就可以读取属性文件*      1. 驱动类*      2. 数据库地址*      3. 用户名*      4. 密码*/
public class JdbcUtils2 {//静态不可更改常量private static final String diverclass;private static final String url;private static final String username;private static final String password;//静态代码块 类一加载的时候就会执行,调用的这个类的时候static {//加载db.properties文件读取链接数据库的所有参数// 加载属性文件Properties pro = new Properties();InputStream inputStream = JdbcUtils.class.getResourceAsStream("/db.properties");// 加载属性文件try {pro.load(inputStream);} catch (IOException e) {e.printStackTrace();}// 给常量赋值diverclass = pro.getProperty("driverclass");url = pro.getProperty("url");username = pro.getProperty("username");password = pro.getProperty("password");}/*** 加载驱动*/public static void createDriver(){try{//2种//1.直接调用方法//DriverManager.registerDriver(new Driver());//2.反射加载Class.forName(diverclass);}catch (Exception e){e.printStackTrace();}}/*** 获取连接* @return*/public static Connection getConnection(){Connection connection=null;try {//1.加载驱动createDriver();//2.获取连接connection= DriverManager.getConnection(url,username,password);}catch (SQLException e){e.printStackTrace();}return connection;}/*** 关闭资源*///1.查询public static void close(Connection connection, ResultSet resultSet, Statement statement){try{resultSet.close();statement.close();connection.close();}catch (SQLException e){e.printStackTrace();}}//2.增删改public static void close(Connection connection, Statement statement){try{statement.close();connection.close();}catch (SQLException e){e.printStackTrace();}}
}
#db.properties
driverclass=com.mysql.jdbc.Driver
url=jdbc:mysql:///spring_db
username=root
password=12345

改进点

  1. ​配置文件支持​​:

    • 将数据库连接信息移到db.properties文件中

    • 通过Properties类加载配置

  2. ​异常处理改进​​:

    • 将检查异常转换为运行时异常,强制调用方处理

  3. ​驱动加载优化​​:

    • 使用Class.forName()替代直接注册驱动

仍然存在的问题

  1. 仍然没有连接池支持

  2. 资源管理可以更完善

  3. 配置文件路径硬编码

版本三:连接池JDBC工具类(JdbcUtils3)

        这是最完善的版本,引入了连接池技术(Druid)来提高性能和资源利用率。

package com.qcby.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** JDBC的工具类 1.0版本* JDBC的工具类 2.0版本(智能一些),编写properties属性文件,程序就可以读取属性文件* JDBC的工具类 3.0版本,加入连接池对象*/
public class JdbcUtils3 {// 连接池对象private static DataSource DATA_SOURCE;static{// 加载属性文件Properties pro = new Properties();InputStream inputStream = JdbcUtils3.class.getResourceAsStream("/druid.properties");try {// 加载属性文件pro.load(inputStream);// 创建连接池对象DATA_SOURCE = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}/*** 从连接池中获取连接,返回。* @return*/public static Connection getConnection(){Connection conn = null;try {conn = DATA_SOURCE.getConnection();} catch (SQLException e) {e.printStackTrace();}return conn;}/*** 关闭资源* @param conn* @param stmt* @param rs*/public static void close(Connection conn, ResultSet rs, Statement stmt){if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭资源* @param conn* @param stmt*/public static void close(Connection conn, Statement stmt){if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}
#druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///spring_db
username=root
password=12345
initialSize=5
maxActive=10
maxWait=3000
maxIdle=6
minIdle=3

核心优势

  1. ​连接池支持​​:

    • 使用Druid连接池,显著提高性能

    • 连接可复用,减少创建和销毁开销

  2. ​配置灵活性​​:

    • 所有数据库配置(包括连接池参数)都通过druid.properties管理

    • 可以轻松调整连接池大小、超时时间等参数

  3. ​更健壮的异常处理​​:

    • 构造阶段失败会抛出运行时异常

    • 方法内部捕获异常但不吞掉,便于排查问题

  4. ​资源管理优化​​:

    • 虽然关闭逻辑与版本二类似,但配合连接池使用更合理

最佳实践建议

  1. ​异常处理​​:

    • 生产环境中应使用日志框架记录异常,而不是简单打印

    • 考虑自定义异常类提供更友好的错误信息

  2. ​资源管理​​:

    • 使用try-with-resources语法(Java 7+)自动关闭资源

    • 对于连接池,close()方法实际上是将连接返回到池中

  3. ​连接池选择​​:

    • Druid是不错的选择,也可以考虑HikariCP(性能更好)

    • 根据项目需求配置合适的连接池参数

  4. ​SQL操作​​:

    • 对于生产代码,应使用PreparedStatement防止SQL注入

    • 考虑使用ORM框架(MyBatis、Hibernate)进一步简化开发

特性1.0版本2.0版本3.0版本
配置管理硬编码配置文件连接池专属配置
连接创建每次新建每次新建连接池复用
性能表现差(100ms/次)优(<10ms/次)
并发支持队列机制
适用场景学习/测试小型项目生产环境

测试

package com.qcby.model;/*** 对应数据库的账户表* 实体类*/
public class Account {private Integer id;private String name;private Double money;public Account(){}public Account(Integer id, String name, Double money) {this.id = id;this.name = name;this.money = money;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}@Overridepublic String toString() {return "Account{" +"id=" + id +", name='" + name + '\'' +", money=" + money +'}';}
}
package com.qcby.dao;import com.qcby.model.Account;
import com.qcby.utils.JdbcUtils;
import com.qcby.utils.JdbcUtils2;
import com.qcby.utils.JdbcUtils3;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class JdbcDao {public void select01(){Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {//jdbc连接数据库//1.加载驱动//2.获取连接(URL 用户名  密码)connection = JdbcUtils.getConnection();//3.编写sqlString sql="select * from account";//4.获取执行sql的stmt的对象statement = connection.createStatement();// 两个  stmt(sql注入问题 字符串拼接)  pstmt(预编译 防止sql植入问题  占位符))//5.执行sql  拿到结果集resultSet = statement.executeQuery(sql);//6.遍历结果集while (resultSet.next()){Account account=new Account();account.setId(resultSet.getInt("id"));account.setName(resultSet.getString("username"));account.setMoney(resultSet.getDouble("money"));System.out.println(account);}} catch (SQLException e) {e.printStackTrace();}finally {//7.关闭资源(先开的后关 后开的先关)JdbcUtils.close(connection, resultSet, statement);}}public static void main(String[] args) {Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {//jdbc连接数据库//1.加载驱动//2.获取连接(URL 用户名  密码)connection = JdbcUtils3.getConnection();//3.编写sqlString sql="select * from account";//4.获取执行sql的stmt的对象statement = connection.createStatement();// 两个  stmt(sql注入问题 字符串拼接)  pstmt(预编译 防止sql植入问题  占位符))//5.执行sql  拿到结果集resultSet = statement.executeQuery(sql);//6.遍历结果集while (resultSet.next()){Account account=new Account();account.setId(resultSet.getInt("id"));account.setName(resultSet.getString("name"));account.setMoney(resultSet.getDouble("money"));System.out.println(account);}} catch (SQLException e) {e.printStackTrace();}finally {//7.关闭资源(先开的后关 后开的先关)JdbcUtils3.close(connection, resultSet, statement);}}//    public void select(){
//        //jdbc连接数据库
//        //1.加载驱动
//        //2.获取连接(URL 用户名  密码)
//        //3.编写sql
//        //4.获取执行sql的stmt的对象
//        // 两个  stmt(sql注入问题 字符串拼接)  pstmt(预编译 防止sql植入问题  占位符))
//        //5.执行sql  拿到结果集
//        //6.遍历结果集
//        //7.关闭资源(先开的后关 后开的先关)
//    }
}

总结

JDBC工具类的演进反映了软件开发中"封装重复、提高灵活性、优化性能"的普遍原则:

  1. ​基础版​​:解决基本功能,适合简单场景

  2. ​配置化版​​:通过外部配置提高灵活性

  3. ​连接池版​​:引入连接池提升性能和资源利用率

在实际项目中,建议直接使用成熟的ORM框架或经过充分测试的JDBC工具类库,除非有特殊需求需要自定义实现。

相关文章:

JDBC工具类

目录 引言 一、JDBC连接数据库步骤 1. 加载驱动 2. 获取连接&#xff08;URL 用户名 密码&#xff09; 3. 编写sql 4. 获取执行sql的stmt的对象 5. 执行sql 拿到结果集 6. 遍历结果集 7. 关闭资源&#xff08;先开的后关 后开的先关&#xff09; 二、JDBC工具类 版…...

【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

InnoDB结构与表空间文件页的详解

目录 1.InnoDB的概览 表空间文件在哪里&#xff1f; 为什么要设计成内存结构和磁盘结构&#xff1f; 表空间与表空间文件关系&#xff1f; 用户数据如何在表空间文件存储&#xff1f; 2.页 如何设置页的大小&#xff1f; 页的结构及在表空间的位置&#xff1f; 页头包…...

计算机网络基础科普

IP地址是计算机网络中标识设备的唯一地址 IPv4&#xff08;32位&#xff09;IPv6&#xff08;128位&#xff09; 1.IPv4&#xff08;32位&#xff09; 简介&#xff1a;IPv4&#xff08;Internet Protocol version 4&#xff09;是互联网协议&#xff08;IP&#xff09;的…...

PostgreSQL 的 pg_advisory_lock_shared 函数

PostgreSQL 的 pg_advisory_lock_shared 函数详解 pg_advisory_lock_shared 是 PostgreSQL 提供的共享咨询锁函数&#xff0c;允许多个会话同时获取相同键值的共享锁&#xff0c;但排斥排他锁。 共享咨询锁 vs 排他咨询锁 锁类型共享锁 (pg_advisory_lock_shared)排他锁 (pg…...

Win11安装APK方法详解

1、官方win11系统 预览版 开发版 正式版 都行 2、同时你还需要开启主板 BIOS 虚拟化选项&#xff08;具体名称不同主板略有不同&#xff09; 这一步自行百度 开始&#xff1a;先去确定有没有开启虚拟化 任务管理器检查—— 虚拟化是否已经开启&#xff0c;如果没有自己去BIO…...

kafka的安装及简单使用

kafka 1、什么是kafka kafka是一个分布式事件流平台&#xff0c;核心功能有发布/订阅消息系统、实时处理数据流等&#xff0c;Kafka非常适合超大数据量场景。 2、kafka安装 &#xff08;1&#xff09;下载 在kafka官网下载二进制压缩包 &#xff08;2&#xff09;解压安…...

圆角边框 盒子阴影 文字阴影

一.圆角边框 在css3中&#xff0c;新增了圆角边框样式&#xff0c;这样我们的盒子就可以变成圆角了 1.border-radius border-radius属性用于设置元素的外边框圆角 border-radius&#xff1a;length&#xff1b; radius半径(圆的半径)原理&#xff1a;椭圆与矩形边框的交集形…...

LRU CPP实现

缓存结构&#xff1a; 使用一个双向链表&#xff08;std::list<int>&#xff09;保存缓存中的页面编号&#xff0c;越靠前的是最近访问的&#xff0c;越靠后的是最久未访问的。 使用一个哈希表&#xff08;std::unordered_map<int, list<int>::iterator>&am…...

C/C++复习-- C语言初始基础

C语言初始基础 本文结合代码实例与理论解析&#xff0c;系统讲解C语言的核心知识点&#xff0c;涵盖数据类型、控制结构、函数、指针、结构体等核心内容&#xff0c;并辅以常见错误分析与进阶技巧。通过对比文件一代码与文件二理论&#xff0c;帮助初学者构建完整的C语言知识框…...

小刚说C语言刷题—1078求恰好使s=1+1/2+1/3+…+1/n的值大于X时n的值

1.题目描述 求恰好使 s11/21/3⋯1/n 的值大于 X 时 n 的值。( 2≤x≤10 ) 输入 输入只有一行&#xff0c;包括 1个整数 X 。 输出 输出只有一行&#xff08;这意味着末尾有一个回车符号&#xff09;&#xff0c;包括 1 个整数。 样例 输入 2 输出 4 2.参考代码(C语言…...

深度学习篇---MediaPipe 及其人体姿态估计模型详解

文章目录 前言一、MediaPipe 核心特点跨平台支持实时性能模块化设计预训练模型 二、MediaPipe 人体姿态估计模型1. MediaPipe Pose (BlazePose)模型特点实时性能两种变体LiteHeavy 关键点定义技术细节检测器关键点预测器支持3D姿态估计 2. MediaPipe Holistic模型特点更全面的检…...

Embedding 的数学特性与可视化解析

一、向量空间的可视化解码 1.1 GloVe 词向量实例 取词向量维度 d 50 d50 d50 的 GloVe 嵌入示例&#xff1a; king_vec [[0.50451, 0.68607, -0.59517, -0.022801, 0.60046, -0.13498, -0.08813, 0.47377, -0.61798, -0.31012, -0.076666, 1.493, -0.034189, -0.98173, 0…...

“睿思 BI” 系统介绍

“睿思 BI” 商业智能系统是由成都睿思商智科技有限公司自主研发的企业数据分析系统&#xff0c;以下是对该系统的详细介绍&#xff1a; 功能模块 &#xff1a; • 数据集成与准备 &#xff1a;支持数据导入、数据填报、数据 ETL 等功能&#xff0c;可抽取企业在经营过程中产生…...

[ctfshow web入门] web69

信息收集 使用cinclude("php://filter/convert.base64-encode/resourceindex.php");读取的index.php if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); }解题 查目录 百度了一下有哪些打印函数&#xff0c;var_export能用 var_exp…...

AI赋能研究工作:我的深度学习助手使用体验(DeepResearch)

在过去一年多的时间里&#xff0c;AI工具在国内经历了数次大规模普及与质量波动。作为一名研究工作者&#xff0c;我一直在寻找稳定高效的AI解决方案来辅助日常工作。今天想分享一个让我受益良多的平台——GPTYOU.com 为什么它值得一试&#xff1f; 和市面上众多同类产品相比…...

Vue基础(8)_监视属性、深度监视、监视的简写形式

监视属性(watch)&#xff1a; 1.当被监视的属性变化时&#xff0c;回调函数(handler)自动调用&#xff0c;进行相关操作。 2.监视的属性必须存在&#xff0c;才能进行监视&#xff01;&#xff01; 3.监视的两种写法&#xff1a; (1).new Vue时传入watch配置 (2).通过vm.$watc…...

STM32硬件I2C驱动OLED屏幕

本文基于STM32硬件I2C驱动SSD1306 OLED屏幕&#xff0c;提供完整的代码实现及关键注意事项&#xff0c;适用于128x32或128x64分辨率屏幕。代码通过模块化设计&#xff0c;支持显示字符、数字、汉字及位图&#xff0c;并优化了显存刷新机制。 零、完整代码 完整代码: 1&#x…...

2021-11-16 C++歌手去掉2最高2最低均分

缘由大学一年级c编程题目-编程语言-CSDN问答 void 歌手去掉2最高2最低均分() {//缘由https://ask.csdn.net/questions/7551893?spm1005.2025.3001.5141int n 0, h 0, j 0, qd[6]{0}, fs[50]{0};scanf_s("%d", &n); j n; qd[2] qd[3] INT_MAX; qd[0] qd[…...

Vue插槽(Slots)详解

文章目录 1. 插槽简介1.1 什么是插槽&#xff1f;1.2 为什么需要插槽&#xff1f;1.3 插槽的基本语法 2. 默认插槽2.1 什么是默认插槽&#xff1f;2.2 默认插槽语法2.3 插槽默认内容2.4 默认插槽实例&#xff1a;创建一个卡片组件2.5 Vue 3中的默认插槽2.6 默认插槽的应用场景 …...

[虚幻官方教程学习笔记]深入理解实时渲染(An In-Depth Look at Real-Time Rendering)

原英文教程地址深入理解实时渲染&#xff08;An In-Depth Look at Real-Time Rendering&#xff09; 文章目录 1.Intro to An In-Depth Look at Real-Time RenderingCPU VS GPUDeferred VS Forward 2. Before Rendering and OcclusionCulling计算的步骤使用console command:fre…...

【bibtex4word】在Word中高效转换bib参考文献,Texlive环境安装bibtex4word插件

前言 现已退出科研界&#xff0c;本人水货一个。希望帮到有缘人 本篇关于如何将latex环境中的参考文献bib文件转化为word&#xff0c;和一些踩坑记录。 可以看下面的资料进行配置&#xff0c;后面的文字是这些资料的补充说明。 参考文章&#xff1a;https://blog.csdn.net/g…...

torch.nn 下的常用深度学习函数

1. 层&#xff08;Layers&#xff09; 这些函数用于定义神经网络中的各种层&#xff0c;是构建模型的基础模块。 torch.nn.Linear 用途&#xff1a;全连接层&#xff08;也称为线性层&#xff09;。用于将输入数据从一个维度映射到另一个维度&#xff0c;常用于神经网络的隐藏…...

(2025)图文解锁RAG从原理到实操

什么是RAG RAG(检索增强生成)是一种将语言模型与可搜索知识库结合的方法&#xff0c;主要包含以下关键步骤&#xff1a; 数据预处理 加载&#xff1a;从不同格式(PDF、Markdown等)中提取文本分块&#xff1a;将长文本分割成短序列(通常100-500个标记)&#xff0c;作为检索单元…...

PXE_Kickstart_无人值守自动化安装系统

文章目录 1. PXE2. 配置服务参数2.1 tftp服务配置2.2 dhcp服务配置2.3 http服务配置 3. 配置PXE环境3.1 网络引导文件pxelinux.03.2 挂载镜像文件3.3 创建配置文件default3.4 复制镜像文件和驱动文件3.5 修改default文件3.6 配置ks.cfg文件 4. PXE客户端4.1 创建虚拟机&#xf…...

Redis经典面试题

本篇文章简单介绍一些 Redis 常见的面试题。 Redis 是什么&#xff1f; Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&…...

Vite Proxy配置详解:从入门到实战应用

Vite Proxy配置详解&#xff1a;从入门到实战应用 一、什么是Proxy代理&#xff1f; Proxy&#xff08;代理&#xff09;是开发中常用的解决跨域问题的方案。Vite内置了基于http-proxy的代理功能&#xff0c;可以轻松配置API请求转发。 二、基础配置 在vite.config.js中配置…...

用AI写简历是否可行?

让AI批量写简历然后投简历是绝对不行的&#xff01;&#xff01;&#xff01; 为什么不行&#xff0c;按照 "招聘经理" 工作经历举例&#xff1a; ai提示词&#xff1a;请帮我写一份招聘经理的工作经历内容&#xff1a; 招聘经理 | XXX科技有限公司 | 2020年…...

投影显示技术全解析:主流方案对比与雷克赛恩 CyberPro1 的核心优势

目录 一、主流投影显示技术深度解析 &#xff08;一&#xff09;LCD 投影技术 &#xff08;二&#xff09;DP 投影技术 &#xff08;三&#xff09;3LCD 技术 &#xff08;四&#xff09;FSHD 技术 FSHD 技术优势 二、雷克赛恩 CyberPro1 核心优势对比分析 &#xff08…...

Skyvern:用 AI+视觉驱动浏览器自动化

Skyvern&#xff1a;用 AI视觉驱动浏览器自动化 一、前言二、项目概览2.1 Skyvern 项目简介2.2 代码结构与模块划分 三、环境搭建与快速上手3.1 环境准备3.1.1 系统与依赖3.1.2 克隆项目3.1.3 安装 Python 依赖3.1.4 配置环境变量3.1.5 启动服务 3.2 验证安装 四、核心功能与实…...

101alpha第九

alpha ((rank(ts_arg_max((vwap - close), 3)) * rank(ts_delta(volume, 3))) 今天我们来学下这个 这个是两个rank操作符相加&#xff0c;然后和另外一个操作符相乘&#xff0c;我们来看实现了什么 vwap - close&#xff1a;这部分先计算成交量加权平均价&#xff08;vwap&am…...

蓝牙身份证阅读器使用Uniapp调用二次开发demo

<template> <view class"content"> <view class"search" :loading"searchingstatus" click"searchbluetooth"> {{searchingstatus?"搜索中":"搜索蓝牙阅读器"}} </view> …...

好用的shell终端工具

FinalShell SSH工具,服务器管理 FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本4.5.12,更新日期2024.10.30 - FinalShell官网...

OSPF不规则区域划分

1、建立一条虚链路 vlink 可以被视为是⻣⼲区域的⼀段延伸。 这⼀条虚拟的链路&#xff0c;只能够跨域⼀个⾮⻣⼲区域。 [r2-ospf-1-area-0.0.0.1]vlink-peer 3.3.3.3 [r3-ospf-1-area-0.0.0.1]vlink-peer 2.2.2.2 在没有建立虚链路之前,r1是不能ping r4的。vlink建⽴的邻居关…...

复习javascript

1.修改元素内的内容 ​ <div>zsgh</div> <script> const box1document.querySelector("div") box1.innerText"ppp" box1.innerHtml<h1>修改</h1> </script>​ 2.随机点名练习 <!DOCTYPE html> <html lang…...

海盗王64位服务端+32位客户端3.0版本

经过多天的尝试&#xff0c;终于把海盗王3.0的服务端改成了64位的&#xff0c;包括AccountServer GroupServer GameServer GateServer。 客户端则保留了32位。 服务端改成64位的好处是GameServer可以只启动一个就开全部地图&#xff0c;大概6G内存左右&#xff0c;直接将跳…...

【从零实现JsonRpc框架#2】Muduo库介绍

1.基本概念 Muduo 由陈硕大佬开发&#xff0c;是一个基于非阻塞IO和事件驱动的C高并发TCP网络编程库。它是一款基于主从Reactor模型的网络库&#xff0c;其使用的线程模型是 one loop per thread。 1.1 主从 Reactor 模型 主 Reactor&#xff08;MainReactor&#xff0c;通常…...

如何创建伪服务器,伪接口

创建伪接口一般是用于模拟真实接口的行为&#xff0c;以便在开发和测试过程中进行使用&#xff0c;以下是一些常见的创建伪接口的方法&#xff1a; 使用 Web 框架搭建&#xff1a; Python 和 Flask&#xff1a;Flask 是一个轻量级的 Python Web 框架。示例代码如下&#xff1a;…...

NX949NX952美光科技闪存NX961NX964

NX949NX952美光科技闪存NX961NX964 在半导体存储领域&#xff0c;美光科技始终扮演着技术引领者的角色。其NX系列闪存产品线凭借卓越的性能与创新设计&#xff0c;成为数据中心、人工智能、高端消费电子等场景的核心组件。本文将围绕NX949、NX952、NX961及NX964四款代表性产品…...

vue配置代理解决前端跨域的问题

文章目录 一、概述二、报错现象三、通过配置代理来解决修改request.js中的baseURL为/api在vite.config.js中增加代理配置 四、参考资料 一、概述 跨域是指由于浏览器的同源策略限制&#xff0c;向不同源(不同协议、不同域名、不同端口)发送ajax请求会失败 二、报错现象 三、…...

深入解析Vue3中ref与reactive的区别及源码实现

深入解析Vue3中ref与reactive的区别及源码实现 前言 Vue3带来了全新的响应式系统&#xff0c;其中ref和reactive是最常用的两个API。本文将从基础使用、核心区别到源码实现&#xff0c;由浅入深地分析这两个API。 一、基础使用 1. ref import { ref } from vueconst count…...

Java Bean容器详解:核心功能与最佳使用实践

在Java企业级开发中&#xff0c;Bean容器是框架的核心组件之一&#xff0c;它通过管理对象&#xff08;Bean&#xff09;的生命周期、依赖关系等&#xff0c;显著提升了代码的可维护性和扩展性。主流的框架如Spring、Jakarta EE&#xff08;原Java EE&#xff09;均提供了成熟的…...

Xilinx Kintex-7 XC7K325T-2FFG676I 赛灵思 FPGA

XC7K325T-2FFG676I 属于 Kintex-7 FPGA &#xff0c;低功耗与合理成本的应用市场&#xff0c;可提供比前代产品两倍的性价比提升和卓越的系统集成能力。该器件于 28 nm 工艺节点制造&#xff0c;速度等级为 -2&#xff0c;适合对时序要求严格但预算有限的系统设计。 产品架构与…...

AI实战笔记(1)AI 的 6 大核心方向 + 学习阶段路径

一、机器学习&#xff08;ML&#xff09; 目标&#xff1a;用数据“训练”模型&#xff0c;完成分类、回归、聚类等任务。 学习阶段&#xff1a; &#xff08;1&#xff09;基础数学&#xff1a;线性代数、概率统计、微积分&#xff08;适度&#xff09; &#xff08;2&#xf…...

Ceph集群故障处理 - PG不一致修复

Ceph集群故障处理 - PG不一致修复 目录故障现象故障分析故障定位修复过程磁盘状态检查OSD存储结构检查修复分析故障总结问题原因修复方法后续建议经验教训最佳实践 参考资料 # ceph -v ceph version 14.2.22目录 故障现象故障分析故障定位修复过程磁盘状态检查OSD存储结构检查…...

【前端】每日一道面试题3:如何实现一个基于CSS Grid的12列自适应布局?

要实现一个基于CSS Grid的12列自适应布局&#xff0c;关键在于利用网格系统的灵活性和响应式设计能力。以下是具体实现步骤及核心代码示例&#xff1a; 一、基础网格容器定义 创建网格容器 使用display: grid将父元素定义为网格容器&#xff1a; .container {display: grid;gr…...

leetcode 349. Intersection of Two Arrays

题目描述 题目限制0 < nums1[i], nums2[i] < 1000&#xff0c;所以可以开辟一个1001个元素的数组来做哈希表。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> table(1001,0…...

机器学习 day01

文章目录 前言一、机器学习的基本概念二、数据集的加载1.玩具数据集2.联网数据集3.本地数据集 三、数据集的划分四、特征提取1.稀疏矩阵与稠密矩阵2.字典列表特征提取3.文本特征提取 前言 目前我开始学习机器学习部分的相关知识&#xff0c;通过今天的学习&#xff0c;我掌握了…...

C++STL——priority_queue

优先队列 前言优先队列仿函数头文件 前言 本篇主要讲解优先队列及其底层实现。 优先队列 优先队列的本质就是个堆&#xff0c;其与queue一样&#xff0c;都是容器适配器&#xff0c;不过优先队列是默认为vector实现的。priority_queue的接口优先队列默认为大根堆。 仿函数 …...

DS18B20温度传感器

1.基本信息 测温范围为一55&#xff5e; 125℃&#xff1b;3.3/5V的供电电压&#xff1b;-10~85内精度较高&#xff1b; 典型的温度转换时间为 750ms&#xff08;12 位分辨率&#xff09;&#xff1b; 输出最小分辨率&#xff1a;0.0625&#xff1b; 采用单总线数据格式&am…...