JAVA基础 - 数据库编程

news2024/9/22 23:27:18

目录

一. 简介

二. 数据持久化

三. 安装MySQL

四. JDBC API

五. 三个重要接口



一. 简介

数据库编程是指使用编程语言与数据库进行交互,以实现数据的存储、检索、更新、删除等操作。

在数据库编程中,常见的任务包括:

  1. 连接数据库:通过特定的驱动程序和连接字符串,建立应用程序与数据库的通信链路。

  2. 执行 SQL 语句:使用编程语言发送结构化查询语言(SQL)语句到数据库服务器,如 SELECT 进行查询、INSERT 进行插入、UPDATE 进行更新、DELETE 进行删除等。

  3. 处理结果集:对于查询操作,接收并处理从数据库返回的结果集,提取所需的数据。

  4. 事务处理:确保一组相关的数据库操作要么全部成功,要么全部失败,以保持数据的一致性。

  5. 错误处理:捕获和处理在与数据库交互过程中可能出现的各种错误。

数据库编程可以使用多种编程语言,如 Java、Python、C# 等。每种语言都有相应的数据库连接库和 API 来实现与不同类型数据库(如 MySQL、Oracle、SQL Server 等)的交互。

数据库编程的目的是使应用程序能够有效地利用数据库来存储和管理数据,为业务逻辑提供可靠的数据支持。

例如,在一个电子商务网站中,数据库编程用于管理用户信息、订单详情、商品库存等数据。

通过合理的数据库编程,可以提高应用程序的性能、数据的安全性和准确性。

二. 数据持久化

数据持久化是指将数据在瞬时状态和持久状态之间进行转换的过程。简单来说,就是将程序运行时产生的数据(通常存放在内存中)保存到非易失性存储介质(如硬盘、数据库等)中,以便在程序关闭后数据不会丢失,并且在下次程序启动时能够重新加载和使用。

数据持久化的主要作用包括:

  1. 数据备份和恢复:确保数据的安全性和可用性,在出现故障或错误时能够恢复数据。

  2. 长期存储:内存中的数据在计算机关闭后会丢失,而持久化的数据可以长期保存。

  3. 数据共享:多个应用程序或用户可以访问和使用持久化的数据。

常见的数据持久化技术和方法有:

  1. 文件存储:将数据以特定的格式(如文本、二进制等)写入文件。

  2. 数据库:使用关系型数据库(如 MySQL、Oracle)或非关系型数据库(如 MongoDB、Redis)来存储和管理数据。

  3. 对象关系映射(ORM)框架:如 Hibernate、MyBatis 等,用于在面向对象编程语言和关系型数据库之间进行映射和数据操作。

  4. 序列化:将对象转换为字节流进行存储或传输,反序列化则将字节流还原为对象。

例如,在一个在线博客系统中,文章的内容、用户的评论等数据都需要进行持久化,以便用户随时可以查看历史记录,并且系统在重启后数据仍然存在。

总之,数据持久化是软件开发中非常重要的一个环节,有助于保证数据的完整性、一致性和可用性。

三. 安装MySQL

社区版下载地址

MySQL :: Download MySQL Installer

一直下一步下一步即可.

四. JDBC API

JDBC(Java Database Connectivity)API 是 Java 中用于连接数据库和执行数据库操作的一组标准接口和类。

JDBC API 的主要组成部分包括:

  1. DriverManager 类:用于管理数据库驱动程序,并建立与数据库的连接。

  2. Connection 接口:代表与数据库的连接。

  3. Statement 接口:用于执行静态的 SQL 语句。

  4. PreparedStatement 接口:用于执行预编译的 SQL 语句,可提高性能和防止 SQL 注入。

  5. CallableStatement 接口:用于执行存储过程。

  6. ResultSet 接口:表示数据库查询结果集,用于遍历和获取数据。

使用 JDBC API 的一般步骤如下:

  1. 加载数据库驱动:
Class.forName("com.mysql.jdbc.Driver"); 
  1. 获取数据库连接:
String url = "jdbc:mysql://localhost:3306/database_name";
String username = "username";
String password = "password";

Connection connection = DriverManager.getConnection(url, username, password);
  1. 创建执行语句对象:
Statement statement = connection.createStatement();
// 或
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM table_name WHERE column =?");
  1. 执行 SQL 语句:
ResultSet resultSet = statement.executeQuery("SELECT * FROM table_name");
// 或
preparedStatement.setString(1, "value");
preparedStatement.executeUpdate();
  1. 处理结果集(如果是查询操作):
while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    // 处理获取到的数据
}
  1. 关闭资源:
resultSet.close();
statement.close();
connection.close();

JDBC API 为 Java 应用程序与各种不同的数据库进行交互提供了统一的方式,使得开发者可以在不修改大量代码的情况下切换数据库。

实例代码

package org.example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        // 数据库连接参数
        String url = "jdbc:mysql://localhost:3306/student";
        String username = "root";
        String password = "123456";

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            // 准备 SQL 查询语句
            String sql = "SELECT * FROM students";
            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();
        }
    }
}

ps

五. 三个重要接口

  1. Connection

    Connection 对象代表与数据库的连接。通过它,您可以与数据库进行通信和执行各种操作。

    主要方法和功能:

    • createStatement():创建一个 Statement 对象,用于执行静态的 SQL 语句。
    • prepareStatement(String sql):创建一个预编译的 PreparedStatement 对象,用于执行带有参数的 SQL 语句。
    • commit():提交当前事务。
    • rollback():回滚当前事务。
    • close():关闭与数据库的连接,释放相关资源。
  2. Statement

    Statement 对象用于执行静态的 SQL 语句。

    主要方法和功能:

    • executeQuery(String sql):用于执行 SELECT 语句,返回一个 ResultSet 对象来获取查询结果。
    • executeUpdate(String sql):用于执行 INSERTUPDATEDELETE 等语句,返回受影响的行数。
    • close():关闭 Statement 对象,释放资源。
     

    由于 Statement 每次执行 SQL 语句时都需要重新编译,效率相对较低,并且容易受到 SQL 注入攻击。

  3. ResultSet

    ResultSet 对象代表从数据库查询返回的结果集。

    主要方法和功能:

    • next():将指针移动到下一行,如果有下一行则返回 true,否则返回 false
    • getXXX() 方法(如 getInt()getString() 等):根据指定的数据类型获取当前行指定列的值。
    • close():关闭 ResultSet 对象,释放相关资源。
     

    在使用完 ResultSet 后,务必调用 close() 方法来释放资源,以避免资源泄漏。

例如,以下是一个简单的示例展示它们的使用:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DatabaseExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/database_name";
        String username = "username";
        String password = "password";

        try (Connection connection = DriverManager.getConnection(url, username, password);
             PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM table_name");
             ResultSet resultSet = preparedStatement.executeQuery()) {

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                // 处理获取到的数据
            }

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

在上述示例中,首先建立连接,然后创建预处理语句并执行查询得到结果集,最后通过遍历结果集获取数据。

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

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

相关文章

Spring统一返回类型中关于String的问题

文章目录 1. 问题铺垫2. 解决方法3. 问题分析4 解决方法解释 1. 问题铺垫 首先设置了以下代码统一处理返回类型 ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice {Overridepublic boolean supports(MethodParameter returnType, Class converte…

GuLi商城-新增商品-获取分类下所有分组以及属性

/*** 根据分类id查询出所有的分组以及这些组里面的属性* @param catelogId* @return*/ @Override public List<AttrGroupWithAttrsVo> getAttrGroupWithAttrsByCatelogId(Long catelogId) {//1、查询分组信息List<AttrGroupEntity> attrGroupEntities = this.list(…

SwiftUI 中掌握 ScrollView 的使用:滚动可见性

文章目录 前言视图修饰符应用场景可见性完整示例ContentViewVideoPlayerViewScrollViewVisibilityApp 总结 前言 我们的滚动 API 中又有一个重要的新增功能&#xff1a;滚动可见性。现在&#xff0c;你可以获取可见标识符列表&#xff0c;或者快速检查并监控 ScrollView 内视图…

一文彻底搞懂 Fine-tuning - 超参数(Hyperparameter)

最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解…

【Unity】web gl inputFied 中文输入,同时支持TextMeshInputFied,支持全屏

同时支持TextMeshInputFied&#xff0c;支持全屏。 使用github包【WebGLInput】&#xff1a;https://github.com/kou-yeung/WebGLInput 需要资源的在这里也可以下载 https://download.csdn.net/download/weixin_46472622/89600795 用于unity web gl 中文输入&#xff0c;只需…

本地项目提交到Gitee

在项目目录 右键 git bash here 可以在黑屏输入命令 也可以在项目里面 命令都是一样的 要排除哪些 git add . 添加所有文件 git commit -m "Initial commit" 提交到本地 git remote add origin https://gitee.com/xxxx/xxxx.git 添加远程仓库 …

2-54 基于matlab的模糊自适应PID控制器

基于matlab的模糊自适应PID控制器&#xff0c;PID参数的整定必须考虑到在不同时刻三个参数的作用及相互之间的关系。在线实时模糊自整定PID算法的基础上&#xff0c;通过计算当前系统e和误差变化率ec&#xff0c;利用模糊规则进行模糊推理&#xff0c;查询模糊矩阵表进行参数调…

xss漏洞原理及利用【万字详解】

文章目录 url处XSS图片处XSS攻击svg-xss概念复现 pdf-xss概念复现 游览器翻译-xssflash-xss概念常见造成xss中的swf文件函数举例说明&#xff1a; cookie的获取概念代码审计复现 cookie的获取概念代码审计复现 页面信息获取概念条件复现 xss配合MSf钓鱼概念复现 XSS修复对危险字…

47 集合操作与运算

1 增加与删除集合元素 集合对象的 add() 方法可以增加新元素&#xff0c;如果该元素已存在则忽略该操作&#xff0c;不会抛出异常&#xff1b;update() 方法合并另外一个集合中的元素到当前集合中&#xff0c;并自动去除重复元素。 s {1, 2, 3} print(s) s.add(3) # 增加元…

C# 设计模式之装饰器模式

总目录 前言 装饰器模式的主要作用就是扩展一个类的功能&#xff0c;或给一个类添加多个变化的情况。学习面向对象的都知道&#xff0c;如果想单纯的给某个类增加一些功能&#xff0c;可以直接继承该类生成一个子类就可以。应对一些简单的业务场景继承也就够了&#xff0c;但是…

学习笔记-优化问题

目录 一、目前的问题 1、axios 2、跨域问题 3. 路由安全 二、解决问题 1. 跨域问题 2. 优化URL devServer 1. 配置 devServer 2. 修改请求路径 3. 重启 vue 4. 测试 5. pathRewrite 6. 重启 7. 测试 3. 优化 res.data 4. 判断状态码 5. 引入axios 1. 创建自…

【C++】2.C++入门(2)

文章目录 6.引用6.1 引用概念6.2 引用特性6.3 使用场景6.4 const引用&#xff08;常引用&#xff09;6.5 引用和指针的区别 7.inline7.1inline代码举例&#xff1a;7.2inline代码错误示范7.3实现一个ADD宏函数的常见问题&#xff1a; 8.nullptr 6.引用 6.1 引用概念 引用不是…

Yolov8在RK3588上进行自定义目标检测(三)

参考 Yolov8在RK3588上进行自定义目标检测(一) Yolov8在RK3588上进行自定义目标检测(二) best.onnx转yolov8.rknn onnx转rknn需要用到rknn-toolkit2&#xff0c;这个工具暂时不支持windows&#xff0c;所以我们移步linux&#xff0c;我用的是虚拟机创建的ubuntu20.4的系统&a…

JS+H5美观的带搜索的博客文章列表(可搜索多个参数)

实现 美观的界面&#xff08;电脑、手机端界面正常使用&#xff09;多参数搜索&#xff08;文章标题&#xff0c;文章简介&#xff0c;文章发布时间等&#xff09;文章链接跳转 效果图 手机端 电脑端 搜索实现 搜索功能实现解释 定义文章数据: 文章数据保存在一个 JavaScri…

评价指标--深度学习

目录 1分类任务1.1 二分类1.1.1 含义介绍1.1.2 指标 1.2多分类 2图像分割2.1 常用指标2.2 具体含义2.3 代码实现 1分类任务 1.1 二分类 混淆矩阵 1.1.1 含义介绍 TP&#xff1a;预测为真所以是Positive&#xff0c;预测结果和真实结果一致所以为TrueTN&#xff1a;预测为假…

【Python 逆向滑块】(实战六)逆向滑块,并实现用Python+Node.js 生成滑块、识别滑块、验证滑块、发送短信

逆向日期&#xff1a;2024.08.04 使用工具&#xff1a;Python&#xff0c;Node.js 本章知识&#xff1a;逆向【NECaptchaValidate】参数并成功发送短信 文章难度&#xff1a;中等&#xff08;没耐心的请离开&#xff09; 文章全程已做去敏处理&#xff01;&#xff01;&#xf…

【SpringBoot】 定时任务之任务执行和调度及使用指南

【SpringBoot】 定时任务之任务执行和调度及使用指南 Spring框架分别通过TaskExecutor和TaskScheduler接口为任务的异步执行和调度提供了抽象。Spring还提供了支持应用程序服务器环境中的线程池或CommonJ委托的那些接口的实现。最终&#xff0c;在公共接口后面使用这些实现&…

POE服务机器人-快速开始

快速开始 POE与服务机器人部署服务机器人与poe集成迭代你的机器人其他 POE与服务机器人 在本快速入门指南中&#xff0c;我们将使用 Python 构建一个机器人服务器&#xff0c;然后将其与 Poe 集成。一旦您创建了由您的服务器驱动的 Poe 机器人&#xff0c;任何 Poe 用户都可以…

解密XXE漏洞:原理剖析、复现与代码审计实战

在网络安全领域&#xff0c;XML外部实体&#xff08;XXE&#xff09;漏洞因其隐蔽性和危害性而备受关注。随着企业对XML技术的广泛应用&#xff0c;XXE漏洞也逐渐成为攻击者们利用的重点目标。一个看似无害的XML文件&#xff0c;可能成为攻击者入侵系统的利器。因此&#xff0c…

R语言统计分析——描述性统计

参考资料&#xff1a;R语言实战【第2版】 1、整体统计 对于R语言基础安装&#xff0c;可以使用summary()函数来获取描述性统计量。summary()函数提供了最小值、最大值、四分位数、中位数和算术平均数&#xff0c;以及因子向量和逻辑向量的频数统计。 myvars<-c("mpg&…