JDBC接口开发指南

1.简介

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

本文介绍如何通过 JDBC 连接瀚高数据库并执行各种数据操作。

2.数据库驱动

JDBC是对数据库操作的接口抽象,而不同数据库厂商的数据库驱动程序则对应JDBC接口实现,通过抽象出JDBC接口,应用程序和实际的数据库驱动即JDBC实现解耦。

在数据库安装目录 interfaces/jdbc 下,获得驱动jar包hgdb-jdbc-xxx.jar。该驱动包与PostgreSQL保持兼容,其中类名、类结构与 PostgreSQL 驱动完全一致,曾经运行于 PostgreSQL 的应用程序可以直接移植到当前系统使用。

画板

3.常用接口
3.1.Driver接口

Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:

装载瀚高驱动:Class.forName(“org.postgresql.Driver”);

3.2.Connection接口

Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。

连接数据库:Connection conn = DriverManager.getConnection(“url”, “user”, “password”);

参数说明:

参数描述
url瀚高数据库连接URL支持的格式如下:
• jdbc:postgresql:database
• jdbc:postgresql://host/database
• jdbc:postgresql://host:port/database
• jdbc:postgresql://host:port/database?param1=value1&param2=value2
• jdbc:postgresql://host1:port1,host2:port2/database?param1=value1&param2=value2
说明:
• database 为要连接的数据库名称。
• host 为数据库服务器名称或IP地址。缺省情况下,连接服务器为localhost。
• port 为数据库服务器端口。缺省情况下,会尝试连接到5866端口的database。
• param 为参数名称,即数据库连接属性。参数可以配置在URL中,以“?”开始配置,以“=”给参数赋值,以“&”作为不同参数的间隔。
• value 为参数值,即数据库连接属性值。连接时需配置connectTimeout、socketTimeout,如果未配置,默认为0,即不会超时。
user数据库用户名
password数据库用户密码

常用方法:

createStatement():创建向数据库发送sql的statement对象。

prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。

prepareCall(sql):创建执行存储过程的callableStatement对象。

setAutoCommit(boolean autoCommit):设置事务是否自动提交。

commit() :在链接上提交事务。

rollback() :在此链接上回滚事务。

3.3.Statement接口

用于执行静态SQL语句并返回它所生成结果的对象。

三种Statement类:

  • Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
  • PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
  • CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。

常用Statement方法:

  • execute(String sql):运行语句,返回是否有结果集
  • executeQuery(String sql):运行select语句,返回ResultSet结果集。
  • executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
  • addBatch(String sql) :把多条sql语句放到一个批处理中。
  • executeBatch():向数据库发送一批sql语句执行。
3.4.ResultSet接口

ResultSet提供检索不同类型字段的方法,常用的有:

  • getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
  • getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
  • getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
  • getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
  • getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。

ResultSet还提供了对结果集进行滚动的方法:

  • next():移动到下一行
  • Previous():移动到前一行
  • absolute(int row):移动到指定行
  • beforeFirst():移动resultSet的最前面。
  • afterLast() :移动到resultSet的最后面。

注意:使用后依次关闭对象及连接:ResultSet → Statement → Connection

4.使用JDBC步骤

加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源

4.1.注册驱动
Class.forName("org.postgresql.Driver")
4.2.建立连接
Connection conn = DriverManager.getConnection(url, user, password); 
4.3.创建执行SQL语句的statement

statement

存在sql注入的危险,如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录。

String id = "5";
String sql = "delete from t where id=" + id;
Statement st = conn.createStatement();  
st.executeQuery(sql);  

PreparedStatement

有效的防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or ‘1=1’ 数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令)

String sql = "insert into user (name,pwd) values(?,?)";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, "col_value");  //占位符顺序从1开始
ps.setString(2, "123456"); //也可以使用setObject
ps.executeQuery();
4.4.处理执行结果(ResultSet)
ResultSet rs = ps.executeQuery();
While(rs.next()){rs.getString("col_name");rs.getInt(1);//…
}
4.5.释放资源

数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放 。

都要加try catch 以防前面关闭出错,后面的就不执行了 。

try { if (rs != null) {rs.close();}
} catch (SQLException e) {e.printStackTrace();
} finally {try {if (st != null) {st.close();}} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}
}
5.示例
5.1.连接数据库

通过 JDBC 连接瀚高数据库的过程如下:

  1. 使用 Class.forName() 方法显式地加载驱动类;
  2. 利用 DriverManager 类的 getConnection() 方法获取一个 Connection 连接对象。
private static final String JDBC_DRIVER = "org.postgresql.Driver";
private static final String JDBC_URL = "jdbc:postgresql://192.168.100.101:5866/highgo?escapeSyntaxCallMode=callIfNoReturn";
private static final String JDBC_USER = "highgo";
private static final String JDBC_PASSWORD = "111111";/*** 获取数据库连接* @return Connection 数据库连接对象* @throws SQLException,ClassNotFoundException*/
public static Connection getConnection() throws SQLException, ClassNotFoundException {//下面一行注册驱动代码可省略。Class.forName(JDBC_DRIVER);return DriverManager.getConnection(JDBC_URL,JDBC_USER,JDBC_PASSWORD);
}
  • JDBC_DRIVER 指定数据库驱动,从 JDBC 4.0 开始,驱动程序会通过 META-INF/services/java.sql.Driver 文件自动注册,因此不需要显式调用Class.forName();
  • JDBC_URL 中指定了数据库的 IP 地址、端口以及目标数据库;
  • JDBC_USER 和 JDBC_PASSWORD 指定数据库的用户和密码。

JDBC_URL 中 escapeSyntaxCallMode 是一个重要的配置参数,用于控制如何将 JDBC 转义调用语法(如 {call …} 或 {?= call …})转换为底层的 SQL 语句。这个参数对存储过程(PROCEDURE)和函数(FUNCTION)的调用行为有直接影响。

escapeSyntaxCallMode 的三种模式及行为:

  1. select 模式(默认)
  • 行为:JDBC 驱动会将所有 {call …} 或 {?= call …} 转换为 SELECT 语句。
  • 适用场景:
    • 仅适用于调用函数(FUNCTION),因为瀚高数据库的函数可以通过 SELECT 调用。
    • 不支持直接调用存储过程(PROCEDURE)。
  1. callIfNoReturn 模式
  • 行为:
    • 如果调用没有返回值(即没有 OUT 参数或返回结果集),JDBC 驱动会使用 CALL 语句。
    • 如果调用有返回值,则仍然使用 SELECT 语句。
  • 适用场景:
    • 适用于同时调用存储过程和函数的混合场景。
    • 存储过程通常不返回值,因此会使用 CALL。
    • 函数可能返回值,因此会使用 SELECT。
  1. call 模式
  • 行为:JDBC 驱动始终使用 CALL 语句,无论是否有返回值。
  • 适用场景:
    • 仅适用于调用 存储过程(PROCEDURE)。
    • 不支持调用函数(FUNCTION),因为瀚高数据库的函数无法通过 CALL 调用。

5.2.创建表

通过 JDBC 连接瀚高数据库并执行 DDL 语句的过程如下:

  1. 利用 DriverManager 类的 getConnection() 方法获取一个 Connection 连接对象;
  2. 使用连接对象的 createStatement() 方法创建一个 Statement 语句对象;
  3. 利用语句对象的 execute() 方法执行 SQL 语句;
  4. 释放 Statement 以及 Connection 对象资源。
/*** 创建表*/
public static void create(){Connection conn = null;Statement stmt = null;String sql = "create table users (" +"id serial primary key," +"name varchar(50) not null unique," +"create_time timestamp not null" +")";try {conn = getConnection(); //获取连接System.out.println("连接瀚高数据库成功!");stmt = conn.createStatement(); //创建statement对象stmt.execute(sql); //执行sqlSystem.out.println("成功创建 users 表!");} catch (Exception e) {e.printStackTrace();} finally { //释放资源try {if(stmt != null) stmt.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(conn != null) conn.close();} catch (Exception e){e.printStackTrace();}}}
}
5.3.插入数据

通过 JDBC 连接瀚高数据库并执行插入操作的过程如下:

  1. 利用 DriverManager 类的 getConnection() 方法获取一个 Connection 连接对象;
  2. 使用连接对象的 createStatement() 方法创建一个 Statement 或者 PreparedStatement 语句对象;
  3. 利用语句对象的 execute() 或者 executeBatch() 方法执行 INSERT 语句;
  4. 释放 Statement 以及 Connection 对象资源。
/***插入数据*/
public static void insert(){Connection conn = null;PreparedStatement pstmt = null;String sql = "insert into users (name,create_time) values(?,?)";try {conn = getConnection();//获取连接pstmt = conn.prepareStatement(sql); //创建prepareStatement对象pstmt.setString(1,"John"); //绑定参数1pstmt.setTimestamp(2,new Timestamp(System.currentTimeMillis())); //绑定参数2pstmt.addBatch();pstmt.setString(1,"Robert"); //绑定参数1pstmt.setTimestamp(2,new Timestamp(System.currentTimeMillis())); //绑定参数2pstmt.addBatch();int[] rowsAffected = pstmt.executeBatch(); //执行sqlSystem.out.println("数据写入{" + rowsAffected.length + "}行!");} catch (Exception e) {e.printStackTrace();} finally { //释放资源try {if(pstmt != null) pstmt.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(conn != null) conn.close();} catch (Exception e){e.printStackTrace();}}}
}
5.4.查询数据

通过 JDBC 连接瀚高数据库并执行查询语句的过程如下:

  1. 利用 DriverManager 类的 getConnection() 方法获取一个 Connection 连接对象;
  2. 使用连接对象的 createStatement() 方法创建一个 Statement 或者 PreparedStatement 语句对象;
  3. 利用语句对象的 executeQuery() 方法执行 SQL 语句或者存储过程,返回一个 ResultSet 结果集对象;
  4. 遍历结果集,获取并处理查询结果;
  5. 释放 ResultSet、Statement 以及 Connection 对象资源。
/***查询数据*/
private static void select(){Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;String sql = "select * from users";try {conn = getConnection(); //获取连接pstmt = conn.prepareStatement(sql); //创建prepareStatement对象rs = pstmt.executeQuery(); //执行sqlwhile(rs.next()){ //处理结果集System.out.println(rs.getInt("id") + "\t" +rs.getString("name")  + "\t" +rs.getTimestamp("create_time"));}} catch (Exception e) {e.printStackTrace();} finally { //释放资源try {if(rs != null) rs.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(pstmt != null) pstmt.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(conn != null) conn.close();} catch (Exception e){e.printStackTrace();}}}}
}
5.5.修改数据

通过 JDBC 连接瀚高数据库并执行更新语句的过程如下:

  1. 利用 DriverManager 类的 getConnection() 方法获取一个 Connection 连接对象;
  2. 使用连接对象的 createStatement() 方法创建一个 Statement 或者 PreparedStatement 语句对象;
  3. 利用语句对象的 executeUpdate() 方法执行 UPDATE 语句;
  4. 释放 Statement 以及 Connection 对象资源。
/*** 修改数据*/
private static void update(){Connection conn = null;PreparedStatement pstmt = null;String sql = "update users set name=? where id=?";try {conn = getConnection(); //获取连接pstmt = conn.prepareStatement(sql);  //创建prepareStatement对象pstmt.setString(1,"Tom"); //绑定参数1pstmt.setInt(2,1); //绑定参数2int rowsAffected = pstmt.executeUpdate(); //执行sqlSystem.out.println("更新行数: {"+rowsAffected+"}");} catch (Exception e) {e.printStackTrace();} finally { //释放资源try {if(pstmt != null) pstmt.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(conn != null) conn.close();} catch (Exception e){e.printStackTrace();}}}
}
5.6.删除数据

通过 JDBC 连接瀚高数据库并执行删除语句的过程如下:

  1. 利用 DriverManager 类的 getConnection() 方法获取一个 Connection 连接对象;
  2. 使用连接对象的 createStatement() 方法创建一个 Statement 或者 PreparedStatement 语句对象;
  3. 利用语句对象的 executeUpdate() 方法执行 DELETE 语句;
  4. 释放 Statement 以及 Connection 对象资源。
/*** 删除数据*/
private static void delete(){Connection conn = null;PreparedStatement pstmt = null;String sql = "delete from users where id=?";try {conn = getConnection(); //获取连接pstmt = conn.prepareStatement(sql); //创建prepareStatement对象pstmt.setInt(1,1); //绑定参数1int rowsAffected = pstmt.executeUpdate(); //执行sqlSystem.out.println("删除行数: {"+rowsAffected+"}");} catch (Exception e) {e.printStackTrace();} finally {//释放资源try {if(pstmt != null) pstmt.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(conn != null) conn.close();} catch (Exception e){e.printStackTrace();}}}
}
5.7.处理事务

默认情况下,JDBC 连接瀚高数据库时使用自动提交模式,意味着每个 SQL 语句都会自动执行事务的提交操作。如果我们想要在一个事务中执行多条 SQL 语句,需要禁用连接对象的自动提交属性,并且手动执行 COMMIT 或者 ROLLBACK 操作。

创建连接之后,使用 setAutoCommit() 方法禁用自动提交;然后分别执行插入语句和更新语句,并提交事务;在异常处理中回滚事务并打印错误消息。

/*** 处理事务*/
private static void transaction(){Connection conn = null;PreparedStatement pstmt = null;PreparedStatement pstmt2= null;String sql = "insert into users (name,create_time) values(?,?)";String sql2 = "update users set name = ? where id = ?";try {conn = getConnection(); //获取连接conn.setAutoCommit(false); //设置手动提交pstmt = conn.prepareStatement(sql); //创建prepareStatement对象pstmt.setString(1,"James"); //绑定参数1pstmt.setTimestamp(2,new Timestamp(System.currentTimeMillis())); //绑定参数2pstmt.executeUpdate(); //执行sqlpstmt2 = conn.prepareStatement(sql2); //创建prepareStatement对象pstmt2.setString(1,"James"); //绑定参数1pstmt2.setInt(2,2); //绑定参数2pstmt2.executeUpdate(); //执行sqlconn.commit(); // 提交事务System.out.println("事务提交成功!");} catch (Exception e) {try {conn.rollback(); // 回滚事务System.out.println("事务回滚!");} catch (SQLException ex) {e.printStackTrace();}e.printStackTrace();} finally {try {if(pstmt != null) pstmt.close();if(pstmt2 != null) pstmt2.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(conn != null) {conn.setAutoCommit(true); //设置自动提交conn.close();}} catch (Exception e){e.printStackTrace();}}}
}
5.8.调用函数

通过 JDBC 连接瀚高数据库并执行函数调用的过程如下:

  1. 利用 DriverManager 类的 getConnection() 方法获取一个 Connection 连接对象;
  2. 使用连接对象的 setAutoCommit() 方法禁用自动提交;
  3. 使用连接对象的 prepareCall() 方法创建一个 CallableStatement 语句对象;
  4. 利用语句对象的 execute() 方法执行函数调用,返回一个 ResultSet 结果集对象;
  5. 遍历结果集,获取并处理查询结果;
  6. 释放 ResultSet、CallableStatement 以及 Connection 对象资源。
CREATE OR REPLACE FUNCTION get_users_with_cursor_function() returns REFCURSOR AS $$
DECLAREref_cursor REFCURSOR;
BEGINOPEN ref_cursor FOR SELECT id, name, create_time FROM users;return ref_cursor;
END;
$$ LANGUAGE plpgsql;
/*** 调用函数*/
private static void callFunction(){Connection conn = null;CallableStatement cstmt = null;ResultSet rs = null;String callSQL = "{? = call get_users_with_cursor_function()}";try {conn = getConnection(); //获取连接conn.setAutoCommit(false); //设置手动提交cstmt = conn.prepareCall(callSQL); //创建prepareCall对象cstmt.registerOutParameter(1, Types.REF_CURSOR); //注册输出参数为游标类型cstmt.execute(); //执行存储过程rs = (ResultSet) cstmt.getObject(1); //获取返回的游标结果集// 遍历游标中的数据while (rs.next()) {System.out.println(rs.getInt("id") + "\t" +rs.getString("name")  + "\t" +rs.getTimestamp("create_time"));}conn.commit(); //提交事务} catch (Exception e) {try {conn.rollback(); // 回滚事务System.out.println("事务回滚!");} catch (SQLException ex) {e.printStackTrace();}e.printStackTrace();} finally {try {if(rs != null) rs.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(cstmt != null) cstmt.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(conn != null) {conn.setAutoCommit(true); //设置自动提交conn.close();}} catch (Exception e){e.printStackTrace();}}}}
}
5.9.调用存储过程

通过 JDBC 连接瀚高数据库并执行存储过程调用的过程如下:

  1. 利用 DriverManager 类的 getConnection() 方法获取一个 Connection 连接对象;
  2. 使用连接对象的 setAutoCommit() 方法禁用自动提交;
  3. 使用连接对象的 prepareCall() 方法创建一个 CallableStatement 语句对象;
  4. 利用语句对象的 execute() 方法执行存储过程调用,返回一个 ResultSet 结果集对象;
  5. 遍历结果集,获取并处理查询结果;
  6. 释放 ResultSet、CallableStatement 以及 Connection 对象资源。
CREATE OR REPLACE PROCEDURE get_users_with_cursor_procedure(OUT ref_cursor REFCURSOR) AS $$
BEGINOPEN ref_cursor FOR SELECT id, name, create_time FROM users;
END;
$$ LANGUAGE plpgsql;
/*** 调用存储过程*/
private static void callProcedure(){Connection conn = null;CallableStatement cstmt = null;ResultSet rs = null;String callSQL = "{ CALL get_users_with_cursor_procedure(?) }";try {conn = getConnection(); //获取连接conn.setAutoCommit(false); //设置手动提交cstmt = conn.prepareCall(callSQL); //创建prepareCall对象cstmt.registerOutParameter(1, Types.REF_CURSOR); //注册输出参数为游标类型cstmt.execute(); //执行存储过程rs = (ResultSet) cstmt.getObject(1); //获取返回的游标结果集// 遍历游标中的数据while (rs.next()) {System.out.println(rs.getInt("id") + "\t" +rs.getString("name")  + "\t" +rs.getTimestamp("create_time"));}conn.commit(); //提交事务} catch (Exception e) {try {conn.rollback(); // 回滚事务System.out.println("事务回滚!");} catch (SQLException ex) {e.printStackTrace();}e.printStackTrace();} finally {try {if(rs != null) rs.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(cstmt != null) cstmt.close();} catch (Exception e) {e.printStackTrace();} finally {try {if(conn != null) {conn.setAutoCommit(true); //设置自动提交conn.close();}} catch (Exception e){e.printStackTrace();}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell 脚本:系统管理与任务自动化的利器

在开发者忙碌的日常工作中,效率就是生命线。当面对大量重复、繁琐的系统管理任务与开发流程时,一款得力的编程工具能让工作事半功倍。Shell 脚本,这把在 Linux 和 Unix 系统环境下闪耀着光芒的利器,凭借其强大的自动化能力&#x…

关于mybatis插入大批量数据效率问题

一、即便分批次用mybatis插入数据,效率依旧不高,原因: MyBatis一次性批量插入几千条数据,为什么性能很差?-腾讯云开发者社区-腾讯云 文中提出: 默认执行器类型为Simple,会为每个语句创建一个新…

在 JavaScript中编写 Appium 测试(入门)

1.编写一个测试 (JS) 要在 JavaScript(Node.js)中编写 Appium 测试,我们需要选择一个与 Appium 兼容的客户端 库。维护最好的库和 Appium 团队推荐使用的库是 WebdriverIO, 所有就让我们使用它吧。既然我们已经安装了 Appium,我们…

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

DeviceProperties、AdapterProperties、StorageModule、以及 bt_config.conf 是 AOSP Bluetooth 栈中 设备属性管理与持久化系统 的核心组成部分,它们之间关系紧密,但职责各有不同。 下面我将依次讲解它们的区别与联系. 注意: 在代码里面 还有 Blueto…

@Resource vs @Autowired 在Spring中的使用和区别

Resource vs Autowired 在Spring中的使用和区别 在Spring开发中,我们常会接触两个用于实现引用模块注入的注解:Resource 和 Autowired。它们在使用上有些相似之处,但本质上来看,有所区别。本文将给出两者的详细介绍和对比&#x…

Mac M4 芯片运行大模型指南,包括模型微调与推理

Mac M4 芯片运行大模型指南,模型微调与推理 背景模型推理 Ollama🔍 举例说明:踩坑 模型微调 unsloth 背景 在国补、教育优惠、京东会员500优惠券等众多优惠之下。 我拿下了Macmini M4 16G 内存万兆网卡。在机器到手的第一时间,马…

微信小程序中安装vant

以下是微信小程序中安装 Vant 的详细步骤: 1. 初始化项目 在微信小程序项目目录下,打开终端,执行以下命令进行项目初始化: npm init -y该命令会快速生成一个默认的package.json文件,-y参数表示直接使用默认配置&…

今天做的力扣SQL

我本地markdown的东西直接复制出来了。 多说一嘴,今天早上六点醒了,然后被外面吵,心里也担心找实习就一直睡不着了。索性直接来实验室,这一上午感觉好快啊。幸运的是,自己也没有浪费时间,还行吧。SQL欠的账…

【开发常用命令】:docker常用命令

docker常用命令 基础命令 # 启动docker systemctl start docker # 关闭docker systemctl stop docker # 重启docker systemctl restart docker # 设置开机自启动 systemctl enable docker # 查看docker运行状态 systemctl status docker # 查看docker版本号信息 docker versi…

安装配置以太链钱包工具

安装go语言环境 1、官网下载go安装包并上传到指定机器 https://golang.google.cn/dl/ 2、解压缩至指定位置: tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz 3、将 /usr/local/go/bin 目录添加至 PATH 环境变量: export PATH$PATH:/usr/local/g…

论文阅读:speculative decoding

Fast Inference from Transformers via Speculative Decoding 论文地址:https://arxiv.org/pdf/2211.17192 speculative sampling 为了从分布 p ( x ) p(x) p(x) 中采样,我们实际上是从分布 q ( x ) q(x) q(x) 中采样 x x x,如果 q ( …

java操作word里的表格

依赖&#xff1a; <dependency><groupId>com.techCoLtd</groupId><artifactId>aspose-words-16.4.0-jdk16</artifactId><classifier>jdk16</classifier> </dependency>/*** 删除表格及表格的行* throws Exception*/ private s…

单链表经典算法题之分割链表

给定一个头结点和一个值x&#xff0c;是链表中所有小于x的值都在x前面 typedef struct ListNode ListNode; struct ListNode* partition(struct ListNode* head, int x) { //思路一&#xff1a;在原链表上进行修改 //思路二&#xff1a;创建新链表&#xff0c;使用哨兵位&…

Modbus TCP转DeviceNet网关连接ABB变频器配置案例

某工厂需要将支持Modbus TCP协议的上位机控制系统&#xff08;如PLC或SCADA&#xff09;与支持DeviceNet协议的变频器&#xff08;如ABB ACS880、施耐德ATV320等&#xff09;进行通信。为实现协议转换&#xff0c;采用开疆智能Modbus TCP转DeviceNet网关KJ-DVCZ-MTCPS作为中间设…

【力扣 简单 C++】206. 反转链表

目录 题目 解法一&#xff1a;迭代 解法二&#xff1a;递归 题目 待添加 解法一&#xff1a;迭代 class Solution { private:ListNode* reverse(ListNode* head){ListNode* newHead {};while (head){ListNode* nextNode {head->next};head->next newHead;newHead …

计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)—— 1. 摄像机几何

文章目录 1. 针孔相机1.1. 针孔成像1.2. 光圈对成像的影响 2. 透视投影相机2.1. 透镜成像2.2. 失焦2.3. 径向畸变2.4. 透视投影的性质 3. 世界坐标系到像素坐标系的变换4. 其它相机模型4.1. 弱透视投影摄像机4.2. 正交投影摄像机4.3. 各种摄像机模型的应用场合 课程视频链接&am…

第十三节:第七部分:Stream流的中间方法、Stream流的终结方法

Stream流常见的中间方法 Stream流常见的终结方法 代码 学生类&#xff08;代码一与代码二共涉及到的类&#xff09; package com.itheima.day28_Stream;import java.util.Objects;public class Student implements Comparable<Student> {private String name;private i…

深入理解 Go 中的字节序(Endianness)检测代码

深入理解 Go 中的字节序&#xff08;大小端&#xff09;检测代码 在计算机系统中&#xff0c;字节序&#xff08;Endianness&#xff09; 是指多字节数据类型&#xff08;如 int16、int32 等&#xff09;在内存中的存储顺序。Go 语言标准库提供了对大端&#xff08;Big-endian&…

JAVA:RabbitMQ 消息持久化机制的技术指南

🐇 1、简述 在使用 RabbitMQ 构建可靠消息系统时,消息丢失是必须避免的问题。为此,RabbitMQ 提供了消息持久化机制(Message Durability),可以保障在 Broker 异常宕机后数据不会丢失。 本篇博客将从原理出发,结合 Spring Boot 实战讲解如何正确实现 RabbitMQ 消息持久…

tabs页签嵌套表格,切换表格保存数据不变并回勾

需求&#xff1a;点击左边的tab页签&#xff0c;请求右侧表格数据&#xff1b;如果返回的接口数据存在taskuser字段并不为null&#xff0c;那么按照这个字段去回勾数据。如果存在数据&#xff0c;但与后面所勾选的数据项不同&#xff0c;按照后面勾选的为主。 <el-tabs tab-…