【DM系列】DM 集成 JDBC 开发指南

在这里插入图片描述

前言

  数据库访问是数据库应用系统中非常重要的组成部分,DM 作为一个通用数据库管理系统,提供了多种数据库访问接口,包括 ODBC、JDBC、DPI 等方式。本开发指南详细介绍了 DM 的各种访问接口、相应开发环境的配置、以及一些开发用例。本指南的主要读者是从事过数据库应用系统开发,并具有 SQL 使用基础的程序员。开发一个应用系统,需要对其使用的数据库管理系统所具有的功能、性能、特性有较深入的了解。DM 作为一个通用的数据库管理系统,具有非常丰富的功能和特色。

测试工具说明
开发工具IDEA 2024
数据库版本DM8
JDBC驱动包DmJdbcDriver18
JDK环境17

一、概述

1.1 JDBC介绍

  在实际项目开发中,操作数据库是必不可少的,常用的操作数据库的框架,如:MyBatis、JdbcTemplate等有很多。但是,无论使用哪种框架操作数据库,最底层的api实现都是JDBC,就是说,在开发中,JDBC有着举足轻重的地位,是最基础也是最核心的。

  JDBC 是 Java 应用程序与数据库的接口规范,旨在让各数据库开发商为 Java 程序员提供标准的数据库应用程序编程接口,其定义了一个跨数据库、跨平台的通用 SQL 数据库 API。DM JDBC 驱动程序是 DM 数据库的 JDBC 驱动程序,它是一个能够支持基本SQL功能的通用应用程序编程接口,支持一般的SQL数据库访问。通过 JDBC 驱动程序,用户可以在应用程序中实现对 DM 数据库的连接与访问,JDBC 驱动程序的主要功能包括:建立与DM数据库的连接、转接发送SQL语句到数据库以及处理并返回语句执行结果。

  利用JDBC 驱动程序进行编程的一般步骤为:

序号步骤说明
1获取 java.sql.Connection对象利用 DriverManager 或者数据库源来建立同数据库的连接。
2创建 java.sql.Statement 对象这里也包含了 java.sql.PreparedStatement 和 java.sql.CallableStatement对象。
利用连接对象的创建语句对象的方法来创建,在创建过程中根据需要来设置结果集的属性。
3操作数据库操作数据库分为两种情况,更新操作和查询操作。
查询操作执行完成后会得到一个 java.sql.ResultSet 对象,可以操作该对象来获得指定列的信息。
4释放资源操作完成之后,用户需要释放系统资源,主要是关闭结果集、关闭语句对象,释放连接。

1.2 建立JDBC连接

  获得 JDBC 的连接对象,是通过驱动管理器 DriverManager 的 getConnection 方法来建立。若是想要用 Java 连接达梦,需要使用DM JDBC 驱动,其位于 DM 安装目录 /dmdbms/drivers/jdbc 下,将其路径添加到项目工程下,也可以通过maven等方式将对应的依赖引入,相关配置如下:

<!-- https://mvnrepository.com/artifact/com.dameng/DmJdbcDriver18 -->
<dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>${dm.version}</version>
</dependency>

注意:使用 JDBC 驱动时,需要使用和服务器端 DM 数据库相近的版本,相隔时间太久的版本,可能出现部分功能无法适配的情况。达梦的 JDBC 驱动目前有三个版本:DmJdbcDriver16.jar、DmJdbcDriver17.jar、DmJdbcDriver18.jar,分别对应 jdk 1.6、jdk 1.7、jdk 1.8 及以上版本,请根据开发环境选择合适的 DM JDBC 驱动包。

  建立配置文件 jdbc.properties文件,用来存放数据库连接配置。properties 文件是Java 支持的一种配置文件类型,将此文件直接放在 /src/main/resources 目录下,不然后面执行可能找不到此配置文件!

# 定义 DM JDBC 驱动串
db.driverClassName=dm.jdbc.driver.DmDriver
# 定义 DM URL 连接串
db.url=jdbc:dm://localhost:5236
# 定义连接用户名
db.user=SYSDBA
# 定义连接用户口令
db.password=SYSDBA

二、基础操作示例

  在DM数据库中,表是用于存储结构化数据的核心组件,其基本结构是由行和列组成,每个表具有唯一名称,用于在数据库中标识它。表中的每个列表示数据的一个属性,每一行表示一个完整的数据记录。表是DM数据库中最基本的存储单元,所有的数据操作都围绕表展开。数据操作主要分为两个方面,一个是更新操作,例如更新数据库、删除一行、创建一个新表等;另一个就是查询操作,执行完查询之后,会得到一个 java.sql.ResultSet 对象,可以操作该对象来获得指定列的信息、读取指定行的某一列的值。
mage

2.1 DM 连接示例

  连接数据库是一项非常重要的功能,这里讲介绍如何连接 DM 数据库。创建工具类 DmJdbcHelperUtil.java,之后的增删改查操作可直接导入这个工具类完成获取连接,释放资源的操作,很方便!废话就不多说,直接上代码,如下所示:

import cn.hutool.setting.dialect.Props;
import cn.hutool.setting.dialect.PropsUtil;
import java.sql.*;public final class DmJdbcHelperUtil {/*** 获取连接的方法. 通过读取配置文件从数据库服务器获取一个连接.*/public static Connection getDmJdbcConnection() {Props props = PropsUtil.get("jdbc.properties");// 定义DM JDBC驱动串String jdbcString = props.getStr("db.driverClassName");// 定义DM URL连接串String urlString = props.getStr("db.url");// 定义连接用户名String userName = props.getStr("db.user");// 定义连接用户口令String password = props.getStr("db.password");// 定义连接对象Connection connection = null;try {// 1、加载 JDBC 驱动程序(对应的 Driver 实现类中有注册驱动的静态代码块)System.out.println("加载 JDBC 驱动...");Class.forName(jdbcString);// 2、通过 DriverManager 的 getConnection() 方法获取数据库连接System.out.println("连接 DM 数据库...");connection = DriverManager.getConnection(urlString, userName, password);connection.setAutoCommit(true);System.out.println("[SUCCESS]conn database");} catch (Exception exp) {System.out.println("[FAIL]conn database:" + exp.getMessage());}return connection;}/*** 释放资源,关闭 ResultSet、Statement、Connection*/public static void release(ResultSet resultSet, Statement statement, Connection conn) throws SQLException {if (resultSet != null) {resultSet.close();}if (statement != null) {statement.close();}if (conn != null) {conn.close();}}
}

  运行后控制台输出如下图所示:

mage

  在操作完成之后,用户需要释放系统资源,主要是关闭结果集、关闭语句对象,释放连接。当然,这些动作也可以由 JDBC 驱动程序自动执行,但由于 Java 语言的特点,这个过程会比较慢(需要等到 Java 进行垃圾回收时进行),容易出现意想不到的问题。

2.2 表的创建与管理

  DM数据库使用SQL语句来创建和管理表。创建表的基本语法是 CREATE TABLE 语句,后跟表名和列定义。列定义包括列名、数据类型和约束条件。例如:

@Test
public void createTable() throws SQLException {Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();// 创建表语句String createSql = "CREATE TABLE city ( id CHAR(3) NOT NULL, name VARCHAR(40) NULL, region INT NULL );";// 创建语句对象PreparedStatement preparedStatement = conn.prepareStatement(createSql);// 执行语句preparedStatement.executeUpdate();// 关闭语句DmJdbcHelperUtil.release(null, preparedStatement, conn);
}

  创建表后,可以使用 ALTER TABLE 语句对表进行修改。例如,添加新列、修改列的数据类型、更改约束条件等。删除表可以使用 DROP TABLE 语句,但需要谨慎操作,因为删除表将永久删除表中的所有数据。

2.3 数据的基本操作

插入数据

  在表中插入数据使用 INSERT INTO 语句,指定表名和要插入的数据。例如:

INSERT INTO city(id, name, region) VALUES('BJ', '北京', 1); 
INSERT INTO city(id, name, region) VALUES('SJZ', '石家庄', 1); 
INSERT INTO city(id, name, region) VALUES('SH', '上海', 2); 
INSERT INTO city(id, name, region) VALUES('NJ', '南京', 2); 
INSERT INTO city(id, name, region) VALUES('GZ', '广州', 3); 
INSERT INTO city(id, name, region) VALUES('HK', '海口', 3); 
INSERT INTO city(id, name, region) VALUES('WH', '武汉', 4); 
INSERT INTO city(id, name, region) VALUES('CS', '长沙', 4); 
INSERT INTO city(id, name, region) VALUES('SY', '沈阳', 5); 
INSERT INTO city(id, name, region) VALUES('XA', '西安', 6); 
INSERT INTO city(id, name, region) VALUES('CD', '成都', 7);
@Test
public void insertTable() throws SQLException {Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();// 创建表语句String insertSql = "INSERT INTO city(id, name, region) VALUES('BJ', '北京', 1)";// 创建语句对象Statement statement = conn.createStatement();// 执行语句statement.execute(insertSql);// 关闭语句DmJdbcHelperUtil.release(null, statement, conn);System.out.println("插入成功");
}

  在连接建立后,需要对数据库进行访问,执行命令或是SQL语句,可以通过 Statement 对象执行静态SQL语句并返回其生成结果。但 Statement 对象执行SQL语句存在SQL注入风险,为防范 SQL注入,需要用 PreparedStatement 取代 Statement。

@Test
public void insertTable() throws SQLException {Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();// 创建表语句String insertSql = "INSERT INTO city(id, name, region) VALUES('BJ', '北京', 1)";// 创建语句对象PreparedStatement preparedStatement = conn.prepareStatement(insertSql);// 执行语句preparedStatement.executeUpdate();// 关闭语句DmJdbcHelperUtil.release(null, preparedStatement, conn);System.out.println("插入成功");
}

删除数据

@Test
public void deleteTable() throws SQLException {Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();// 删除数据语句String deleteSql = "delete from city where id = 'BJ'";// 创建语句对象PreparedStatement preparedStatement = conn.prepareStatement(deleteSql);// 执行语句preparedStatement.executeUpdate();DmJdbcHelperUtil.release(null, preparedStatement, conn);System.out.println("删除成功");
}

修改数据

@Test
public void updateTable() throws SQLException {Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();// 更新数据语句String updateSql = "update city set name = '北京_BJ' where id = 'BJ'";// 创建语句对象PreparedStatement preparedStatement = conn.prepareStatement(updateSql);// 执行语句preparedStatement.executeUpdate();// 关闭语句DmJdbcHelperUtil.release(null, preparedStatement, conn);System.out.println("更新成功");
}

查询数据

  查询表中的数据使用SELECT语句,可以指定要查询的列和查询条件。处理查询结果集,获取当前光标指向行中的数据,有三种方式,如下所示:

@Test
public void queryTable() throws SQLException {Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();// 查询语句String querySql = "SELECT * FROM city";// 创建语句对象PreparedStatement preparedStatement = conn.prepareStatement(querySql);// 执行查询ResultSet resultSet = preparedStatement.executeQuery();// 显示结果集displayResultSet(resultSet);// 关闭DmJdbcHelperUtil.release(resultSet, preparedStatement, conn);
}/*** 处理查询结果集。* * 获取当前光标指向行中的数据,有三种方式:* * 第一种方式:根据字段下标获取。不管数据库表中的字段是什么类型,都以字符串方式取出。* 第二种方式:通过结果集中字段名称获取数据,该方式的程序更加健壮,建议使用。* 第三种方式:通过特定类型获取数据。该方式可以节省类型转换花费的性能,程序更加健壮,性能更高,推荐使用**/
private void displayResultSet(ResultSet resultSet) throws SQLException {// 将光标向前移动一行,如果指向当前行有记录,则返回true,若指向当前行无记录,返回falsewhile (resultSet.next()) {/** 第一种方式*/String id1 = resultSet.getString(1);String name1 = resultSet.getString(2);System.out.println("id1:" + id1 + ",名称1:" + name1);/** 第二种方式*/String id2 = resultSet.getString("id");String name2 = resultSet.getString("name");System.out.println("id2:" + id2 + ",名称2:" + name2);/** 第三种方式*/String id3 = resultSet.getString("id");String name3 = resultSet.getString("name");System.out.println("id3:" + id3 + ",名称3:" + name3);}
}

绑定变量示例

  上面提到为防范 SQL 注入,需要用 PreparedStatement 对象执行 SQL 语句。PreparedStatement 执行 SQL 语句中的参数用(?)表示,调用PreparedStatement 对象的 setXXX() 方法来设置这些参数,setXXX() 方法有两个参数,第一个参数是要设置的SQL语句中的索引(从1开始),第二个是设置的SQL语句中参数的值。调用 executeQuery() 返回ResultSet对象,调用 executeUpdate() 执行更新操作,包括增、删、修改等。

@Test
public void preparedStatementTest() throws SQLException {Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();// 更新数据语句String updateSql = "update city set name = ? where id = ?";// 创建语句对象PreparedStatement preparedStatement = conn.prepareStatement(updateSql);// 通过连接对象和修改语句的模板,创建 java.sql.PreparedStatement 对象preparedStatement.setString(1, "北京_BJ");preparedStatement.setString(2, "BJ");// 执行语句preparedStatement.executeUpdate();// 关闭语句DmJdbcHelperUtil.release(null, preparedStatement, conn);System.out.println("更新成功");
}

2.4 元数据MetaData

  DatabaseMetaData 用于获取数据库的元数据信息,包括表名、表的索引、数据库产品的名称和版本、数据库支持的操作等等。它是Java Database Connectivity(JDBC)的一部分,为开发人员提供了访问数据库元数据的便捷途径。

获取数据库的元信息

public static void getDatabaseMetaData() throws SQLException {Connection connection = DmJdbcHelperUtil.getDmJdbcConnection();// 获取DatabaseMetaData对象DatabaseMetaData metaData = connection.getMetaData();// 打印数据库的一些基本信息System.out.println("数据库名称: " + metaData.getDatabaseProductName());System.out.println("数据库版本: " + metaData.getDatabaseProductVersion());System.out.println("数据库的主版本:" + metaData.getDatabaseMajorVersion());System.out.println("数据库的小版本:" + metaData.getDatabaseMinorVersion());System.out.println("数据库支持的SQL语法: " + metaData.getSQLKeywords());System.out.println("JDBC驱动名称: " + metaData.getDriverName());System.out.println("JDBC驱动版本: " + metaData.getDriverVersion());System.out.println("数据库已知的用户: " + metaData.getUserName());System.out.println("数据库的系统函数的逗号分隔列表: " + metaData.getSystemFunctions());System.out.println("数据库的时间和日期函数的逗号分隔列表: " + metaData.getTimeDateFunctions());System.out.println("数据库的字符串函数的逗号分隔列表: " + metaData.getStringFunctions());System.out.println("数据库供应商用于 'schema' 的首选术语: " + metaData.getSchemaTerm());System.out.println("数据库URL: " + metaData.getURL());System.out.println("是否允许只读:" + metaData.isReadOnly());System.out.println("驱动程序的名称:" + metaData.getDriverName());System.out.println("驱动程序的版本:" + metaData.getDriverVersion());
}

获取数据库的所有表

public static void getTableList() throws SQLException {Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();// 获取Meta信息对象DatabaseMetaData meta = conn.getMetaData();// 数据库所有者的用户名,一般将它设置为 null。String schemaPattern = meta.getUserName();// 检索的表的名称,这里设置null,则代表检索全部的表String tableNamePattern = null;// 想要检索的表的类型String[] types = {"TABLE"};ResultSet resultSet = meta.getTables(null, schemaPattern, tableNamePattern, types);while (resultSet.next()) {System.out.println("表名: " + resultSet.getString("TABLE_NAME"));System.out.println("注释:" + resultSet.getString("REMARKS"));}
}

列出表的所有字段

public static void getColumnList(String tableName) throws SQLException {Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();// 获取Meta信息对象DatabaseMetaData meta = conn.getMetaData();// 数据库的用户String schemaPattern = meta.getUserName();// 表名String tableNamePattern = tableName;//// 转换为大写if (null != tableNamePattern) {tableNamePattern = tableNamePattern.toUpperCase();}String columnNamePattern = null;ResultSet resultSet = meta.getColumns(null, schemaPattern, tableNamePattern, null);while (resultSet.next()) {ResultSetMetaData resultSetMetaData = resultSet.getMetaData();int colNum = resultSetMetaData.getColumnCount();for (int i = 1; i <= colNum; i++) {// 列名// String name = resultSetMetaData.getColumnLabel(i);System.out.println("表名:" + resultSet.getString("TABLE_NAME"));System.out.println("列名:" + resultSet.getString("COLUMN_NAME"));System.out.println("字段类型:" + resultSet.getString("TYPE_NAME"));System.out.println("列大小:" + resultSet.getLong("COLUMN_SIZE"));System.out.println("是否为空:" + resultSet.getInt("NULLABLE"));System.out.println("注释:" + resultSet.getString("REMARKS"));System.out.println("默认值:" + resultSet.getString("COLUMN_DEF"));System.out.println("是否自递:" + "YES".equalsIgnoreCase(resultSet.getString("IS_AUTOINCREMENT")));}}
}

三、附录

3.1 数据类型映射

DM 数据类型JAVA数据类型
bit、booleanboolean
tinyintshort
smallintint
intlong
bigintfloat
float、doubledouoble
decimalBigdecimal
char、varchar、VARCHAR2String
binary、varbinaryByte[]
dateDate
timeTime

3.2 JDBC-API详解

  JDBC API是Java语言访问数据库的标准API,它定义了一组类和接口,用于封装数据库访问的细节,由于 DM JDBC 驱动遵照 JDBC 标准规范设计与开发,JDBC 接口函数较多,这里仅列出了 DM JDBC 主要接口和函数。

java.sql.DriverManager

  用于管理驱动程序、并可与数据库建立连接,如下表所示。

主要函数说明
getConnection获取数据库连接对象
setLoginTimerout设置登录超时时间
registerDriver注册驱动
deregisterDriver卸载驱动

java.sql.Connection

  数据库连接类,作用是管理执行数据库的连接。可用于提交和回滚事务、创建Statement对象等操作,如下表所示。

主要函数说明
createStatement创建一个sql执行对象:Statement
setAutoCommit设置自动提交
close关闭数据库连接
commit执行事务的提交操作
rollback执行事务的回滚操作

java.sql.Statement

  用于向数据库发送要执行的sql语句(增删改查)并可访问结果,如下表所示。

主要函数说明
execute运行 SQL 语句
executeQuery执行一条返回 ResultSet 的 SQL 语句
executeUpdate执行 INSERT、UPDATE、DELETE 或一条没有返回数据集的 SQL 语句
getResultSet用于得到当前 ResultSet 的结果

java.sql.ResultSet

  是 JDBC 中最重要的结果集对象,主要用于查询关于某个表的信息或一个查询的结果,如下表所示。

主要函数说明
getXxx获取指向行、特定列的内容
absolute将结果集的记录指针移动到指定行
next将结果集的记录指针定位到下一行。如果没有剩余行,则返回 false。
last将结果集的记录指针定位到最后一行
close释放 ResultSet 对象
getMetaData返回 ResultSetMetaData 对象。

java.sql.DatabaseMetaData

  有关整个数据库的信息,如表名、表的索引、数据库产品的名称和版本等。用于获取数据库元数据信息的类,如模式、表、权限、列、存储过程等信息,如下表所示。

主要函数说明
getCatalogs获取该数据库中的信息目录列表。
getTables获取指定参数的表信息
getColumns获取指定表的列信息
getPrimaryKeys获取指定表的主键信息
getImportedKeys获取指定表的外键列信息
getSQLKeywords获取数据库支持的SQL语法
getDriverName获得所连接的数据库驱动程序的名称。
getTypeInfo获取当前数据库的数据类型信息
getExportedKeys获取制定表的外键信息

java.sql.ResultSetMetaData

  用于获取结果集元数据信息的类,如列数、列名、列的数据类型、列大小等信息,如下表所示。

主要函数说明
getColumnCount获取数据集中的列数
getColumnName获取数据集中指定的列名
getColumnLabel获取数据集中指定的标签
getColumnType获取数据集中指定的数据类型
isCurrency如果此列包含带有货币单位的一个数字,则返回 true。
isReadOnly如果此列为只读,则返回 true。
isAutoIncrement如果此列自动递增,则返回 true。这类列通常为主键,而且始终是只读的。

四、总结

  以上就是使用Java连接DM数据库的完整流程和操作步骤,为了更直观地展示利用JDBC驱动程序进行编程的过程,这里使用 mermaid 语法绘制以下流程图:

1、加载驱动
2、创建连接(Connection)
3、创建句柄(Statement)
4、执行操作
5、结果处理(ResultSet)
6、关闭连接

  通过上述步骤,可以成功配置 Java 程序以连接DM数据库。理解每一步的意义,并运行示例代码,将掌握数据库操作的基本要领。希望在后续的学习与实践中,能进一步深入理解数据库的使用,提升自己的开发技能,加油!

image

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

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

相关文章

处理PhotoShopCS5和CS6界面字体太小

处理PhotoShop CS6界面字体太小 背景&#xff1a;安装PhotoShop CS6后发现无法调大字体大小&#xff0c;特别是我的笔记本14寸的&#xff0c;显示的字体小到离谱。 百度好多什么降低该电脑分辨率&#xff0c;更改电脑的显示图标大小&#xff0c;或者PS里的首选项中的界面设置。…

【JavaEE进阶】Spring AOP 原理

在之前的博客中 【JavaEE进阶】Spring AOP使用篇_aop多个切点-CSDN博客 我们主要学习了SpringAOP的应用, 接下来我们来学习SpringAOP的原理, 也就是Spring是如何实现AOP的. SpringAOP 是基于动态代理来实现AOP的,咱们学习内容主要分以下两部分 1.代理模式 2.Spring AOP源码剖…

基于springboot+vu的二手车交易系统(全套)

一、系统架构 前端&#xff1a;vue | element-ui | html 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页2 03. web端-注册 04. web端-登录 05. w…

macOS开发环境配置与应用开发(详细讲解)

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 macOS作为Apple公司推出的桌面操作系统&#xff0c;以其稳定性、优雅的用户界面和强大的开发工具吸引了大量开发者。对于…

TinyVue v3.19.0 正式发布!Tree 组件终于支持虚拟滚动啦!UI 也升级啦,更更符合现代审美~

你好&#xff0c;我是 Kagol&#xff0c;个人公众号&#xff1a;前端开源星球。 我们非常高兴地宣布&#xff0c;2024年10月28日&#xff0c;TinyVue 发布了 v3.19.0 &#x1f389;。 本次 3.19.0 版本主要有以下重大变更&#xff1a; 所有组件全面升级到 OpenTiny Design 新…

鸿蒙进阶篇-type、typeof、类

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…

1.62亿元!812个项目立项!上海市2024年度“科技创新行动计划”自然科学基金项目立项

本期精选SCI&EI ●IEEE 1区TOP 计算机类&#xff08;含CCF&#xff09;&#xff1b; ●EI快刊&#xff1a;最快1周录用&#xff01; 知网(CNKI)、谷歌学术期刊 ●7天录用-检索&#xff08;100%录用&#xff09;&#xff0c;1周上线&#xff1b; 免费稿件评估 免费匹配期…

Flink安装和Flink CDC实现数据同步

一&#xff0c;Flink 和Flink CDC 1&#xff0c; Flink Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。 中文文档 Apache Flink Documentation | Apache Flink 官方文档 &#xff1a;https://flink.apache.org Flink 中文社区…

VBA高级应用30例应用3在Excel中的ListObject对象:插入行和列

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

windows运行ffmpeg的脚本报错:av_ts2str、av_ts2timestr、av_err2str => E0029 C4576

问题描述 我目前的环境是&#xff1a; 编辑器&#xff1a; Microsoft Visual Studio Community 2022 (64 位) 运行的脚本是ffmpeg自带的remux样例&#xff0c;只不过我想用c语言执行这个样例。在执行的过程中报错如下图&#xff1a; C4576 后跟初始值设定项列表的带圆括…

如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?

以下是使用 Python 的爬虫技术获取淘宝天猫商品价格信息的两种常见方法&#xff1a; 方法一&#xff1a;使用 Selenium 一、环境准备&#xff1a; 安装 selenium 库&#xff1a;在命令行中运行 pip install selenium。下载浏览器驱动&#xff1a;如 ChromeDriver&#xff08;确…

Linux系统程序设计--2. 文件I/O

文件I/O 标准C的I/O FILE结构体 下面只列出了5个成员 可以观察到&#xff0c;有些函数没有FILE类型的结构体指针例如printf主要是一些标准输出&#xff0c;因为其内部用到了stdin&#xff0c;stdout&#xff0c;stderr查找文件所在的位置:find \ -name stat.h查找头文件所…

Spark 中 RDD 的诞生:原理、操作与分区规则

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式之Yarn模式的原…

[2024最新] macOS 发起 Bilibili 直播(不使用 OBS)

文章目录 1、B站账号 主播认证2、开启直播3、直播设置添加素材、隐私设置指定窗口添加/删除 窗口 4、其它说明官方直播帮助中心直播工具教程 目前搜到的 macOS 直播教程都比较古早&#xff0c;大部分都使用 OBS&#xff0c;一番探索下来&#xff0c;发现目前已经不需要 OBS了&a…

内核设备树,你真的了解吗?

在嵌入式系统和内核开发中&#xff0c;设备树&#xff08;Device Tree, 简称 DT&#xff09;扮演着至关重要的角色&#xff0c;帮助系统在启动时准确识别硬件配置并匹配合适的驱动程序。虽然设备树应用广泛&#xff0c;但其结构、工作机制及应用细节却不总是被深入理解。本文将…

yelp数据集上识别潜在的热门商家

yelp数据集是研究B2C业态的一个很好的数据集&#xff0c;要识别潜在的热门商家是一个多维度的分析过程&#xff0c;涉及用户行为、商家特征和社区结构等多个因素。从yelp数据集里我们可以挖掘到下面信息有助于识别热门商家 用户评分和评论分析 评分均值: 商家的平均评分是反映其…

Mac如何将多个pdf文件归并到一个

电脑&#xff1a;MacBook Pro M1 操作方式&#xff1a; very easy 选中想要归并的所有pdf文件&#xff0c;然后 右键 -> quick actions -> Create PDF 然后就可以看到将所选pdf文件归并为一个pdf的文件了

华为eNSP实验:IP Source Guard

一&#xff1a;IP Source Guard: IP Source Guard&#xff08;简称IPSG&#xff09;是一种基于二层接口的源IP地址过滤技术&#xff0c;用于防止恶意主机伪造合法主机的IP地址进行网络攻击。以下是对IP Source Guard的详细解析&#xff1a; 基本概念&#xff1a; IP Source Gu…

API接口精准获取商品详情信息案例

在当今数字化时代&#xff0c;电子商务平台的蓬勃发展&#xff0c;使得商品信息的获取变得尤为重要。API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;作为连接前端用户界面与后端服务的桥梁&#xff0c;扮演着至关重要的角色。本文…