IGNORANT

JDBC入门实验5-JDBC 数据类型与事务

实验内容

本实验将学习 Java 数据类型对应的 JDBC 类型以及 JDBC 事务的管理的知识。

实验知识点

JDBC 数据类型

我们知道 Java 语言中的数据类型和 SQL 语言的数据类型有一定的差别,我们编写的 Java 程序在与数据库交互的时候,往往需要利用 JDBC 驱动程序将 Java 数据类型转换为相应的 JDBC 类型。这种转换过程默认情况下采用映射的方式。比如一个 Java 整型转换为 SQL INTEGER 类型。

下表总结了 Java 数据类型转换为调用 PreparedStatement 中的 setXXX() 方法或 CallableStatement 对象或 ResultSet.updateXXX() 方法的默认 JDBC 数据类型。同时我们在上一节实验课中知道,ResultSet 对象为每个数据类型来检索列值对应了一个 getter方法,我们将它一并列在下面:

SQLJDBC/Javasetterupdatergetter
VARCHARjava.lang.StringsetStringupdateStringgetString
CHARjava.lang.StringsetStringupdateStringgetString
LONGVARCHARjava.lang.StringsetStringupdateStringgetString
BITbooleansetBooleanupdateBooleangetBoolean
NUMERICjava.math.BigDecimalsetBigDecimalupdateBigDecimalgetBigDecimal
TINYINTbytesetByteupdateBytegetByte
SMALLINTshortsetShortupdateShortgetShort
INTEGERintsetIntupdateIntgetInt
BIGINTlongsetLongupdateLonggetLong
REALfloatsetFloatupdateFloatgetFloat
FLOATfloatsetFloatupdateFloatgetFloat
DOUBLEdoublesetDoubleupdateDoublegetDouble
VARBINARYbyte[]setBytesupdateBytesgetBytes
BINARYbyte[]setBytesupdateBytesgetBytes
DATEjava.sql.DatesetDateupdateDategetDate
TIMEjava.sql.TimesetTimeupdateTimegetTime
TIMESTAMPjava.sql.TimestampsetTimestampupdateTimestampgetTimestamp
CLOBjava.sql.ClobsetClobupdateClobgetClob
BLOBjava.sql.BlobsetBlobupdateBlobgetBlob
ARRAYjava.sql.ArraysetARRAYupdateARRAYgetARRAY
REFjava.sql.RefsetRefupdateRefgetRef
STRUCTjava.sql.StructsetStructupdateStructgetStruct

java.sql.Date,以及java.sql.Timejava.sql.Timestamp类映射分别到SQL DATESQL TIMESQL TIMESTAMP数据类型。

JDBC 事务

我们在编写 java 程序的时候,在默认情况下,JDBC 连接是在自动提交模式下,即每个 SQL 语句都是在其完成时提交到数据库。但有时候我们为了提高程序运行的性能或者保持业务流程的完整性,以及使用了分布式事务管理方式,这个时候我们可能想关闭自动提交而自己管理和控制自己的事务。   

让多条SQL在一个事务中执行,并且保证这些语句是在同一时间共同执行的时候,我们就应该为这多条语句定义一个事务。一个事务是把单个 SQL 语句或一组 SQL 语句作为一个逻辑单元,并且如果事务中任何语句失败,则整个事务失败。

如果我们要启动一个事务,而不是让 JDBC 驱动程序默认使用 auto-commit 模式支持。这个时候我们就要使用 Connection 对象的 setAutoCommit() 方法。我们传递一个布尔值 falsesetAutoCommit() 中,就可以关闭自动提交。反之我们传入一个 true 便将其重新打开。

例如:

Connection conn = null;
conn = DriverManager.getConnection(URL);
//关闭自动提交
conn.setAutoCommit(false);

我们关闭了自动提交后,如果我们要提交数据库更改怎么办呢?这时候就要用到我们的提交和回滚了。我们要提交更改,可以调用 commit() 方法:

conn.commit();

尤其不要忘记,在catch块内添加回滚事务,表示操作出现异常,撤销事务:

conn.rollback();

实验环境

实验步骤

编写java.sql.Date, java.sql.Timejava.sql.Timestamp类映射的测试:

public class Test {
    public static void main(String args[]) {
        //获取日期和时间格式
        //为了和下面的日期作对比所以直接写明是java.util.Date类
        //我们也可以引入java.util.Date包,然后声明为Date类
        java.util.Date javaDate = new java.util.Date();
        long javaTime = javaDate.getTime();
        System.out.println("The Java Date is:" + javaDate.toString());

        //获取SQL的日期
        java.sql.Date sqlDate = new java.sql.Date(javaTime);
        System.out.println("The SQL DATE is: " + sqlDate.toString());

        //获取SQL的时间
        java.sql.Time sqlTime = new java.sql.Time(javaTime);
        System.out.println("The SQL DATE is: " + sqlTime.toString());

        //获取SQL的时间戳
        java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(javaTime);
        System.out.println("The SQL TIMESRAMP is:" + sqlTimestamp.toString());
    }
}

运行结果:

编写事务测试:

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);

            //执行查询
            System.out.println("Creating statement...");
            stmt = conn.createStatement();
            //插入
            String sql = "INSERT INTO Students " + "VALUES (3,20,'ROSE')";
            stmt.executeUpdate(sql);
            //查找
            sql = "SELECT id, name, age FROM Students";
            ResultSet rs = stmt.executeQuery(sql);

            //提交事务
            conn.commit();

            //得到和 处理结果集
            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();
            }

            //清理环境
            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!");
    }
}

运行结果:

实验总结

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

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