Java数据库编程
引言
在现代应用开发中,与数据库交互是不可或缺的一部分。Java提供了JDBC(Java Database Connectivity) API,允许开发者方便地连接到数据库并执行SQL操作。本文将详细介绍Java数据库编程的基础知识,包括JDBC的基本概念、数据库连接与操作、事务处理、以及使用ORM框架如Hibernate,并通过表格进行总结和示范。
JDBC基础
什么是JDBC?
JDBC是Java数据库连接的标准API,允许Java应用与数据库进行交互。JDBC API提供了与数据库连接、执行SQL查询、更新数据库和处理结果集的方法。
JDBC体系结构
组件 | 描述 |
---|---|
DriverManager | 管理一组JDBC驱动程序,实现数据库连接 |
Driver | 用于与数据库通信的JDBC驱动程序 |
Connection | 表示与特定数据库的连接,用于执行SQL语句 |
Statement | 用于执行SQL查询和更新 |
ResultSet | 表示SQL查询的结果,允许迭代和处理结果集 |
SQLException | 指示数据库访问错误的异常类 |
JDBC四大步骤
- 加载并注册数据库驱动
- 建立数据库连接
- 创建并执行SQL语句
- 处理结果与关闭资源
数据库连接与操作
连接数据库
使用DriverManager
获取数据库连接。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DatabaseConnection {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection connection = DriverManager.getConnection(url, username, password)) {System.out.println("Database connected!");} catch (SQLException e) {e.printStackTrace();}}
}
执行SQL查询
使用Statement
执行SQL查询并处理结果集。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class SelectQueryExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection connection = DriverManager.getConnection(url, username, password);Statement statement = connection.createStatement()) {String query = "SELECT * FROM users";ResultSet resultSet = statement.executeQuery(query);while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");String email = resultSet.getString("email");System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);}} catch (SQLException e) {e.printStackTrace();}}
}
更新数据库
使用PreparedStatement
执行SQL更新操作。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class UpdateQueryExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection connection = DriverManager.getConnection(url, username, password);PreparedStatement statement = connection.prepareStatement("UPDATE users SET email = ? WHERE id = ?")) {statement.setString(1, "newemail@example.com");statement.setInt(2, 1);int rowsAffected = statement.executeUpdate();System.out.println("Rows affected: " + rowsAffected);} catch (SQLException e) {e.printStackTrace();}}
}
JDBC常用类与方法表
类/接口 | 方法 | 描述 |
---|---|---|
DriverManager | getConnection(String, String, String) | 获取数据库连接 |
Connection | createStatement() | 创建Statement 实例 |
prepareStatement(String) | 创建PreparedStatement 实例 | |
close() | 关闭数据库连接 | |
Statement | executeQuery(String) | 执行SQL查询并返回ResultSet |
executeUpdate(String) | 执行SQL更新并返回受影响行数 | |
close() | 关闭Statement | |
PreparedStatement | setString(int, String) | 设置SQL参数值 |
setInt(int, int) | 设置SQL参数值 | |
executeUpdate() | 执行SQL更新并返回受影响行数 | |
executeQuery() | 执行SQL查询并返回ResultSet | |
close() | 关闭PreparedStatement | |
ResultSet | next() | 移动到下一行数据 |
getInt(String) | 获取当前行指定列的整数值 | |
getString(String) | 获取当前行指定列的字符串值 | |
close() | 关闭ResultSet | |
SQLException | getMessage() | 获取异常消息 |
printStackTrace() | 打印异常堆栈轨迹 |
事务处理
在数据库操作中,事务用于保证一组操作要么全部成功要么全部失败,确保数据一致性。事务具有四个属性(ACID):原子性、一致性、隔离性和持久性。
使用事务
使用Connection
对象的事务控制方法实现数据库事务。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TransactionExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection connection = DriverManager.getConnection(url, username, password)) {connection.setAutoCommit(false); // 开始事务try (PreparedStatement pst1 = connection.prepareStatement("UPDATE accounts SET balance = balance - ? WHERE id = ?");PreparedStatement pst2 = connection.prepareStatement("UPDATE accounts SET balance = balance + ? WHERE id = ?")) {pst1.setDouble(1, 100.0);pst1.setInt(2, 1);pst1.executeUpdate();pst2.setDouble(1, 100.0);pst2.setInt(2, 2);pst2.executeUpdate();connection.commit(); // 提交事务System.out.println("Transaction committed successfully.");} catch (SQLException e) {connection.rollback(); // 回滚事务System.out.println("Transaction rolled back.");e.printStackTrace();}} catch (SQLException e) {e.printStackTrace();}}
}
事务控制方法表
方法 | 描述 | 示例 |
---|---|---|
setAutoCommit(boolean) | 设置是否自动提交事务 | connection.setAutoCommit(false); |
commit() | 提交事务 | connection.commit(); |
rollback() | 回滚事务 | connection.rollback(); |
使用ORM框架:Hibernate
Hibernate是Java的一个流行的ORM(对象关系映射)框架,通过将Java对象映射到数据库表,简化了数据库操作并提高了生产力。
Hibernate配置
Hibernate通过hibernate.cfg.xml
文件进行配置,包括数据库连接信息和映射文件。
示例:hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><!-- 数据库连接配置 --><property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">password</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 映射类 --><mapping class="com.example.User"/></session-factory>
</hibernate-configuration>
Hibernate实体类
定义一个实体类,并使用Hibernate注解进行配置。
示例:User实体类
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name = "users")
public class User {@Idprivate int id;private String name;private String email;// Getters and setterspublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}
使用Hibernate进行数据库操作
使用Hibernate的Session
和Transaction
进行CRUD(创建、读取、更新、删除)操作。
示例:Hibernate CRUD操作
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;public class HibernateCRUDExample {public static void main(String[] args) {// 创建SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();// 创建Sessiontry (Session session = sessionFactory.openSession()) {// 创建TransactionTransaction transaction = session.beginTransaction();// 创建并保存一个新用户User user = new User();user.setId(1);user.setName("John Doe");user.setEmail("john.doe@example.com");session.save(user);System.out.println("User saved!");// 提交事务transaction.commit();} catch (Exception e) {e.printStackTrace();} finally {// 关闭SessionFactorysessionFactory.close();}}
}
Hibernate常用类与方法表
类/接口 | 方法 | 描述 |
---|---|---|
Configuration | configure() | 加载Hibernate配置文件 |
buildSessionFactory() | 创建SessionFactory 实例 | |
SessionFactory | openSession() | 打开一个新的Session实例 |
close() | 关闭SessionFactory 实例 | |
Session | beginTransaction() | 开始一个新的事务 |
save(Object) | 保存一个对象到数据库 | |
update(Object) | 更新数据库中的一个对象 | |
delete(Object) | 从数据库中删除一个对象 | |
get(Class, Serializable) | 根据标识符从数据库中获取一个对象 | |
Transaction | commit() | 提交事务 |
rollback() | 回滚事务 |
表格总结
JDBC常用类与方法表
类/接口 | 方法 | 描述 |
---|---|---|
DriverManager | getConnection(String, String, String) | 获取数据库连接 |
Connection | createStatement() | 创建Statement 实例 |
prepareStatement(String) | 创建PreparedStatement 实例 | |
close() | 关闭数据库连接 | |
Statement | executeQuery(String) | 执行SQL查询并返回ResultSet |
executeUpdate(String) | 执行SQL更新并返回受影响行数 | |
close() | 关闭Statement | |
PreparedStatement | setString(int, String) | 设置SQL参数值 |
setInt(int, int) | 设置SQL参数值 | |
executeUpdate() | 执行SQL更新并返回受影响行数 | |
executeQuery() | 执行SQL查询并返回ResultSet | |
close() | 关闭PreparedStatement | |
ResultSet | next() | 移动到下一行数据 |
getInt(String) | 获取当前行指定列的整数值 | |
getString(String) | 获取当前行指定列的字符串值 | |
close() | 关闭ResultSet | |
SQLException | getMessage() | 获取异常消息 |
printStackTrace() | 打印异常堆栈轨迹 |
事务控制方法表
方法 | 描述 | 示例 |
---|---|---|
setAutoCommit(boolean) | 设置是否自动提交事务 | connection.setAutoCommit(false); |
commit() | 提交事务 | connection.commit(); |
rollback() | 回滚事务 | connection.rollback(); |
Hibernate常用类与方法表
类/接口 | 方法 | 描述 |
---|---|---|
Configuration | configure() | 加载Hibernate配置文件 |
buildSessionFactory() | 创建SessionFactory 实例 | |
SessionFactory | openSession() | 打开一个新的Session实例 |
close() | 关闭SessionFactory 实例 | |
Session | beginTransaction() | 开始一个新的事务 |
save(Object) | 保存一个对象到数据库 | |
update(Object) | 更新数据库中的一个对象 | |
delete(Object) | 从数据库中删除一个对象 | |
get(Class, Serializable) | 根据标识符从数据库中获取一个对象 | |
Transaction | commit() | 提交事务 |
rollback() | 回滚事务 |
总结
本文详细介绍了Java数据库编程的基础知识,包括JDBC的基本概念、数据库连接与操作、事务处理、以及使用ORM框架如Hibernate。通过示例代码和表格总结,帮助读者更好地理解和应用Java中的数据库编程,提高数据操作的效率和安全性。
相关文章:

Java数据库编程
引言 在现代应用开发中,与数据库交互是不可或缺的一部分。Java提供了JDBC(Java Database Connectivity) API,允许开发者方便地连接到数据库并执行SQL操作。本文将详细介绍Java数据库编程的基础知识,包括JDBC的基本概念…...
决策树算法介绍:原理与案例实现
一、引言 决策树是一种常用于分类和回归任务的机器学习算法,因其易于理解和解释的特点,在数据分析和挖掘领域有着广泛应用。本文将介绍决策树算法的基本原理,并通过一个具体案例展示如何实现和应用该算法。 二、决策树算法原理 1. 决策树结…...
业务代表模式
业务代表模式 引言 在软件工程中,设计模式是解决常见问题的经典解决方案。它们为开发人员提供了一种方法,以优雅和可重用的方式处理软件开发中的挑战。业务代表模式(Business Delegate Pattern)是一种行为设计模式,它主要关注于将业务逻辑与表示层(如用户界面)分离,以…...

LeetCode 算法:反转链表 c++
原题链接🔗:反转链表 难度:简单⭐️ 题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2:…...

【多线程】Thread类及其基本用法
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. Java中多线程编程1.1 操作系统线程与Java线程1.2 简单使用多线程1.2.1 初步创建新线程代码1.2.2 理解每个…...

Springboot 整合 Flowable(一):使用 flowable-UI 绘制流程图
目录 一、Flowable简介 二、Flowable 与 Activiti 的区别 三、流程图的绘制(以员工请假流程图为例) 1、下载 flowable 的压缩包: 2、启动包中的 tomcat 3、登录页面 4、绘制结束,导出 bpmn20.xml文件 一、Flowable简介 Fl…...

课设--学生成绩管理系统(一)
欢迎来到 Papicatch的博客 文章目录 🍉技术核心 🍉引言 🍈标识 🍈背景 🍈项目概述 🍈 文档概述 🍉可行性分析的前提 🍈项目的要求 🍈项目的目标 🍈…...
thinkphp5模型的高级应用
ThinkPHP5 是一个基于 PHP 的轻量级框架,它提供了许多便利的功能来简化 Web 开发。在 ThinkPHP5 中,模型(Model)是 MVC(Model-View-Controller)架构中的重要组成部分,负责处理数据逻辑。以下是一…...
XML XSLT:技术与应用解析
XML XSLT:技术与应用解析 XML(可扩展标记语言)和XSLT(XML样式表转换语言)是现代信息技术中不可或缺的工具。本文将深入探讨XML和XSLT的概念、技术细节以及它们在实际应用中的作用。 XML简介 XML是一种用于存储和传输…...

嵌入式单片机中项目在线仿真工具分享
前段时间,无意间发现了一个不错的在线仿真工具(Wokwi),支持多种平台,支持市面上主流的开发板,比如:STM32、ESP32、Arduino、树莓派等。 还支持常见的传感器、显示器件(LCD、LED屏幕)等,还可以播放音乐、联网、逻辑分析仪等,关键还提供了很多实际项目的案例。 这款工…...

Unity动态添加聊天文本
1.创建一个滚动视图 2.调整滚动视图的位置并删掉这个 3.创建一个输入框和一个按钮 这里插一句一定要给content添加这个组件并设置单元格大小 4创建一个脚本并编写下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VisualScrip…...
力扣-2269. 找到一个数字的 K 美丽值
文章目录 力扣题目代码工程C实现python实现 力扣题目 一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目: 子字符串长度为 k 。 子字符串能整除 num 。 给你整数 num 和 k ,请你返回 num 的 k 美丽值。 注意: 允许有 前…...

一个在C#中集成Python的例子
一个在C#中集成Python的例子。在C#中可以执行Python脚本,在Python中也可以调用C#宿主中的功能(clr.AddReference(Business))。 文件说明 Debug为执行目录 Mgr.exe为执行文件 Py\init.py为python初始化脚本 Py\Lib.zip为python需要的模块&…...

基于RandLA-Net深度学习模型的激光点云语义分割
一、场景要素语义分割部分的文献阅读笔记 RandLA-Net是一种高效、轻量级的神经网络,其可直接逐点推理大规模点云的语义标签。RandLA-Net基于随机点采样获得了显著的计算和内存效率,并采用新的局部特征聚合模块有效地保留了几何细节,弥补了随机…...

C语言的结构体与联合体
引言 C语言提供了结构体和联合体两种聚合数据类型,使得程序员可以创建包括多个数据类型的复杂数据结构。结构体用于将不同类型的数据组合成一个单元,而联合体用于在同一存储空间中存储不同类型的数据。本篇文章将详细介绍C语言中的结构体和联合体&#x…...
React Hooks小记(三)_forwardRef
forwardRef 【写在前面】 1、ref 的作用是获取实例,但由于函数组件不存在实例,因此无法通过 ref 获取函数组件的实例引用,而 React.forwardRef 就是用来解决这个问题的。 2、React.forwardRef 会创建一个 React 组件,这个组…...
面试复习记录
六级终于结束了,之前背的八股几乎也忘得差不多了,今天开始继续准备秋招,以下是每天的安排,会按时更新,就当是一种对自己的督促,也欢迎小伙伴们一起来互相监督。 2024.6.16 力扣:sql基础题库50…...

块级元素与行内元素详解
在网页设计与开发中,元素根据其在页面布局中的表现可分为两大类:块级元素(Block-level Elements)和行内元素(Inline Elements)。理解它们的特性和使用规则对于构建结构清晰、布局合理的网页至关重要。 块级…...

Kotlin编程实践-【Java如何调用Kotlin中带默认值参数的函数】
问题 如果你有一个带有默认参数值的 Kotlin 函数,如何从 Java 调用它而无须为每个参数显式指定值? 方案 为函数添加注解JvmOverloads。 也就是为Java添加重载方法,这样Java调用Kotlin的方法时就不用传递全部的参数了。 示例 在 Kotlin …...

中国城市统计年鉴(1985-2023年)
数据年限:1985-2023 数据格式:pdf、excel 数据内容:共分四个部分 第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况; 第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...