怎么用Java写一个数据库?详细的步骤流程

在 Java 中编写一个与数据库交互的程序通常涉及以下几个步骤:

选择数据库和驱动:首先需要选择一个数据库(如 MySQL、PostgreSQL、SQLite 等),并确保安装了该数据库和相应的 JDBC 驱动。

创建数据库连接:使用 JDBC(Java Database Connectivity)API 来连接数据库。

执行 SQL 查询:使用 SQL 查询(如 SELECT、INSERT、UPDATE 等)来操作数据库。

处理结果:通过 ResultSet 获取查询结果并对其进行处理。

关闭连接:在数据库操作完成后,必须关闭数据库连接,以释放资源。

下面是一个使用 MySQL 数据库的简单 Java 示例:

步骤 1:导入 JDBC 驱动

确保你的项目中包含了 MySQL 的 JDBC 驱动。你可以通过 Maven 或直接将 JAR 文件添加到项目中。

Maven 依赖 (pom.xml):

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>  <!-- 使用最新版本 -->
</dependency>

如果你不使用 Maven,可以下载并手动将 mysql-connector-java 的 JAR 文件加入你的项目 classpath。

步骤 2:编写 Java 代码与数据库交互

import java.sql.*;

public class DatabaseExample {
    public static void main(String[] args) {
        // 数据库连接信息
        String url = "jdbc:mysql://localhost:3306/mydb";  // 数据库 URL
        String user = "root";  // 数据库用户名
        String password = "password";  // 数据库密码

        // SQL 查询
        String selectQuery = "SELECT id, name FROM users";

        // 1. 连接数据库
        try (Connection connection = DriverManager.getConnection(url, user, password)) {

            // 2. 创建 Statement 对象
            Statement statement = connection.createStatement();

            // 3. 执行查询
            ResultSet resultSet = statement.executeQuery(selectQuery);

            // 4. 处理查询结果
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }

            // 5. 关闭连接
            resultSet.close();
            statement.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

代码解析:

连接数据库:

DriverManager.getConnection(url, user, password) 用于建立到数据库的连接。

url 是数据库的地址(在本例中是 MySQL 本地安装的数据库),user 和 password 分别是数据库的用户名和密码。

执行 SQL 查询:

创建一个 Statement 对象,它用于执行 SQL 查询。

statement.executeQuery(selectQuery) 执行查询并返回结果集(ResultSet)。

处理查询结果:

ResultSet 存储了从数据库查询出来的数据。通过 resultSet.getInt() 和 resultSet.getString() 获取每一行数据的指定字段。

关闭连接:

resultSet.close() 和 statement.close() 用于关闭数据库资源。

在使用 try-with-resources 的情况下,Connection 会自动关闭。

步骤 3:使用其他 SQL 操作(INSERT、UPDATE、DELETE)

你可以根据需要修改 SQL 查询,执行其他类型的 SQL 操作:

插入数据(INSERT)

String insertQuery = "INSERT INTO users (name, age) VALUES (?, ?)";

try (Connection connection = DriverManager.getConnection(url, user, password);
     PreparedStatement preparedStatement = connection.prepareStatement(insertQuery)) {
   
    // 设置参数
    preparedStatement.setString(1, "John Doe");
    preparedStatement.setInt(2, 25);

    // 执行插入操作
    int rowsAffected = preparedStatement.executeUpdate();
    System.out.println("Inserted " + rowsAffected + " row(s).");

} catch (SQLException e) {
    e.printStackTrace();
}

更新数据(UPDATE)

String updateQuery = "UPDATE users SET age = ? WHERE name = ?";

try (Connection connection = DriverManager.getConnection(url, user, password);
     PreparedStatement preparedStatement = connection.prepareStatement(updateQuery)) {
   
    // 设置参数
    preparedStatement.setInt(1, 26);  // 更新年龄为 26
    preparedStatement.setString(2, "John Doe");  // 指定用户名为 John Doe

    // 执行更新操作
    int rowsAffected = preparedStatement.executeUpdate();
    System.out.println("Updated " + rowsAffected + " row(s).");

} catch (SQLException e) {
    e.printStackTrace();
}

删除数据(DELETE)

String deleteQuery = "DELETE FROM users WHERE name = ?";

try (Connection connection = DriverManager.getConnection(url, user, password);
     PreparedStatement preparedStatement = connection.prepareStatement(deleteQuery)) {
   
    // 设置参数
    preparedStatement.setString(1, "John Doe");  // 删除名为 John Doe 的用户

    // 执行删除操作
    int rowsAffected = preparedStatement.executeUpdate();
    System.out.println("Deleted " + rowsAffected + " row(s).");

} catch (SQLException e) {
    e.printStackTrace();
}

处理异常与优化

使用 PreparedStatement 替代 Statement: PreparedStatement 可以防止 SQL 注入攻击,并且在执行重复查询时比 Statement 更高效。

事务控制:如果你的操作涉及多个查询(例如,插入多个数据),可以通过手动控制事务来保证操作的原子性。

try (Connection connection = DriverManager.getConnection(url, user, password)) {
    connection.setAutoCommit(false);  // 关闭自动提交
   
    // 执行多个 SQL 查询

    connection.commit();  // 提交事务
} catch (SQLException e) {
    e.printStackTrace();
    // 出现异常时回滚事务
    connection.rollback();
}

总结

你需要导入 JDBC 驱动,配置数据库连接,并编写 SQL 语句。

通过 Connection 对象建立与数据库的连接。

使用 Statement 或 PreparedStatement 执行 SQL 查询。

获取查询结果并进行处理,最终关闭数据库连接。

通过这些基本的步骤,你就能实现一个简单的数据库操作程序。根据实际需求,你可以扩展这个程序,处理更复杂的数据库操作,如批量插入、存储过程调用等。

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

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

相关文章

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行…

继承详细总结

一.继承的定义与概念 1.定义&#xff1a;继承是一种is-a的关系&#xff0c;例如&#xff0c;哺乳动物是动物&#xff0c;狗是哺乳动物&#xff0c;因此&#xff0c;狗是动物&#xff0c;等等。 2.允许我们在保持原有类特性的基础上进行扩展&#xff0c;增加方法(成员函数) 和 属…

批量多线程给TXT文档插入相关腾讯AI【高质量无水印无版权】原创图片

给蜘蛛访问的网站文章插入相关图片&#xff0c;可以带来以下好处&#xff1a; ‌1、提升用户体验‌&#xff1a;图片能够直观地展示文章内容&#xff0c;帮助用户更好地理解和消化信息。对于阅读者来说&#xff0c;图文并茂的内容往往更具吸引力&#xff0c;也能提高他们的阅读…

牵手红娘:牵手App红娘助力“牵手”,脱单精准更便捷

随着互联网的普及&#xff0c;现代青年的社交圈层加速扩大&#xff0c;他们的恋爱观也正经历着前所未有的转变。在繁忙的工作之余&#xff0c;人们希望能够找到一种既高效又真诚的交友方式。于是&#xff0c;线上交友平台成为了他们寻找爱情的新选择。让不同文化背景、不同工作…

STM32-笔记12-实现SysTick模拟多线程流水灯

1、前言 正常STM32实现多线程&#xff0c;需要移植一个操作系统FreeRTOS。但是在这里不移植FreeRTOS怎么实现多线程呢&#xff1f;使用SysTick&#xff0c;那么怎么使用SysTick来模拟多线程呢&#xff1f;前面我们知道SysTick就是一个定时器&#xff0c;它不是在主函数的while循…

麒麟信安受邀出席开放原子园区行暨供需对接活动,分享基于关基领域打造的行业解决方案

12月17日&#xff0c;武汉市经信局和开放原子开源基金会共同主办开放原子园区行暨供需对接活动&#xff0c;旨在推进武汉市开源体系建设&#xff0c;推动开源技术赋能千行百业。活动吸引了武汉市委金融办、市卫健委、疾控中心、医保局、信息中心(大数据中心)、市红十字会、银行…

golang 并发--goroutine(四)

golang 语言最大的特点之一就是语法上支持并发&#xff0c;通过简单的语法很容易就能创建一个 go 程&#xff0c;这就使得 golang 天生适合写高并发的程序。这一章节我们就主要介绍 go 程&#xff0c;但是要想完全理解 go 程我们需要深入研究 GPM 模型&#xff0c;关于 GPM 模型…

SpringAI人工智能开发框架006---SpringAI多模态接口_编程测试springai多模态接口支持

可以看到springai对多模态的支持. 同样去创建一个项目 也是跟之前的项目一样,修改版本1.0.0 这里 然后修改仓库地址,为springai的地址 然后开始写代码

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇&#xff0c;讲述如何将JSON文档存储到数据库中&#xff0c;包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab&#xff0c;其中color列的长度设为4000。若color的长度需要设为32767&a…

SOME/IP 协议详解——信息格式

文章目录 1. 头部格式1.1 消息 ID&#xff08;Message ID&#xff09;1.2 长度&#xff08;Length&#xff09;1.3 请求 ID&#xff08;Request ID&#xff09;1.4 协议版本&#xff08;Protocol Version&#xff09;&#xff1a;1.5 接口版本&#xff08;Interface Version&am…

Spring学习(一)——Sping-XML

一、Spring的概述 (一)什么是Spring? Spring是针对bean对象的生命周期进行管理的轻量级容器。提供了功能强大IOC、AOP及Web MVC等功能。Spring框架主要由七部分组成&#xff1a;分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 S…

用 gdbserver 调试 arm-linux 上的 AWTK 应用程序

很多嵌入式 linux 开发者都能熟练的使用 gdb/lldb 调试应用程序&#xff0c;但是还有不少朋友在调试开发板上的程序时&#xff0c;仍然在使用原始的 printf。本文介绍一下使用 gdbserver 通过网络调试开发板上的 AWTK 应用程序的方法&#xff0c;供有需要的朋友参考。 1. 下载 …

树莓派换源

查询自己版本&#xff1a; lsb_release -a bullseye可以理解为树莓派的系统代号&#xff08;10&#xff0c;11&#xff0c;12都不同&#xff0c;一定要看好自己系统是什么版本&#xff09; 查询架构 uname -a aarch64的地方就是代表系统架构的&#xff0c;我的是aarch64的架…

MySQL索引-索引的结构和原理

索引原理 查找算法 顺序查找 数组链表 二分查找 B树跳表 散列查找 Hash表 DFS 树图 BFS 树图 分块查找 海量数据 Hash结构 Hash索引可以方便的提供等值查询&#xff0c;但是对于范围查询就需要全表扫描了。 Hash索引在MySQL 中Hash结构主要应用在InnoDB 自适应哈希索引。…

【Linux探索学习】第二十三弹——理解文件系统:认识硬件、探索文件在硬件上的存储问题

Linux学习笔记&#xff1a;https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 我们前面讲过了文件的组成是由文件内容和文件属性两者组成的&#xff0c;但是我们前面接触的文件都是系统中的文件&#xff0c;都是已经在进…

深度学习中的并行策略概述:2 Data Parallelism

深度学习中的并行策略概述&#xff1a;2 Data Parallelism 数据并行&#xff08;Data Parallelism&#xff09;的核心在于将模型的数据处理过程并行化。具体来说&#xff0c;面对大规模数据批次时&#xff0c;将其拆分为较小的子批次&#xff0c;并在多个计算设备上同时进行处…

分布式专题(10)之ShardingSphere分库分表实战指南

一、ShardingSphere产品介绍 Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。Apache ShardingSphere 设计哲学为 Database Plus&#xff0c;旨在…

帧缓存的分配

帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存&#xff0c;使用的是一个叫 ION 的内核模块&#xff0c;App 使用 ioctl 系统调用后&#xff0c;会在内核内存中分配一块符合要求的内存&#xff0c;用户态会拿到一个 fd&#xff08;有的地方也称之为 handle&…

vue3+vite一个IP对站点名称的前端curd更新-会议系统优化

vue3-tailwind-todo https://github.com/kgrg/vue3-tailwind-todo 基于这个项目,把ip到sta的映射做了前端管理. 核心代码是存储和获得的接口,需要flask提供. def redis2ipdic():global ipdicipdic.clear()tmdiccl.hgetall(IPDIC_KEY)for k in tmdic.keys():ipdic[k.decode() …

Elasticsearch-脚本查询

脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能&#xff0c;ES支持多种脚本语言&#xff0c;如painless&#xff0c;其语法类似于Java,也有注释、关键字、类型、变量、函数等&#xff0c;其就要相对于其他脚本高出几倍的性…