JDBC API 4.2(二):編程步驟

step 1 : 引入mysql-jdbc驅動包

我們通過JDBC API 訪問數據庫時,需要用到第三方的驅動類,這些驅動類根據JDBC API 規範實現了訪問相應數據庫的一些列方法。這裏我們要訪問MySQL 數據庫,因此這裏引用的是 mysql 驅動。

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>

step 2 : 加載驅動

Class.forName()方法用於註冊驅動程序類,此方法用於動態加載驅動程序類。

public static void main(String[] args) {
        //加載驅動
        try {
            //驅動類 com.mysql.jdbc.Driver
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("數據庫驅動加載成功 !");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

當運行以上代碼,控制檯會打印出這麼一句話:

數據庫驅動加載成功 !
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

很明顯,驅動類【com.mysql.jdbc.Driver】已被棄用。 新的驅動程序類是`com.mysql.cj.jdbc.Driver’。 驅動程序通過SPI自動註冊,通常不需要手動加載驅動程序類。

注意:從JDBC 4.0開始,顯式註冊驅動程序是可選的。 我們只需要將相應的驅動jar放在類路徑中,然後JDBC驅動程序管理器就可以自動檢測並加載驅動程序。

step 3 : 建立與數據庫的連接

使用DriverManager.getConnection()方法來創建一個Connection對象,它代表一個數據庫的物理連接

 public static void main(String[] args) {
        //連接對象
        Connection conn = null;
        //SQL statement 對象
        Statement stmt = null;
        try {
            //01.加載驅動
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("數據庫驅動加載成功 !");
            //02.創建連接對象
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/lkf_db?characterEncoding=UTF-8",
                    "root", "root");
            System.out.println("連接成功,獲取連接對象: " + c);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

step 4 : 創建Statement

Connection接口的createStatement()方法用於創建語句對象(Statement )。 Statement 對象負責對數據庫執行查詢。

public static void main(String[] args) {
        //連接對象
        Connection conn = null;
        //SQL statement 對象
        Statement stmt = null;
        try {
            //01.加載驅動
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("數據庫驅動加載成功 !");
            //02.創建連接對象
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/lkf_db?characterEncoding=UTF-8",
                    "root", "root");
            System.out.println("連接成功,獲取連接對象: " + conn);
            //3.創建Statement
            stmt = conn.createStatement();
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

step 5 : 執行SQL語句

 public static void main(String[] args) {
        //連接對象
        Connection conn = null;
        //SQL statement 對象
        Statement stmt = null;
        try {
            //01.加載驅動
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("數據庫驅動加載成功 !");
            //02.創建連接對象
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT",
                    "root", "root");
            //03.創建Statement
            stmt = conn.createStatement();
            System.out.println("連接成功,獲取連接對象: " + conn);
            //04.執行SQL語句
            String sql = "CREATE TABLE `tb_user2` (\n" +
                    "  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n" +
                    "  `user_name` varchar(30) DEFAULT NULL COMMENT '用戶名',\n" +
                    "  `sex` int(1) DEFAULT '0' COMMENT '性別(0-男;1-女)',\n" +
                    "  `age` int(100) DEFAULT '0' COMMENT '年齡',\n" +
                    "  `birthday` datetime DEFAULT NULL COMMENT '生日',\n" +
                    "  `email` varchar(30) DEFAULT NULL COMMENT '郵箱',\n" +
                    "  `mobile` varchar(20) DEFAULT NULL COMMENT '手機號',\n" +
                    "  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間',\n" +
                    "  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',\n" +
                    "  `status_flag` int(11) DEFAULT '0' COMMENT '狀態(0-正常;1-停用)',\n" +
                    "  PRIMARY KEY (`id`)\n" +
                    ") ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8\n";
            int count = stmt.executeUpdate(sql);
            System.out.println("返回結果count:" + count);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

如果遇到以下錯誤提示:

java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

是因爲新版本的數據庫驅動需要指定UTC時區,將url地址後加上時區即可解決,“jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT”

step 6 : 關閉連接

Connection接口的close()方法用於關閉連接,ResultSet 和 Statement 對象將會自動關閉。

public static void main(String[] args) {
        //連接對象
        Connection conn = null;
        //SQL statement 對象
        Statement stmt = null;
        try {
            //01.加載驅動
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("數據庫驅動加載成功 !");
            //02.創建連接對象
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT",
                    "root", "root");
            //03.創建Statement
            stmt = conn.createStatement();
            System.out.println("連接成功,獲取連接對象: " + conn);
            //04.執行SQL語句
            String sql = "CREATE TABLE `tb_user2` (\n" +
                    "  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n" +
                    "  `user_name` varchar(30) DEFAULT NULL COMMENT '用戶名',\n" +
                    "  `sex` int(1) DEFAULT '0' COMMENT '性別(0-男;1-女)',\n" +
                    "  `age` int(100) DEFAULT '0' COMMENT '年齡',\n" +
                    "  `birthday` datetime DEFAULT NULL COMMENT '生日',\n" +
                    "  `email` varchar(30) DEFAULT NULL COMMENT '郵箱',\n" +
                    "  `mobile` varchar(20) DEFAULT NULL COMMENT '手機號',\n" +
                    "  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間',\n" +
                    "  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',\n" +
                    "  `status_flag` int(11) DEFAULT '0' COMMENT '狀態(0-正常;1-停用)',\n" +
                    "  PRIMARY KEY (`id`)\n" +
                    ") ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8\n";
            int count = stmt.executeUpdate(sql);
            System.out.println("返回結果count:" + count);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            //05、關閉連接對象
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

注意:從Java 7開始,JDBC能夠使用try-with-resources語句來自動關閉Connection,ResultSet和Statement類型的資源。

try-with-resource

JDK1.7開始,java引入了 try-with-resources,將 try-catch-finally 簡化爲 try-catch,在編譯時會自動轉化爲 try-catch-finally 語句。它要求在 try-with-resources 聲明中定義的變量必須實現 AutoCloseable 接口,這樣系統可以自動調用它們的close方法,從而替代了finally中關閉資源的功能。

public static void main( String[] args ) {
        try (
                //01-創建連接
                Connection conn = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT",
                        "root", "root");
                //02-創建 statement 對象
                Statement stmt = conn.createStatement();
        ) {
            //03-執行SQL語句
            String sql = "CREATE TABLE `tb_user2` (\n" +
                    "  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,\n" +
                    "  `user_name` VARCHAR(30) DEFAULT NULL COMMENT '用戶名',\n" +
                    "  `sex` INT(1) DEFAULT '0' COMMENT '性別(0-男;1-女)',\n" +
                    "  `age` INT(100) DEFAULT '0' COMMENT '年齡',\n" +
                    "  `birthday` DATETIME DEFAULT NULL COMMENT '生日',\n" +
                    "  `email` VARCHAR(30) DEFAULT NULL COMMENT '郵箱',\n" +
                    "  `mobile` VARCHAR(20) DEFAULT NULL COMMENT '手機號',\n" +
                    "  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間',\n" +
                    "  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',\n" +
                    "  `status_flag` INT(11) DEFAULT '0' COMMENT '狀態(0-正常;1-停用)',\n" +
                    "  PRIMARY KEY (`id`)\n" +
                    ") ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8\n";
            int count = stmt.executeUpdate(sql);
            System.out.println("返回結果count:" + count);
        } catch (SQLException e) {
            printSQLException(e);
        }
    }

    public static void printSQLException( SQLException ex ) {
        for (Throwable e : ex) {
            if (e instanceof SQLException) {
                e.printStackTrace(System.err);
                System.err.println("SQLState: " + ((SQLException) e).getSQLState());
                System.err.println("Error Code: " + ((SQLException) e).getErrorCode());
                System.err.println("Message: " + e.getMessage());
                Throwable t = ex.getCause();
                while (t != null) {
                    System.out.println("Cause: " + t);
                    t = t.getCause();
                }
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章