跳至主要內容

通过JDBC使用数据库

牧歌...大约 6 分钟

通过JDBC使用数据库

什么是JDBC?

全称: Java Data Base Connectivity

JDBC代表Java连接数据库。它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API

JDBC架构

image.png|650
image.png|650

常见JDBC组件

  • DriverManager:此类管理数据库驱动程序列表。 使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序进行匹配。在JDBC下识别某个子协议的第一个驱动程序将用于建立数据库连接。
  • Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。 但会使用DriverManager对象来管理这种类型的对象。 它还提取与使用Driver对象相关的信息。
  • Connection:此接口具有用于联系数据库的所有方法。 连接(Connection)对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。
  • Statement:使用从此接口创建的对象将SQL语句提交到数据库。 除了执行存储过程之外,一些派生接口还接受参数。
  • ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。 它作为一个迭代器并可移动ResultSet对象查询的数据。
  • SQLException:此类处理数据库应用程序中发生的任何错误。

使用的六个步骤

  • 导入包:需要包含包含数据库编程所需的JDBC类的包。 大多数情况下,使用import java.sql.*就足够了。
  • 注册JDBC驱动程序:需要初始化驱动程序,以便可以打开与数据库的通信通道。
  • 打开一个连接:需要使用DriverManager.getConnection()方法创建一个Connection对象,它表示与数据库的物理连接。
  • 执行查询:需要使用类型为Statement的对象来构建和提交SQL语句到数据库。
  • 从结果集中提取数据:需要使用相应的ResultSet.getXXX()方法从结果集中检索数据。
  • 清理环境:需要明确地关闭所有数据库资源,而不依赖于JVM的垃圾收集。
package com.xzh.jdbc;
 
import javax.xml.transform.Result;
import java.sql.*;
 
public class Test {
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet res = null;
        try {
            // 第一步:注册驱动(告诉Java程序,即将要连接那个品牌的数据库)
            Class.forName("com.mysql.jdbc.Driver");
 
            // 第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完后一定要关闭)
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "root";
            conn = DriverManager.getConnection(url, user, password);
 
            // 第三步:获取数据库操作对象(专门执行sql语句的对象)
            stmt = conn.createStatement();
 
            // 第四步:执行SQL语句(DQL DML ...)
            String sql = "select empno as a,ename from emp";
            res = stmt.executeQuery(sql);// 专门执行DQL语句
 
            // 专门执行DML语句的(insert delete update)
            // 返回值是“影响数据库中的记录条数”
            //int c =stmt.executeUpdate(sql);
 
            // 第五步:处理查询结果集(只有第四步执行select语句时,才会执行第五步)
            while (res.next()) {
                String empno = res.getString("a");
                String ename = res.getString("ename");
                System.out.println(empno + "," + ename);
            }
 
        } catch (SQLException e) {
            e.printStackTrace();
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }finally {
            // 第六步:释放资源(使用完资源后一定要关闭资源。Java和数据库属于进程间通信,开启后一定要关闭)
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

JDBC Statements, PreparedStatement和CallableStatement语句

当获得了与数据库的连接后,就可以与数据库进行交互了。 JDBC Statement,CallableStatement和PreparedStatement接口定义了可用于发送SQL或PL/SQL命令,并从数据库接收数据的方法和属性。

它们还定义了有助于在Java和SQL数据类型的数据类型差异转换的方法。

Statement对象

在使用Statement对象执行SQL语句之前,需要使用Connection对象的createStatement()方法创建一个Statement对象,如以下示例所示:

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
   // 关闭
   stmt.close();
}

在创建Statement对象后,可以使用它来执行一个SQL语句,它有三个执行方法可以执行。

  • boolean execute (String SQL):如果可以检索到ResultSet对象,则返回一个布尔值true; 否则返回false。使用此方法执行SQLDDL语句或需要使用真正的动态SQL,可使用于执行创建数据库,创建表的SQL语句等等。
  • int executeUpdate (String SQL):返回受SQL语句执行影响的行数。使用此方法执行预期会影响多行的SQL语句,例如:INSERT,UPDATE或DELETE语句。
  • ResultSet executeQuery(String SQL):返回一个ResultSet对象。 当您希望获得结果集时,请使用此方法,就像使用SELECT语句一样。

PreparedStatement对象

PreparedStatement接口扩展了Statement接口,它添加了比Statement对象更好一些优点的功能。

此语句可以动态地提供/接受参数。

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
    // 关闭
   pstmt.close();
}

JDBC中的所有参数都由 ? 符号作为占位符,这被称为参数标记。 在执行SQL语句之前,必须为每个参数(占位符)提供值。

setXXX()方法将值绑定到参数,其中XXX表示要绑定到输入参数的值的Java数据类型。 如果忘记提供绑定值,则将会抛出一个SQLException。

每个参数标记是它其顺序位置引用。第一个标记表示位置1,下一个位置2等等。 该方法与Java数组索引不同(它不从0开始)。

所有Statement对象与数据库交互的方法(a)execute(),(b)executeQuery()和(c)executeUpdate()也可以用于PreparedStatement对象。 但是改变的是这些方法被修改为可以使用输入参数的SQL语句。

CallableStatement对象

类似Connection对象创建Statement和PreparedStatement对象一样,它还可以使用同样的方式创建CallableStatement对象,该对象将用于执行对数据库存储过程的调用。

PreparedStatement对象只使用IN参数。CallableStatement对象可以使用上面三个参数类型。

参数描述
IN创建SQL语句时其参数值是未知的。 使用setXXX()方法将值绑定到IN参数。
OUT由SQL语句返回的参数值。可以使用getXXX()方法从OUT参数中检索值。
INOUT提供输入和输出值的参数。使用setXXX()方法绑定变量并使用getXXX()方法检索值。

以下代码片段显示了如何使用Connection.prepareCall()方法根据上述存储过程来实例化一个CallableStatement对象

CallableStatement cstmt = null;
try {
   String strSQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
   // 关闭
   cstmt.close();
}

String变量strSQL表示存储过程,带有两个参数占位符

使用CallableStatement对象就像使用PreparedStatement对象一样。 在执行语句之前,必须将值绑定到所有参数,否则将抛出一个SQLException异常。

如果有IN参数,只需遵循适用于PreparedStatement对象的相同规则和技术; 使用与绑定的Java数据类型相对应的setXXX()方法。

使用OUT和INOUT参数时,必须使用一个额外的CallableStatement对象方法registerOutParameter()。 registerOutParameter()方法将JDBC数据类型绑定到存储过程并返回预期数据类型。

当调用存储过程,可以使用适当的getXXX()方法从OUT参数中检索该值。 此方法将检索到的SQL类型的值转换为对应的Java数据类型。

文章参考

https://www.yiibai.com/jdbc/jdbc-introduction.html

上次编辑于:
贡献者: wangwenlei,Owen,wenleiwang
评论
  • 按正序
  • 按倒序
  • 按热度