java——jdbc编程

2023年 8月 16日 53.5k 0

@[TOC]

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

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

    Class.forName("com.mysql.jdbc.Driver");
    
  • 建立连接
  • 使用DriverManager.getConnection()方法建立与数据库的连接。

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

    Statement stmt = conn.createStatement();
    
  • 执行SQL语句
  • 通过Statement对象执行SQL语句。

    String sql = "SELECT * FROM users";
    ResultSet rs = stmt.executeQuery(sql); // 查询操作
    
  • 处理查询结果
  • 对于查询操作,可以通过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);
    }
    
  • 关闭资源
  • 在使用完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等。

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论