IGNORANT

JDBC入门实验6-JDBC 处理

实验内容

本实验将学习 JDBC 异常处理、批量处理的相关知识。

实验知识点

JDBC 异常处理

我们写了这么多的代码了同学们对异常处理是不是已经很熟悉了呢?

异常处理,顾名思义可以处理在受控制的方式下的异常情况。当程序在运行的过程中并没有按照我们的预期情况执行,将会引发异常。当程序异常的时候,当前执行的程序就会立即停止,并且重定向到最近的适用的 catch 子句中,如果没有适用的 catch 子句存在,那么程序结束。

JDBC 的异常处理非常类似于Java Exception处理。JDBC 最常见的异常处理的是 java.sql.SQLException,所以今天我们就来学习 SQLException 方法。

方法描述
getErrorCode()获取此 SQLException 对象的特定于供应商的异常代码
getNextException()通过 setNextException(SQLException ex) 获取链接到此 SQLException 对象的异常
getSQLState()获取此 SQLException 对象的 SQLState。对于 JDBC 驱动程序的错误,没有有用的信息从该方法返回。对于一个数据库错误,则返回五位 XOPEN SQLSTATE 代码。这种方法可以返回 null
iterator()返回在链接的 SQLExceptions 上进行迭代的迭代器
setNextException(SQLException ex)将 SQLException 对象添加到链接的末尾

通过利用从Exception对象捕获异常的信息,适当地继续运行程序。示例这里就不给出了,同学们可以去参看以前的代码。

JDBC 批量处理

批处理允许将相关的SQL语句组合成一个批处理和一个调用数据库提交。还记得我们学习 JDBC 事务的知识吗?今天的课程实质上和事务是一致的。

当一次发送多个SQL语句到数据库,可以减少通信开销的数额,从而提高了性能。不过 JDBC 驱动程序不需要支持此功能。应该使用 DatabaseMetaData.supportsBatchUpdates() 方法来确定目标数据库支持批量更新处理。如果你的 JDBC 驱动程序支持此功能的方法返回 true

接下来我们来看看如何进行批处理操作:

实验环境

实验步骤

编写:

import java.sql.*;

public class JdbcTest {
    //JDBC 驱动器名称 和数据库地址
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    //数据库的名称为EXAMPLE
    static final String DB_URL = "jdbc:mysql://localhost/EXAMPLE";

    //数据库用户和密码
    static final String USER = "root";
    static final String PASS = "";

    public static void main(String args[]) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //注册JDBC驱动程序
            Class.forName(JDBC_DRIVER);

            //打开链接
            System.out.println("Connection to database...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            conn.setAutoCommit(false);

            //添加SQL
            System.out.println("Creating statement...");
            stmt = conn.createStatement();
            //插入
            String SQL = "INSERT INTO Students " + "VALUES (6,21,'Mike')";
            //将SQL语句添加到此批处理中
            stmt.addBatch(SQL);
            SQL = "INSERT INTO Students " + "VALUES (7,23,'Angle')";
            stmt.addBatch(SQL);
            SQL = "UPDATE Students SET name=\"Rose\" WHERE id =3";
            stmt.addBatch(SQL);
            //创建整数数组记录更新情况
            int []count=stmt.executeBatch();
            //提交事务
            conn.commit();

            //查找
            SQL = "SELECT id, name, age FROM Students";
            ResultSet rs = stmt.executeQuery(SQL);


            //得到和 处理结果集
            int id, age;
            String name;
            while (rs.next()) {
                //检索
                id = rs.getInt("id");
                age = rs.getInt("age");
                name = rs.getString("name");

                //显示
                System.out.print("ID: " + id);
                System.out.print(", Age: " + age);
                System.out.print(", Name: " + name);
                System.out.println();
            }

            System.out.println("Output the array count[]:");
            System.out.println(java.util.Arrays.toString(count));

            //清理环境
            rs.close();
            stmt.close();
            conn.close();
        } catch (SQLException se) {
            //JDBC 操作错误
            se.printStackTrace();
            //conn.rollback();
            try {
                if (conn != null)
                    conn.rollback();
            } catch (SQLException se2) {
                se2.printStackTrace();
            }
        } catch (Exception e) {
            //Calss.forName错误
            e.printStackTrace();
        } finally {
            //这一般是用来关闭资源的
            try {
                if (stmt != null)
                    stmt.close();
            } catch (SQLException se2) {

            } try {
                if (conn != null)
                    conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
        System.out.println("GoodBye!");
    }
}

运行结果:

使用 prepareStatement 对象进行批处理操作:

import java.sql.*;

public class JdbcTest_prepareStatement {
    //JDBC 驱动器名称 和数据库地址
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    //数据库的名称为EXAMPLE
    static final String DB_URL = "jdbc:mysql://localhost/EXAMPLE";

    //数据库用户和密码
    static final String USER = "root";
    static final String PASS = "";

    public static void main(String args[]) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            //注册JDBC驱动程序
            Class.forName(JDBC_DRIVER);

            //打开链接
            System.out.println("Connection to database...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            //添加SQL
            System.out.println("Creating statement...");
            //删除数据
            String SQL = "DELETE FROM Students WHERE id=?";
            //创建PrepateStatement对象
            pstmt = conn.prepareStatement(SQL);
            //关闭自动连接
            conn.setAutoCommit(false);

            //绑定参数
            pstmt.setInt(1, 5); //去除id为5的元组
            //添加到批处理
            pstmt.addBatch();

            //去除id为6,、7的元组
            pstmt.setInt(1, 6);
            pstmt.addBatch();
            pstmt.setInt(1, 7);
            pstmt.addBatch();
            //创建整数数组记录更新情况
            int []count = pstmt.executeBatch();
            //提交事务
            conn.commit();

            //查找
            SQL = "SELECT id, name, age FROM Students";
            ResultSet rs = pstmt.executeQuery(SQL);


            //得到和 处理结果集
            int id, age;
            String name;
            while (rs.next()) {
                //检索
                id = rs.getInt("id");
                age = rs.getInt("age");
                name = rs.getString("name");

                //显示
                System.out.print("ID: " + id);
                System.out.print(", Age: " + age);
                System.out.print(", Name: " + name);
                System.out.println();
            }

            System.out.println("Output the array count[]:");
            System.out.println(java.util.Arrays.toString(count));

            //清理环境
            rs.close();
            pstmt.close();
            conn.close();
        } catch (SQLException se) {
            //JDBC 操作错误
            se.printStackTrace();
            //conn.rollback();
            try {
                if (conn != null)
                    conn.rollback();
            } catch (SQLException se2) {
                se2.printStackTrace();
            }
        } catch (Exception e) {
            //Calss.forName错误
            e.printStackTrace();
        } finally {
            //这一般是用来关闭资源的
            try {
                if (pstmt != null)
                    pstmt.close();
            } catch (SQLException se2) {

            } try {
                if (conn != null)
                    conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
        System.out.println("GoodBye!");
    }
}

运行结果:

实验总结

感谢https://www.shiyanlou.com/courses/110

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »