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 数据内容:共分四个部分 第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况; 第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
