java——jdbc编程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: java——jdbc编程

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等。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
22天前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
106 6
|
17天前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
123 0
|
2月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
366 0
|
4月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
280 83
|
22天前
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
126 0
|
3月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
423 3
|
2月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
374 100
|
2月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
160 16
|
2月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
194 1