JDBC相关知识分解逐步介绍

1. JDBC驱动程序

1.1 什么是JDBC驱动程序

JDBC驱动程序是实现Java程序与数据库进行通信的桥梁。不同的数据库需要不同的JDBC驱动程序。例如,MySQL数据库需要mysql-connector-java,Oracle数据库需要ojdbc驱动程序。

1.2 加载JDBC驱动程序

在JDBC 4.0及更高版本中,驱动程序会自动注册,无需手动加载。不过,为了向后兼容,仍可以手动加载驱动程序:

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

2. 连接数据库

2.1 创建数据库连接

通过DriverManager.getConnection方法创建数据库连接:

//jdbc:表示Java数据库连接
//mysql:表示连接的数据库类型为mysql
//localhost:表示数据库服务器地址,在本地机器上运行通常使用这个地址;如果数据库在远程服务器上,需要使用远程服务器的ip地址或域名代替
//dbname:数据库名称
//?:用于开始添加查询参数
//&:每个参数用&分隔开
//useUnicode=true:表示JDBC驱动程序在与数据库通信时使用Unicode字符集,确保支持多语言字符集的正确编码和解码
//characterEncoding=UTF-8:指定JDBC驱动程序使用UTF-8进行编码和解码
//serverTimezone:指定数据库服务器的时区
//UTC:协调世界时,是一种时间标准,不受地理位置影响,用于全球同步时间,被全球一致采用
String url = "jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
String username = "username";
String password = "password";
Connection conn = DriverManager.getConnection(url, username, password);

3. 执行SQL语句

3.1 Statement对象

在JDBC(Java Database Connectivity)中,Statement 对象用于执行静态SQL语句,并返回它们生成的结果。它是java.sql包中的一个接口,具体实现由JDBC驱动提供。Statement对象是执行SQL查询和更新操作的主要手段之一。

3.1.1创建 Statement 对象

你可以通过一个已经建立的数据库连接对象 (Connection) 创建一个 Statement 对象:

Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
3.1.2使用 Statement 对象

Statement 对象主要有三种方法来执行SQL语句:

①. 执行查询(executeQuery

  • 用于执行SELECT语句。
  • 返回一个ResultSet对象,包含查询结果。
  • 例如:
    String sql = "SELECT id, name FROM users";
    ResultSet rs = stmt.executeQuery(sql);
    while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");System.out.println("ID: " + id + ", Name: " + name);
    }
    

②. 执行更新(executeUpdate

  • 用于执行INSERTUPDATEDELETECREATE TABLE等语句。
  • 返回一个int值,表示受影响的行数。
  • 例如:
    String sql = "UPDATE users SET name='John' WHERE id=1";
    int rowsAffected = stmt.executeUpdate(sql);
    System.out.println("Rows affected: " + rowsAffected);
    

③. 执行任意SQL语句(execute

  • 用于执行任何SQL语句,返回一个布尔值。
  • 如果第一个结果是ResultSet,则返回true;如果是更新计数或没有结果,则返回false
  • 例如:
    String sql = "DELETE FROM users WHERE id=1";
    boolean hasResultSet = stmt.execute(sql);
    if (hasResultSet) {ResultSet rs = stmt.getResultSet();// Process the result set
    } else {int updateCount = stmt.getUpdateCount();System.out.println("Rows affected: " + updateCount);
    }
    
3.2 PreparedStatement对象

PreparedStatement对象用于执行预编译的SQL语句,适用于需要多次执行相同SQL语句的场景。其优势包括预编译、防止SQL注入和性能提升。

3.2.1 创建PreparedStatement

使用Connection对象的prepareStatement方法来创建PreparedStatement对象:

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname", "username", "password");
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
3.2.2 设置参数

使用PreparedStatement对象的setXXX方法来设置参数,这些方法包括setIntsetStringsetDate等。参数索引从1开始:

pstmt.setString(1, "John Doe");
pstmt.setString(2, "john.doe@example.com");
3.2.3 执行SQL语句

PreparedStatement支持执行多种SQL语句,包括executeQueryexecuteUpdateexecute等:

  • executeQuery:用于执行SELECT查询,返回ResultSet对象。
  • executeUpdate:用于执行INSERTUPDATEDELETE语句,返回受影响的行数。
  • execute:用于执行任何SQL语句,返回一个布尔值,表示是否有ResultSet对象。

示例:

int rowsAffected = pstmt.executeUpdate();
3.2.4 处理ResultSet

如果执行的是查询操作,可以使用ResultSet来处理结果:

ResultSet rs = pstmt.executeQuery();
while (rs.next()) {String name = rs.getString("name");String email = rs.getString("email");// 处理结果
}
3.2.5 关闭资源

使用完毕后,应关闭PreparedStatement和其他数据库资源,以释放数据库连接和其他资源:

rs.close();
pstmt.close();
conn.close();

4. 批处理

4.1 addBatch方法

addBatch方法用于将一条SQL语句添加到批处理中。调用addBatch时,PreparedStatement当前设置的参数会被保存,并作为一条独立的SQL语句添加到批处理中。

4.2 executeBatch方法

executeBatch方法用于执行批处理中所有的SQL语句。该方法返回一个int数组,每个元素表示相应SQL语句执行所影响的行数。

4.3 示例代码

以下是一个完整的示例代码,演示如何使用addBatchexecuteBatch进行批处理操作:

import java.sql.*;public class BatchProcessingExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/dbname";String username = "username";String password = "password";Connection conn = null;PreparedStatement pstmt = null;try {conn = DriverManager.getConnection(url, username, password);// 插入操作String sql = "INSERT INTO users (name, email) VALUES (?, ?)";pstmt = conn.prepareStatement(sql);// 设置第一条记录pstmt.setString(1, "John Doe");pstmt.setString(2, "john.doe@example.com");pstmt.addBatch();// 设置第二条记录pstmt.setString(1, "Jane Doe");pstmt.setString(2, "jane.doe@example.com");pstmt.addBatch();// 设置第三条记录pstmt.setString(1, "Sam Smith");pstmt.setString(2, "sam.smith@example.com");pstmt.addBatch();// 执行批处理int[] result = pstmt.executeBatch();System.out.println("Batch executed successfully.");// 输出结果for (int i = 0; i < result.length; i++) {System.out.println("Statement " + (i + 1) + ": " + result[i] + " row(s) affected.");}} catch (SQLException e) {e.printStackTrace();} finally {try {if (pstmt != null) pstmt.close();if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}

5. 处理结果集

5.1 ResultSet对象

ResultSet对象用于存储从数据库查询返回的结果。常用方法包括nextgetStringgetInt等:

while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");
}
5.2 ResultSet类型和并发性

创建StatementPreparedStatement时,可以指定ResultSet的类型和并发性:

  • 类型

    • ResultSet.TYPE_FORWARD_ONLY(默认):结果集只能向前移动。
    • ResultSet.TYPE_SCROLL_INSENSITIVE:结果集可向前和向后移动,不受数据库更改的影响。
    • ResultSet.TYPE_SCROLL_SENSITIVE:结果集可向前和向后移动,会反映数据库更改。
  • 并发性

    • ResultSet.CONCUR_READ_ONLY(默认):结果集不可更新。
    • ResultSet.CONCUR_UPDATABLE:结果集可更新。

示例:

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM users");

6. 事务管理

6.1 自动提交

默认情况下,JDBC连接是自动提交的,即每条SQL语句在执行后都会自动提交。可以通过setAutoCommit方法关闭自动提交:

conn.setAutoCommit(false);
6.2 手动提交和回滚

在关闭自动提交后,可以使用commitrollback方法手动提交或回滚事务:

try {// 执行SQL语句conn.commit();
} catch (SQLException e) {conn.rollback();
}

7. 数据库元数据

7.1 DatabaseMetaData对象

DatabaseMetaData对象提供关于数据库的元数据,如数据库版本、支持的功能等:

DatabaseMetaData metaData = conn.getMetaData();
System.out.println("Database Product Name: " + metaData.getDatabaseProductName());
7.2 ResultSetMetaData对象

ResultSetMetaData对象提供关于结果集的元数据,如列数、列名等:

ResultSetMetaData rsMetaData = rs.getMetaData();
int columnCount = rsMetaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {System.out.println("Column " + i + ": " + rsMetaData.getColumnName(i));
}

8. 异常处理

在JDBC中,所有与数据库操作相关的异常都是SQLException的子类。捕获并处理这些异常是良好的编程实践:

try {// 数据库操作
} catch (SQLException e) {e.printStackTrace();
} finally {// 关闭资源
}

9. 关闭资源

关闭数据库资源(如ResultSetStatementConnection)以释放资源,是良好的编程实践:

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

10. 数据源和连接池

在实际应用中,直接使用DriverManager获取连接的方式不适用于高并发场景。此时,可以使用数据源(DataSource)和连接池来管理数据库连接。常用的连接池实现有HikariCP、Apache DBCP和C3P0等。

10.1 配置数据源

以HikariCP为例:

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/dbname");
config.setUsername("username");
config.setPassword("password");
HikariDataSource ds = new HikariDataSource(config);try (Connection conn = ds.getConnection()) {// 使用连接进行数据库操作
}

11. 小、总结

通过理解和掌握上述常用JDBC知识点,可以编写更加高效、健壮和安全的数据库访问代码。这些知识点涵盖了从基本的数据库连接与操作,到高级的事务管理与批处理,甚至包括性能优化的连接池配置。熟练运用这些知识点,将显著提升Java数据库编程的能力。

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

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

相关文章

Python自动编译文件夹下的所有proto文件的方法

Python自动编译文件夹下的所有proto文件的方法 一、背景 当我们需要使用protobuf通信的时候,必然少不了新建一些proto文件,而手写proto文件,一方面我们不知道是否完全符合语法,另一方面这些proto文件需要被编译之后才能进行业务逻辑的实现,所以就存在编译proto文件的情况…

Samtec技术前沿 | 全新224G互连产品系列现场演示

【摘要/前言】 数据中心、人工智能、机器学习和量子计算等领域的行业进步推动了新兴系统需求的增长。Samtec 224 Gbps PAM4 互连系统经过精心设计&#xff0c;能够满足这些高性能要求&#xff0c;您将在视频中看到这一点。 【Demo演示】 Samtec 系统架构师Ralph Page讲述了可…

el-date-picker type=“month“差8小时

需加value-format"yyyy-MM-dd"解决 <el-form-item label"计算月" prop"caculateMonth"><el-date-pickerv-model"calculateParams.caculateMonth"size"small"value-format"yyyy-MM-dd"style"width:1…

成人本科毕业论文怎么写?分享自己的经验

撰写成人本科毕业论文是一个系统而深入的过程&#xff0c;以下是我个人的经验分享&#xff0c;希望能帮助你更好地完成这一任务&#xff1a; 1. 明确论文选题 兴趣与专长&#xff1a;选择自己感兴趣且有一定专长的领域&#xff0c;这样更容易深入研究。可行性&#xff1a;确保…

Prometheus + Grafana + Alertmanager 系统监控

PrometheusGrafana 系统监控 1. 简介1.1 Prometheus 普罗 米修斯1.2 Grafana 2. 快速试用2.1 Prometheus 普罗 米修斯2.2 Prometheus 配置文件2.3 Grafana 2. 使用 Docker-Compose脚本部署监控服务3. Grafana 配置3.1 配置数据源 Prometheus3.2 使用模板ID 配置监控模板3.3 使用…

java17 新特性(实用)

前言&#x1f440;~ 在更新下一章数据库相关知识前&#xff0c;先分享一下java17的一些新特性&#xff0c;有些新特性狠实用&#xff01;&#xff01;&#xff01; 如果各位对文章的内容感兴趣的话&#xff0c;请点点小赞&#xff0c;关注一手不迷路&#xff0c;如果内容有什么…

计算机组成体系

目录 冯诺依曼体系结构 运算器 存储器 控制器 输入设备 输出设备 CPU 体系特点 实例分析 总结 操作系统 什么是操作系统 理解操作系统的管理特性 什么是管理 驱动层 管理方式 操作系统接口即系统调用接口 用户操作接口 总结 冯诺依曼体系结构 冯诺依曼体系结构…

外星人Alienware X15R1 原厂Windows10系统 oem系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

关于找暑期实习后的一些反思

日期 2024年6月3日 写在前面&#xff1a;距离研究生毕业还有9个月&#xff0c;前端时间一直在不停地投简历&#xff0c;不停地刷笔试题&#xff0c;不停地被拒绝&#xff0c;今天悬着的心终于死透了&#xff0c;心情还是比较糟糕的&#xff0c;可能唯一的安慰就是一篇小论文终于…

Overleaf(Latex)论文里插入高清matlab图像,亲测有效!!

如何在论文里插入高清的实验结果是个令人头疼的问题&#xff0c;这里以overleaf对matlab结果为例进行了测试&#xff0c;亲测有效。 在matlab图像结果的左上角选择"文件"->“导出设置” 选择“渲染”&#xff0c;分辨率调至600&#xff1b; 字体和线条粗细视个人…

【Pytorch 】Dataset 和Dataloader制作数据集

文章目录 Dataset 和 Dataloader定义Dataset定义Dataloader综合案例1 导入两个列表到Dataset综合案例2 导入 excel 到Dataset综合案例3 导入图片到Dataset导入官方数据集Dataset 和 Dataloader Dataset指定了数据集包含了什么,可以是自定义数据集,也可以是以及官方数据集Data…

【Cityengine】Cityengine生产带纹理的建筑模型导入UE4/UE5(下)

【Cityengine】Cityengine生产带纹理的建筑模型导入UE4/UE5&#xff08;下&#xff09; 一、导出数据&#xff08;2022中文版案例&#xff09;二、安装datasmith插件三、导入数据四、检查导入材质是否正常五、编辑替换材质六、安装模型编辑插件七、编辑替换建筑规则 一、导出数…

MATLAB和物联网连载1:Internet of Things离你有多远?5行MATLAB的距离

MATLAB和物联网连载1:Internet of Things离你有多远?5行MATLAB的距离 原文&#xff1a;MATLAB和物联网连载1:Internet of Things离你有多远?5行MATLAB的距离 - 知乎 (zhihu.com) 来自俄罗斯的实习生在工作之余喜欢上网看点有的没的。有一天他突然发现了一个神奇的网站叫 T…

servlet小项目与servlet续集

文章目录 servlet小项目与servlet续集,是结合上一次的案例进行升级,给项目新增了,增加员工,删除员工,查询具体员工 功能新增操作修改操作删除操作过滤器Cookie servlet小项目与servlet续集,是结合上一次的案例进行升级,给项目新增了,增加员工,删除员工,查询具体员工 功能 上一…

地图编辑功能的使用场景

2d激光slam中&#xff0c;对于特殊场景的建图往往超出能力边界&#xff0c;需要配合工具做后期修改&#xff0c;将地图进行调整才能投入使用&#xff0c;简单介绍一下具体功能需求和使用场景。 对于多深度区域即与雷达等高的高度有多个深度区域&#xff0c;可能造成误匹配&…

命名空间,缺省参数和函数重载

前言&#xff1a;本文章主要介绍一些C中的小语法。 目录 命名空间 namespace的使用 访问全局变量 namespace可以嵌套 不同文件中定义的同名的命名空间可以合并进一个命名空间&#xff0c;并且其中不可以有同名的变量 C中的输入和输出 缺省参数&#xff08;默认参数&#…

带大家做一个,易上手的家常猪肉炖白菜

今天 带大家做一个 猪肉炖白菜 一块猪肉 切片 一块生姜 两边

doris实战处理(一)doris表的建表规范、查询

感谢原文&#xff1a;https://mp.weixin.qq.com/s/tGbdkF62WU6qbAH0mqtXuA 第一部分&#xff1a;字符集规范 【强制】数据库字符集指定utf-8&#xff0c;并且只支持utf-8。 命令规范 【建议】库名统一使用小写方式&#xff0c;中间用下划线&#xff08;_&#xff09;分割&a…

外星人Alienware x17R1 原厂Windows11系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

ProxySQL + MySQL MGR 实现读写分离实战

文章目录 前言1、ProxySQL 介绍1.1、ProxySQL 如何工作1.2、ProxySQL 工作原理 2、ProxySQL 安装与读写分离实战2.1、ProxySQL 安装2.2、读写分离配置2.3、读写分离实战2.4、SpringBoot 整合 前言 该文章实践之前&#xff0c;需要搭建MySQL MGR集群&#xff0c;关于 MySQL MGR…