java——jdbc编程

news2025/1/10 3:21:16

文章目录

    • JDBC的概念
    • JDBC的常用API
    • JDBC示例代码
    • PreparedStatement
    • CallableStatement

JDBC(Java Database Connectivity)是Java的一种数据库访问标准,它提供了一套API,使得我们可以通过Java程序来访问和操作各种关系型数据库。

在这里插入图片描述

下面我们详细介绍JDBC编程,包括JDBC的概念、JDBC的常用API以及示例代码。

JDBC的概念

JDBC是Java的一种数据库访问标准,它提供了一套API,使用这些API可以让Java程序连接各种关系型数据库,并且进行数据的增、删、改、查等操作。

JDBC的架构分为两部分:JDBC API和JDBC Driver。JDBC API定义了Java程序与数据库之间的接口规范;JDBC Driver则负责将Java程序中的JDBC API调用转换成特定数据库的协议,实现与特定数据库的通信。

在JDBC编程中,开发者需要关注以下几个核心概念:

  • Connection(连接对象):表示与数据库的连接。
  • Statement(语句对象):表示执行SQL语句的对象。
  • ResultSet(结果集对象):表示查询结果集的对象。
  • PreparedStatement(预编译语句对象):表示一个预编译的SQL语句对象,可以有效地防止SQL注入攻击。
  • CallableStatement(存储过程对象):表示调用存储过程的对象。

JDBC的常用API

  1. 加载驱动程序

在使用JDBC之前,需要先加载相应的数据库驱动程序。可以通过Class.forName()方法实现。

Class.forName("com.mysql.jdbc.Driver");
  1. 建立连接

使用DriverManager.getConnection()方法建立与数据库的连接。

String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
  1. 创建Statement对象

通过Connection对象创建Statement对象。

Statement stmt = conn.createStatement();
  1. 执行SQL语句

通过Statement对象执行SQL语句。

String sql = "SELECT * FROM users";
ResultSet rs = stmt.executeQuery(sql); // 查询操作
  1. 处理查询结果

对于查询操作,可以通过ResultSet对象获取查询结果集中的数据。

while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");
    int age = rs.getInt("age");
    System.out.println("id=" + id + ", name=" + name + ", age=" + age);
}
  1. 关闭资源

在使用完JDBC资源后,需要及时关闭它们,以释放内存和资源。

if (rs != null) {
    rs.close();
}
if (stmt != null) {
    stmt.close();
}
if (conn != null) {
    conn.close();
}

JDBC示例代码

下面是一个使用JDBC进行简单查询的示例代码。

import java.sql.*;

public class JdbcDemo {
    public static void main(String[] args) {
        try {
            // 加载MySQL驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            // 建立与MySQL的连接
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "123456";
            Connection conn = DriverManager.getConnection(url, user, password);
            // 创建Statement对象
            Statement stmt = conn.createStatement();
            // 执行查询操作
            String sql = "SELECT * FROM users WHERE age > 18";
            ResultSet rs = stmt.executeQuery(sql);
            // 处理查询结果
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("id=" + id + ", name=" + name + ", age=" + age);
            }
            // 关闭资源
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException
         e) {
            e.printStackTrace();
        }
    }
}

上面的代码使用了JDBC连接到MySQL数据库,并执行了一个查询操作,将年龄大于18岁的用户信息打印出来。在代码中使用了try-catch语句块捕获了异常,并在finally块中关闭了资源。

需要注意的是,在实际开发中,建议使用连接池来管理数据库连接,以提高性能和可靠性。常用的连接池有Apache Commons DBCP和C3P0等。

下面再来介绍一些JDBC的高级特性。

PreparedStatement

使用PreparedStatement可以有效地防止SQL注入攻击,并提升SQL语句执行效率。它是Statement的一个子类,用于预编译SQL语句,然后在执行时只需要传递参数即可。

下面是一个使用PreparedStatement执行插入操作的示例代码。

import java.sql.*;
import org.apache.commons.dbcp2.BasicDataSource;

public class JdbcDemo {
    public static void main(String[] args) {
        BasicDataSource dataSource = new BasicDataSource();
        // 设置数据库连接信息
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        try {
            // 从连接池中获取连接
            Connection conn = dataSource.getConnection();
            // 创建PreparedStatement对象
            String sql = "INSERT INTO users(name, age) VALUES (?, ?)";
            PreparedStatement stmt = conn.prepareStatement(sql);
            // 设置参数值
            stmt.setString(1, "Tom");
            stmt.setInt(2, 25);
            // 执行插入操作
            int count = stmt.executeUpdate();
            System.out.println(count + " rows affected.");
            // 关闭资源
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在上面的代码中,使用了PreparedStatement的setXXX()方法设置参数值,然后通过executeUpdate()方法执行插入操作。

CallableStatement

使用CallableStatement可以调用存储过程,它是PreparedStatement的另一个子类。

下面是一个使用CallableStatement调用存储过程的示例代码。

import java.sql.*;
import org.apache.commons.dbcp2.BasicDataSource;

public class JdbcDemo {
    public static void main(String[] args) {
        BasicDataSource dataSource = new BasicDataSource();
        // 设置数据库连接信息
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        try {
            // 从连接池中获取连接
            Connection conn = dataSource.getConnection();
            // 创建CallableStatement对象
            String sql = "{CALL get_user(?, ?)}";
            CallableStatement stmt = conn.prepareCall(sql);
            // 设置参数值
            stmt.setInt(1, 1);
            // 注册输出参数类型
            stmt.registerOutParameter(2, Types.VARCHAR);
            // 执行存储过程
            stmt.execute();
            // 获取输出参数值
            String name = stmt.getString(2);
            System.out.println("User name: " + name);
            // 关闭资源
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在上面的代码中,使用了CallableStatement的registerOutParameter()方法注册输出参数类型,并使用getString()方法获取输出参数值。

总结一下,JDBC是Java的一种数据库访问标准,它提供了一套API,使用这些API可以让Java程序连接各种关系型数据库,并且进行数据的增、删、改、查等操作。JDBC的核心概念包括Connection、Statement、ResultSet、PreparedStatement和CallableStatement等。在实际开发中,建议使用连接池来管理数据库连接,常用的连接池有Apache Commons DBCP和C3P0等。

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

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

相关文章

从零开始手搓一个STM32与机智云的小项目——GPIO模拟时序控制外设2

文章目录 前言模块简介硬件介绍硬件连接通信时序DHT11的数据帧格式信号时序1. 起始信号2.应答信号(响应信号)3.接收数据0与14.获取数据5结束信号 输入输出切换实际效果 总结 前言 在上一篇中介绍了,使用GPIO模拟WS2812B的控制时序来实现对RGB灯的控制,本…

【开源与项目实战:开源实战】84 | 开源实战四(上):剖析Spring框架中蕴含的经典设计思想或原则

在 Java 世界里,Spring 框架已经几乎成为项目开发的必备框架。作为如此优秀和受欢迎的开源项目,它是我们源码阅读的首选材料之一,不管是设计思想,还是代码实现,都有很多值得我们学习的地方。接下来,我们就详…

Nginx服务的主配置文件 nginx.conf

目录 前言 一、Nginx.con位置 二、Nginx.com相关内容 三、Nginx.conf中配置块和指令 1、I/O时间配置 2、HTTP 配置 日志格式设定 总结 前言 Nginx 的主配置文件是 nginx.conf,它通常位于 Nginx 的安装目录下的 conf 文件夹中。主配置文件 nginx.conf 是 Ngin…

Rust语言从入门到入坑——(6)Rust组织管理

文章目录 0 引入1、组织概念1. 1、箱1. 2、包1. 3、模块 2、组织中权限2.1 权限2.2 模块引用2.2 Use 关键词 3、总结 0 引入 任何一门编程语言如果不能组织代码都是难以深入的,几乎没有一个软件产品是由一个源文件编译而成的。本教程到目前为止所有的程序都是在一个…

java——内部类和异常处理

文章目录 内部类成员内部类局部内部类匿名内部类静态内部类 异常处理异常捕获与处理多重异常捕获和处理抛出异常 内部类 Java内部类(Inner Class)是嵌套在其他类中的类,它可以访问外部类的成员变量和方法,同时也可以被外部类访问…

模拟电路系列文章-ADC驱动电路(下)

目录 概要 整体架构流程 技术名词解释 技术细节 1.低阻输出,以减小误差 2.抗混叠 3.电源级保护 小结 概要 提示:这里可以添加技术概要 一个模拟电压信号,在进入ADC 的输入端之前,一般都需要增加一级驱动电路(Driver]。但是&#…

C语言基础:指针的使用

本文结合工作经验,研究C语言中指针的用法。 文章目录 1 指针的概念2 用法与使用场景2.1 函数的指针参数2.1.1 基本概念2.1.2 使用场景1-函数返回多个值2.1.3 使用场景2-减少函数参数 2.2 void*指针2.2.1 基本概念2.2.2 使用场景 2.3 空指针2.4 const指针2.4.1 基本…

三分钟学习一个python小知识5-----------我的对python中pandas的理解, 我列举了关于pandas常用的4个例子来深入理解pandas

这里写目录标题 1、Pandas是什么2、Pandas的常用功能:2.1. 读取和写入数据2.2. 数据清洗和转换2.3. 数据分析和计算2.4. 数据可视化总结 1、Pandas是什么 Pandas是Python中一个非常流行的数据处理和分析库,可以使用它对数据进行读取、清洗、转换、分析和…

【动态规划算法练习】day4

文章目录 一、213. 打家劫舍 II1.题目简介2.解题思路3.代码4.运行结果 二、740. 删除并获得点数1.题目简介2.解题思路3.代码4.运行结果 三、剑指 Offer II 091. 粉刷房子1.题目简介2.解题思路3.代码4.运行结果 总结 一、213. 打家劫舍 II 1.题目简介 213. 打家劫舍 II 你是一…

数字IC工程师的护城河是什么?

每个人都希望能够增加⾃⼰的核心竞争⼒,然后延展职业⽣涯。 可能IC研发工程师基本上都会有个40岁危机? 时代背景是最⼤的变数,它改变了⼈才供需和技术⾛向,⽐如做处理器 core曾经是屠⻰术,⽽现在是⻩⾦时代 处理器 cor…

堆和优先队列

文章目录 堆维护堆的性质建堆堆排序算法 优先队列详解cpp标准库 priority_queue 参考文献 堆 虽然“堆”这个词源自堆排序,但是目前它已经被引申为“垃圾存储机制”,例如在Java和Lisp语言中所定义的。强调一下,我们使用的堆不是垃圾收集存储…

设计模式之访问者模式笔记

设计模式之访问者模式笔记 说明Iterator(访问者)目录访问者模式示例类图抽象访问者角色类抽象元素角色类宠物猫类宠物狗类自己类其他人类家类测试类 说明 记录下学习设计模式-访问者模式的写法。JDK使用版本为1.8版本。 Iterator(访问者) 意图:表示一个作用于某对象结构中的…

平面设计师实习报告范文十篇

平面设计师实习报告范文1 经过了四年的系统性理论学习,使我对平面设计有了基本掌握,对于平面设计这个专业也有了一个系统的了解和掌握。我们即将离开大学校园,作为平面设计专业的毕业生,心中想得更多的是如何去做好一个平面设计师…

ETCD集群运维

ETCD集群运维 ETCD扩容节点ETCD参数调优时间参数快照磁盘网络 监控维护压缩历史版本消除碎片化存储配额快照备份 灾难恢复快照恢复 etcd gateway作用什么时候不应该使用网关启动方式 gRPC代理可扩展的watch API租约请求缓存启动gRPC代理 ETCD扩容节点 节点1:10.1.1…

管理类联考——逻辑——知识篇——论证推理——一、削弱——haimian

削弱 考点分析 削弱 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量223262132 主要问法 以下哪项如果为真,则能最严重地削弱(反驳)上述结论?以下哪项如果为真,则最能削弱(反驳&#xff09…

文心一言 VS 讯飞星火 VS chatgpt (46)-- 算法导论6.1 4题

四、假设一个最大堆的所有元素都不相同,那么该堆的最小元素应该位于哪里? 文心一言: 最大堆的最小元素位于堆的根结点。由于最大堆的性质,根结点是堆中所有元素的最大值,因此它也是堆中所有元素的最小值。 讯飞星火&#xff1a…

工具及方法 - 如何进行任务管理

如何做好你该做的事,这是你的一生之敌。 没有一步到位的工具和一劳永逸的方法,只有不断变化的需求和自己用起来顺手的感觉。 对于GTD工具,在手机上安装过番茄工作法的工具,在电脑的Excel上也做过任务列表,在免费的项目…

解决 kali换源之后签名无效

报错问题: apt-get update 报错 更新扩展知识:kali更新源 终端输入 vi /etc/apt/sources.list #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main …

计算机视觉中,有哪些基于控制点对的图像变换?

这里探讨的所有图像变换(二维)都是基于控制点对的,它们的主要区别在于: 1、它们是如何通过两张图像的控制点对产生变换场(变换矩阵或者变换公式中的参数)的 2、控制点之间的对应关系严格程度 这里说的变换…

远心镜头案例锦集

远心镜头(Telecentric lens) 定义:远心镜头是一类将其入瞳或出瞳放置于无穷远的光学系统。是为纠正传统镜头视差而设计,它可以在一定的物距范围内,使得到的图像放大倍率不会变化,即这种镜头拍出来的图像没…