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四大步骤

  1. 加载并注册数据库驱动
  2. 建立数据库连接
  3. 创建并执行SQL语句
  4. 处理结果与关闭资源

数据库连接与操作

连接数据库

使用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常用类与方法表

类/接口方法描述
DriverManagergetConnection(String, String, String)获取数据库连接
ConnectioncreateStatement()创建Statement实例
prepareStatement(String)创建PreparedStatement实例
close()关闭数据库连接
StatementexecuteQuery(String)执行SQL查询并返回ResultSet
executeUpdate(String)执行SQL更新并返回受影响行数
close()关闭Statement
PreparedStatementsetString(int, String)设置SQL参数值
setInt(int, int)设置SQL参数值
executeUpdate()执行SQL更新并返回受影响行数
executeQuery()执行SQL查询并返回ResultSet
close()关闭PreparedStatement
ResultSetnext()移动到下一行数据
getInt(String)获取当前行指定列的整数值
getString(String)获取当前行指定列的字符串值
close()关闭ResultSet
SQLExceptiongetMessage()获取异常消息
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 {
    @Id
    private int id;
    private String name;
    private String email;

    // Getters and setters
    public 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的SessionTransaction进行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) {
        // 创建SessionFactory
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

        // 创建Session
        try (Session session = sessionFactory.openSession()) {
            // 创建Transaction
            Transaction 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 {
            // 关闭SessionFactory
            sessionFactory.close();
        }
    }
}

Hibernate常用类与方法表

类/接口方法描述
Configurationconfigure()加载Hibernate配置文件
buildSessionFactory()创建SessionFactory实例
SessionFactoryopenSession()打开一个新的Session实例
close()关闭SessionFactory实例
SessionbeginTransaction()开始一个新的事务
save(Object)保存一个对象到数据库
update(Object)更新数据库中的一个对象
delete(Object)从数据库中删除一个对象
get(Class, Serializable)根据标识符从数据库中获取一个对象
Transactioncommit()提交事务
rollback()回滚事务

表格总结

JDBC常用类与方法表

类/接口方法描述
DriverManagergetConnection(String, String, String)获取数据库连接
ConnectioncreateStatement()创建Statement实例
prepareStatement(String)创建PreparedStatement实例
close()关闭数据库连接
StatementexecuteQuery(String)执行SQL查询并返回ResultSet
executeUpdate(String)执行SQL更新并返回受影响行数
close()关闭Statement
PreparedStatementsetString(int, String)设置SQL参数值
setInt(int, int)设置SQL参数值
executeUpdate()执行SQL更新并返回受影响行数
executeQuery()执行SQL查询并返回ResultSet
close()关闭PreparedStatement
ResultSetnext()移动到下一行数据
getInt(String)获取当前行指定列的整数值
getString(String)获取当前行指定列的字符串值
close()关闭ResultSet
SQLExceptiongetMessage()获取异常消息
printStackTrace()打印异常堆栈轨迹

事务控制方法表

方法描述示例
setAutoCommit(boolean)设置是否自动提交事务connection.setAutoCommit(false);
commit()提交事务connection.commit();
rollback()回滚事务connection.rollback();

Hibernate常用类与方法表

类/接口方法描述
Configurationconfigure()加载Hibernate配置文件
buildSessionFactory()创建SessionFactory实例
SessionFactoryopenSession()打开一个新的Session实例
close()关闭SessionFactory实例
SessionbeginTransaction()开始一个新的事务
save(Object)保存一个对象到数据库
update(Object)更新数据库中的一个对象
delete(Object)从数据库中删除一个对象
get(Class, Serializable)根据标识符从数据库中获取一个对象
Transactioncommit()提交事务
rollback()回滚事务

总结

本文详细介绍了Java数据库编程的基础知识,包括JDBC的基本概念、数据库连接与操作、事务处理、以及使用ORM框架如Hibernate。通过示例代码和表格总结,帮助读者更好地理解和应用Java中的数据库编程,提高数据操作的效率和安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI金融投资:批量下载深交所公募REITs公开说明书

打开深交所公募REITs公开说明书页面&#xff0c;F12查看网络&#xff0c;找到真实地址&#xff1a;https://reits.szse.cn/api/disc/announcement/annList?random0.3555675437003616 { "announceCount": 39, "data": [ { "id": "80bc9…

循环订单激励:打造企业增长新引擎

循环订单激励&#xff1a;打造企业增长新引擎 在当今竞争激烈的商业环境中&#xff0c;许多企业都在寻求独特而高效的营销策略以吸引并留住客户。今天&#xff0c;我要为您介绍的是一种名为“循环订单激励”的新颖模式&#xff0c;它不仅能提升客户参与度&#xff0c;还能为企…

《站在2024年的十字路口:计算机专业是否仍是高考生的明智之选?》

文章目录 每日一句正能量前言行业竞争现状行业饱和度和竞争激烈程度[^3^]新兴技术的影响[^3^]人才需求的变化[^3^]行业创新动态如何保持竞争力 专业与个人的匹配度判断专业所需的技术能力专业核心课程对学生的要求个人兴趣和性格特点专业对口的职业发展要求实践和经验个人价值观…

vivado HW_VIO

描述 虚拟输入/输出&#xff08;VIO&#xff09;调试核心hw_VIO可以监视和驱动内部 在编程的XilinxFPGA上实时显示信号。在没有物理访问的情况下 目标硬件&#xff0c;可以使用此调试功能来驱动和监视 存在于物理设备上。 VIO核心具有硬件探测器hw_probe对象&#xff0c;用于监…

VS2022,编译最新版obs30.1

VS2022&#xff0c;编译最新版obs30.1 VS2022&#xff0c;编译最新版obs30.1 VS2022&#xff0c;编译最新版obs30.1一、源码编译1.1 官方编译1.2 利用cmake软件进行编译 二、为二次开发做准备遇到问题&#xff0c;暂时无法解决 一、源码编译 编译环境Win11&#xff0c;VS2022&…

C++语法08 数据类型之间的强制转换

目录 强制类型转换 强制类型转换格式 整型转换成浮点型 整型转换成浮点型其他写法 训练&#xff1a;糖果奖励 糖果奖励参考代码 浮点型转换成整型 浮点型转换成整型其他写法 训练&#xff1a;分离小数 分离小数参考代码 强制类型转换 强制类型转换&#xff0c;就是把…

C++ static关键字详解

背景 前段时间初步整理了C中static的相关知识点&#xff0c;以此做个记录。 在C中&#xff0c;static关键字是常见的修饰符。从大方向上static分为两类&#xff1a; 1.类或结构体外的static 2.类或结构体内的static 因此&#xff0c;本文内容的划分如下&#xff1a; 接下来会…

Vue42-vc与vm的原型对象

一、普通函数与其对象的原型对象 显示原型属性&#xff0c;只有函数才有&#xff01;&#xff01;&#xff01; 实例对象只有隐式原型属性。 普通函数与其对象&#xff0c;指向同一个原型对象&#xff01;&#xff01;&#xff01; 这么写不推荐&#xff0c;建议直接如下格式&a…

k8s学习--helm的详细解释及安装和常用命令

文章目录 Helm简介什么是Helm主要组件核心概念chart结构总结 应用环境一、helm部署二、helm基础使用 Helm简介 什么是Helm Helm 是 Kubernetes 的一个包管理工具&#xff0c;它允许用户定义、安装和升级复杂的 Kubernetes 应用程序。Helm 通过使用 “Charts” 的概念来简化应…

byzer 笔记总结

1.总览&#xff08;简单了解&#xff09; 1.1 数据挖掘的定义 基于大数据技术&#xff0c;针对有价值是业务场景&#xff0c;对数据中台沉淀的大量数据进行探索&#xff0c;分析。寻找数据与数据之间潜藏的关系&#xff0c;转化为自动化的算法模型&#xff0c;从而获取有价值的…

【SpringBoot + Vue 尚庭公寓实战】地区信息管理接口实现(九)

【SpringBoot Vue 尚庭公寓实战】地区信息管理接口实现&#xff08;九&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】地区信息管理接口实现&#xff08;九&#xff09;1、业务说明2、数据逻辑模型3、接口实现3.1、查询省份信息列表3.2、根据省份ID查询城市信息列表3…

Hexapod C-887使用手册 -- 4,5,6

4 - 拆包 小心拆包C-887 根据合同和发货注意比较发货范围的内容&#xff1a; 检查危险符号的内容。如果任何零件损坏或缺失&#xff0c;立即联系客服部门。 保存所有包装材料&#xff0c;以防产品需要返厂。 5 - 安装 本章中 安装一般注意 安装PC软件 确保通风 接地C-…

增材制造引领模具创新之路

随着科技的快速发展和制造业的不断转型升级&#xff0c;增材制造&#xff08;也称为3D打印&#xff09;技术正逐渐展现出其在模具智造中的巨大潜力和优势。增材制造以其独特的加工方式和设计理念&#xff0c;为模具行业带来了革命性的变革&#xff0c;为传统制造业注入了新的活…

第二十三节:带你梳理Vue2:Vue插槽的认识和基本使用

前言: 通过上一节的学习,我们知道了如何将数据从父组件中传递到子组件中, 除了除了将数据作为props传入到组件中,Vue还允许传入HTML, Vue 实现了一套内容分发的 API&#xff0c;这套 API 的设计灵感源自 Web Components 规范草案&#xff0c;将 <slot> 元素作为承载分发…

2千泰中英泰语词汇对照含MP3真人读音

越来越多的人到泰国旅游&#xff0c;今天这一份数据就是服务于此&#xff0c;包含了2000条泰语的日常生活词汇&#xff0c;并且每条记录都含有真人发音MP3对应。 有分100个章节&#xff0c;每个章节共有20条记录&#xff0c;非常适合一章节一章节的学习&#xff0c;具体章节有&…

R可视化:R语言基础图形合集

R语言基础图形合集 欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 基础图形可视化 数据分析的图形可视化是了解数据分布、波动和相关性等属性必…

班子考核评价的重要性与实施方法

在组织管理领域&#xff0c;班子考核评价是一项至关重要的工作&#xff0c;它不仅关系到组织的发展方向和速度&#xff0c;更直接影响到组织的凝聚力和战斗力。一个科学、公正、有效的班子考核评价体系&#xff0c;能够准确反映班子的工作成效&#xff0c;激励班子成员积极作为…

刺客信条找不到emp.dll怎么解决?emp.dll缺失的解决方法解析

emp.dll 是一个动态链接库文件&#xff0c;它在Windows操作系统中扮演着重要的角色。这个文件包含了多个函数和接口&#xff0c;允许其他程序调用这些功能来实现对多媒体设备的控制和管理。根据搜索结果&#xff0c;emp.dll 主要负责以下功能&#xff1a; 多媒体设备管理&…

XP系统安装Node.js v8.6.0并搭建Vue2开发环境(项目兼容到Vista的IE9浏览器)

下载并安装Node.js v8.6.0 通常我们开发Vue2项目&#xff0c;是通过vue create命令建立Vue2工程&#xff0c;用npm run serve命令启动Vue2网站的。 vue命令是用JavaScript写的&#xff0c;不是用C语言写的&#xff0c;必须要Node.js环境才能运行&#xff0c;由Node.js自带的np…

驱动开发(三):内核层控制硬件层

驱动开发系列文章&#xff1a; 驱动开发&#xff08;一&#xff09;&#xff1a;驱动代码的基本框架 驱动开发&#xff08;二&#xff09;&#xff1a;创建字符设备驱动 驱动开发&#xff08;三&#xff09;&#xff1a;内核层控制硬件层​​​​​​​ ←本文 目录…