Java 数据库连接(JDBC)的使用,包括连接数据库、执行SQL语句等

一、简介

Java Database Connectivity(JDBC)是Java应用程序与关系数据库进行交互的一种API。它提供了一组用于访问和操作数据库的标准接口,使开发人员能够使用Java代码执行数据库操作,如查询、插入、更新和删除等。

二、JDBC架构

JDBC由两部分组成:

  1. JDBC API:由Java SE平台提供的接口和类集合,用于定义与数据库交互的标准。
  2. JDBC Driver API:由数据库供应商提供的具体实现,用于实际连接和操作数据库。
三、JDBC的核心组件
  1. DriverManager:管理一组数据库驱动程序的基本服务。
  2. Connection:表示与特定数据库的连接。
  3. Statement:用于执行SQL语句的对象,分为StatementPreparedStatementCallableStatement
  4. ResultSet:保存由Statement对象执行SQL查询返回的结果集。
  5. SQLException:处理数据库访问出错或其他错误的异常。
四、使用JDBC的步骤
  1. 加载驱动程序
  2. 建立数据库连接
  3. 创建SQL语句
  4. 执行SQL语句
  5. 处理结果集
  6. 关闭连接
五、具体实现
1. 加载驱动程序

在JDBC 4.0之后,驱动程序通常会自动加载,但为了兼容性,手动加载仍然常见。

try {Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {e.printStackTrace();
}
2. 建立数据库连接

使用DriverManager获取数据库连接。

String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";Connection connection = null;try {connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {e.printStackTrace();
}
3. 创建SQL语句

使用StatementPreparedStatement对象创建SQL语句。

Statement statement = connection.createStatement();
String sql = "SELECT * FROM users";

对于参数化查询,使用PreparedStatement

String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 1);
4. 执行SQL语句

根据SQL语句的类型,使用executeQueryexecuteUpdate方法执行。

查询操作:

ResultSet resultSet = statement.executeQuery(sql);

更新操作:

String updateSql = "UPDATE users SET name = 'John' WHERE id = 1";
int rowsAffected = statement.executeUpdate(updateSql);
5. 处理结果集

ResultSet对象包含查询结果,可以通过next方法迭代访问。

while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("ID: " + id + ", Name: " + name);
}
6. 关闭连接

为了防止资源泄露,必须关闭数据库连接、语句和结果集。

try {if (resultSet != null) resultSet.close();if (statement != null) statement.close();if (connection != null) connection.close();
} catch (SQLException e) {e.printStackTrace();
}
六、示例代码

以下是一个完整的JDBC示例程序,展示了如何连接到MySQL数据库,执行查询并处理结果集。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String user = "root";String password = "password";Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {// 加载驱动程序Class.forName("com.mysql.cj.jdbc.Driver");// 建立连接connection = DriverManager.getConnection(url, user, password);// 创建语句statement = connection.createStatement();String sql = "SELECT * FROM users";// 执行查询resultSet = statement.executeQuery(sql);// 处理结果集while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("ID: " + id + ", Name: " + name);}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 关闭连接try {if (resultSet != null) resultSet.close();if (statement != null) statement.close();if (connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}
七、使用PreparedStatement防止SQL注入

Statement相比,PreparedStatement可以有效防止SQL注入。

String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 1);
ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("ID: " + id + ", Name: " + name);
}
八、事务处理

JDBC默认是自动提交模式。可以通过关闭自动提交模式来手动管理事务。

try {connection.setAutoCommit(false);// 执行多个更新操作statement.executeUpdate("INSERT INTO users (name) VALUES ('Alice')");statement.executeUpdate("INSERT INTO users (name) VALUES ('Bob')");// 提交事务connection.commit();
} catch (SQLException e) {try {// 回滚事务connection.rollback();} catch (SQLException ex) {ex.printStackTrace();}
} finally {try {connection.setAutoCommit(true);} catch (SQLException e) {e.printStackTrace();}
}
九、使用连接池

为了提高性能,减少连接的频繁创建和销毁,推荐使用连接池。常用的连接池实现有Apache DBCP、C3P0和HikariCP。

以下是使用HikariCP的示例:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class HikariCPDemo {public static void main(String[] args) {HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");config.setUsername("root");config.setPassword("password");DataSource dataSource = new HikariDataSource(config);try (Connection connection = dataSource.getConnection()) {String sql = "SELECT * FROM users";PreparedStatement preparedStatement = connection.prepareStatement(sql);ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("ID: " + id + ", Name: " + name);}} catch (SQLException e) {e.printStackTrace();}}
}

JDBC是Java与数据库交互的重要工具,掌握其使用方法对于开发高效、可靠的Java应用程序至关重要。通过学习JDBC的基本概念、核心组件和使用步骤,结合具体的代码示例,可以更好地理解和应用JDBC,提升数据库编程能力。

掌握事务处理和连接池的使用可以进一步提高应用程序的性能和稳定性。在实际项目中,通常会结合ORM框架(如Hibernate)来简化数据库操作,但JDBC的基本知识仍是必备的基础技能。

黑马程序员免费预约咨询

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

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

相关文章

gbase 扩容 集群数据同步 主备切换

问题: 问题1磁盘满 1.原本是100G的大小,我们实际还没接入真正业务,昨日空间满了,需要帮忙看下是什么原因导致磁盘满的吗 数据库是每天备份一次,是不是备份的太频繁,还是数据量的问题导致,需要…

[工具探索]富士mini90拍立得使用指南

文章目录 1. 基本功能介绍1.1 相机外观1.2 电池与胶片 2. 设置相机2.1 装入电池2.2 装入胶片 3. 拍摄模式3.1 标准模式3.2 儿童模式3.3 远景模式3.4 双重曝光模式3.5 Bulb(B)模式3.6 **派对模式**3.7 微距模式3.8 **亮度模式**3.9 **定时拍摄模式**3.10 …

Elastic Search(ES)Java 入门实操(2)搜索代码

上篇解释了 ES 的基本概念和分词器。Elastic Search (ES)Java 入门实操(1)下载安装、概念-CSDN博客 Elastic Search(ES)Java 入门实操(3)数据同步-CSDN博客 这篇主要演示 Java 整合…

React Hooks 封装可粘贴图片的输入框组件(wangeditor)

需求是需要一个文本框 但是可以支持右键或者ctrlv粘贴图片,原生js很麻烦,那不如用插件来实现吧~我这里用的wangeditor插件,初次写初次用,可能不太好,但目前是可以达到实现需求的一个效果啦!后面再改进吧~ …

个位为0的数字-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第81讲。 个位为0的数字&am…

标准发布实施 |《新能源电池工业废水处理技术指南磷酸铁锂电池》

T/ACEF 130-2024《新能源电池工业废水处理技术指南磷酸铁锂电池》欢迎各单位引用执行!有课题也可联合立项! 发布日期:2024年02月04日 实施日期:2024年03月01日 主要起草人:刘愿军、孙冬、丁炜鹏、何小芬…

whistle手机抓包

环境:whistle:2.9.59 whistle手机抓包(ios可以抓小程序的包;安卓机不能抓小程序的包,但是小程序的有开发者工具就够用了) 以安卓手机为例(手机跟电脑要连同一个wifi) 1.电脑安装w…

Django项目上线-报错汇总

Django项目上线-报错汇总 下列报错基本都是Python环境相关 pip install 报错 WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. debian运行pip报错ssl module in Python is not available - z417 - 博…

计算机专业本科论文起稿咋写

举例基于SpringBoot的Java基础的旅游管理系统 摘要 随着旅游业的快速发展,传统的旅游管理方式已经难以满足现代企业的需求。为了提高旅游企业的管理水平和服务质量,本文设计并实现了一个基于SpringBoot框架的旅游管理系统。本文首先介绍了旅游管理系统的…

Sql-labs的第一关

前言 我们在使用Sql-libs靶场进行Sql注入实验的时候,前提要求我们对mysql数据库结构要有一个大概的了解,因为mysql5.0以上的版本都会自带一个名为information_schema的数据库,这个数据库下面会有columns和tables两个表。 tables这个表的table…

3-1RT-Thread时钟管理

这里写自定义目录标题 时钟节拍是RT thread操作系统的最小时间单位。 第一个功能,rt tick值自动加1,在RT thread当中通过RT_USING_SMP定义了多核和单核的场景。第二个功能,检查当前线程的时间片,首先获取当前线程,将当…

Vitis HLS 学习笔记--初始化与复位

目录 1. 简介 2. 控制初始化与复位 2.1 初始化 2.2 复位 2.3 全局复位选项 2.4 复位排除 3. 阵列初始化和复位 3.1 不使用 static 限定符 3.2 使用 static 限定符 3.3 BRAM 和 URAM 4. 总结 1. 简介 本文对比分析两个方面的初始化和复位:阵列和控制&…

Java采取擦除式泛型到底兼容了什么场景?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!Java擦除式泛型是一个妥协,…

美颜相机「BeautyCam」v12.0.80 祛广告解索会员版(美妆相机功能,展现女神魅力)

软件介绍 美颜相机,一款由知名移动互联网企业Meitu Inc.开发的移动设备照片编辑与美化应用,起初主要针对娱乐消费市场,随后集成了商业营销功能。目前,它已跻身全球最受欢迎的手机摄影应用程序之列。在中国,美颜相机和…

JAVA高级-反射与动态代理(十五)

观看尚硅谷视频做的视频笔记 一、高级-反射与动态代理(十四) 1、反射概述 1)java程序中,所有的对象都有两种类型:编译时类型,运行时类型,而很多时候对象的编译类型和运行时类型不一致。 此处…

workerman error 2 send buffer full and drop package

来源 报错信息:workerman error 2 send buffer full and drop package 定时发送数据的时候,本地偶尔出现这种情况 线上第一条数据发出去就报错了,数据改小一点可以发,不过一会还是会出现这种情况。 解决 根据我的经验&#xf…

SAP HCM OPT函数作用

导读 INTRODUCTION OPT函数:SAP HCM工资核算是很多函数的汇总集,原有有兴趣问过SAP的人为什么SCHEMA需要这样设计,SAP的人说是用汇编的逻辑设计的,当时是尽可能用机器语言加速速度读取,每个函数都有对应的业务逻辑代码…

React实战(一)初始化项目、配置router、redux、axios

(一)初始化项目 1.安装项目 npx create-react-app 项目名 编译报错: 解决办法:安装最新的babel-preset-react-app npm install babel-preset-react-applatest 2.配置项目 (1)配置文件目录 (2)使用craco配置webpack.config npm install craco/crac…

Coze入门指南:创建Bot时,如何写好人设与回复逻辑(Persona Prompt)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Coze Bot 📒📝 Persona & Prompt🌟 # Character🌟 ## Skills🌟 # Overall Rules to follow🌟 ## Workflow🌟 ## Constraints📝 通用写法与模板📝 示例🌟技巧和注意事项⚓️ 相关链接 ⚓️📖 介绍 📖…

免费使用GPT-4生成图片的方法

写在前言 hello,大家好,我是一点,喜欢编程,目前持续在关注AI领域的发展,希望可以结交一些有意思的朋友。 大家可以关注我的公号:【一点sir】,了解更多文章,希望可以和你们成为朋友…