溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java使用JDBC連接數(shù)據(jù)庫的步驟是什么

發(fā)布時間:2022-01-04 12:57:41 來源:億速云 閱讀:137 作者:柒染 欄目:開發(fā)技術

Java使用JDBC連接數(shù)據(jù)庫的步驟是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

    一、JDBC是什么?

    JDBC 指 Java 數(shù)據(jù)庫連接(Java Database Connectivity),是一種標準Java應用編程接口( JAVA API),JDBC就是一套sun公司定義的接口,JDBC本質上就是Sun公司制定的一套接口(interface)!每個數(shù)據(jù)庫廠商需要實現(xiàn)這套接口。我們只需要調用需要即可用來連接 Java 編程語言和廣泛的數(shù)據(jù)庫。

    JDBC API 庫包含下面提到的每個任務,都是與數(shù)據(jù)庫相關的常用用法。

    • 制作到數(shù)據(jù)庫的連接。

    • 創(chuàng)建 SQL 或 MySQL 語句。

    • 執(zhí)行 SQL 或 MySQL 查詢數(shù)據(jù)庫。

    • 查看和修改所產生的記錄。

    從根本上來說,JDBC 是一種規(guī)范,它提供了一套完整的接口,允許便攜式訪問到底層數(shù)據(jù)庫,因此可以用 Java 編寫不同類型的可執(zhí)行文件,例如:

    1. Java 應用程序

    2. Java Applets

    3. Java Servlets

    4. Java ServerPages (JSPs)

    5. Enterprise JavaBeans (EJBs)

    所有這些不同的可執(zhí)行文件就可以使用 JDBC 驅動程序來訪問數(shù)據(jù)庫,這樣可以方便的訪問數(shù)據(jù)。

    JDBC 具有 ODBC 一樣的性能,允許 Java 程序包含與數(shù)據(jù)庫無關的代碼。

    二、使用步驟

    1.注冊驅動

    數(shù)據(jù)庫廠商的Java程序員所寫的實現(xiàn)類 叫做驅動 Driver

    注冊驅動

    第一種注冊方法代碼如下:(不常用)

    public class 注冊驅動 {
        public static void main(String[] args) {
            try {
                DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
     
    }

    第二種方利用反射的特性,加載過程中注冊驅動的過程。

    關于反射的補充: Java中的靈魂-反射機制

    關于JDBC—MySQL中以類加載的方式注冊驅動(反射)詳解鏈接:

    JDBC—MySQL以類加載的方式注冊驅動(反射)

    class.forName(com.mysql.jdbc.Driver);

    上述一行代碼就可以通過反射這個動作調用類,實現(xiàn)Driver類的加載 但是需要使用try和catch語句塊環(huán)繞

    2.獲取連接

    要連接數(shù)據(jù)庫的url---- String url="jdbc:mysql://localhost:3306/test?"+ "useUnicode=true&characterEncoding=UTF8";//防止亂碼
    要連接數(shù)據(jù)庫的用戶名---- String user="xxxx";
    要連接數(shù)據(jù)庫的密碼---- String pass="xxxx";

    接下來我們分析下url:
    "jdbc(這是協(xié)議以jdbc開頭):mysql(這是子協(xié)議,數(shù)據(jù)庫管理系統(tǒng)稱)://localhost(數(shù)據(jù)庫來源地址):3306(目標端口)/test(要查詢的表的表名)?"
    "useUnicode=true&characterEncoding=UTF8";添加這個是為了防止亂碼,指定使用Unicode字符集 ,且使用UTF-8來編輯。

                /*
                    url包括哪幾部分:
                        協(xié)議
                        IP
                        Port
                        資源名
    
                    eg:http://180.101.49.11:80/index.html
                        http:// 通信協(xié)議
                        180.101.49.11 IP地址
                        80 端口號
                        index.html 資源名
                */
     // 2、獲取連接
    			/*
    				url包括哪幾部分:
    					協(xié)議
    					IP
    					Port
    					資源名
    				eg:http://180.101.49.11:80/index.html
    					http:// 通信協(xié)議
    					180.101.49.11 IP地址
    					80 端口號
    					index.html 資源名
    			*/
                // static Connection getConnection(String url, String user, String password)
                String url = "jdbc:mysql://127.0.0.1:3306/hello";
                String user = "root";
                System.out.println(" ");
                String password = "rota";
                conn = DriverManager.getConnection(url,user,password);
                System.out.println("數(shù)據(jù)庫連接對象 :     " + conn);	//數(shù)據(jù)庫連接對象com.mysql.jdbc.JDBC4Connection@1ae369b7

    3.獲取數(shù)據(jù)庫操作對象

                // 3、獲取數(shù)據(jù)庫操作對象
                // Statement 類中 createStatement() 創(chuàng)建一個 Statement 對象來將 SQL 語句發(fā)送到數(shù)據(jù)庫。
                stmt = conn.createStatement();
     
                // 4、執(zhí)行sql語句
                // int executeUpdate(String sql)
                // 專門執(zhí)行DML語句
                // 返回值是“影響數(shù)據(jù)庫中的記錄條數(shù)”
                int count = stmt.executeUpdate("update dept set dname = '銷售部',loc = '合肥' where deptno = 20;");
                System.out.println(count == 1 ? "保存成功":"保存失敗");

    4.執(zhí)行sql語句

                // 4、執(zhí)行sql語句
                // int executeUpdate(String sql)
                // 專門執(zhí)行DML語句
                // 返回值是“影響數(shù)據(jù)庫中的記錄條數(shù)”
                int count = stmt.executeUpdate("update dept set dname = '銷售部',loc = '合肥' where deptno = 20;");
                System.out.println(count == 1 ? "保存成功":"保存失敗");

    5.處理查詢結果集

    rs = stmt.executeQuery("select empno,ename,sal from emp");
     
                while(rs.next()){
    				/*
    				String empno = rs.getString(1);
    				String ename = rs.getString(2);
    				String sal = rs.getString(3);
    				System.out.println(empno + "," + ename + "," + sal);
    				*/
     
    				/*
    				// 按下標取出,程序不健壯
    				String empno = rs.getString("empno");
    				String ename = rs.getString("ename");
    				String sal = rs.getString("sal");
    				System.out.println(empno + "," + ename + "," + sal);
    				*/
     
    				/*
    				// 以指定的格式取出
    				int empno = rs.getInt(1);
    				String ename = rs.getString(2);
    				double sal = rs.getDouble(3);
    				System.out.println(empno + "," + ename + "," + (sal + 100));
    				*/
     
                    int empno = rs.getInt("empno");
                    String ename = rs.getString("ename");
                    double sal = rs.getDouble("sal");
                    System.out.println(empno + "," + ename + "," + (sal + 200));
                }

    其中執(zhí)行增刪改的方法返回值是int類型

    執(zhí)行查詢的方法返回值是操作結果集對象,即使ResultSet的實例化對象!

    6.釋放資源

    finally {
                // 6、釋放資源
                // 從小到大依次關閉
                //finally語句塊內的語句一定會執(zhí)行!
                if(stmt != null) {
                    try	{
                        stmt.close();
                    }
                    catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(conn != null) {
                    try	{
                        conn.close();
                    }
                    catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    上述六步連貫:

    第一次優(yōu)化:(比較兩種注冊驅動的方法)

     
     
     import java.sql.*;
     
    public class JDBCTest01 {
        public static void main(String[] args) {
            Connection conn = null;
            Statement stmt = null;//先創(chuàng)建連接對象 和 操作對象 并且引用為空,是為了對象變量的生命周期不僅僅局限于try語句塊內,而是在整個main方法內,方便后續(xù)finally語句塊內釋放資源
            try{
                // 1、注冊驅動
                Driver driver = new com.mysql.jdbc.Driver();	//多態(tài),父類型引用指向子類型對象
                DriverManager.registerDriver(driver);
     
                // 2、獲取連接
    			/*
    				url包括哪幾部分:
    					協(xié)議
    					IP
    					Port
    					資源名
    				eg:http://180.101.49.11:80/index.html
    					http:// 通信協(xié)議
    					180.101.49.11 IP地址
    					80 端口號
    					index.html 資源名
    			*/
                // static Connection getConnection(String url, String user, String password)
                String url = "jdbc:mysql://127.0.0.1:3306/hello";
                String user = "root";
                System.out.println(" ");
                String password = "rota";
                conn = DriverManager.getConnection(url,user,password);
                System.out.println("數(shù)據(jù)庫連接對象 :     " + conn);	//數(shù)據(jù)庫連接對象com.mysql.jdbc.JDBC4Connection@1ae369b7
     
                // 3、獲取數(shù)據(jù)庫操作對象
                // Statement 類中 createStatement() 創(chuàng)建一個 Statement 對象來將 SQL 語句發(fā)送到數(shù)據(jù)庫。
                stmt = conn.createStatement();
     
                // 4、執(zhí)行sql語句
                // int executeUpdate(String sql)
                // 專門執(zhí)行DML語句
                // 返回值是“影響數(shù)據(jù)庫中的記錄條數(shù)”
                int count = stmt.executeUpdate("update dept set dname = '銷售部',loc = '合肥' where deptno = 20;");
                System.out.println(count == 1 ? "保存成功":"保存失敗");
     
                // 5、處理查詢結果集
     
            } catch(SQLException e) {
                e.printStackTrace();
            } finally {
                // 6、釋放資源
                // 從小到大依次關閉
                //finally語句塊內的語句一定會執(zhí)行!
                if(stmt != null) {
                    try	{
                        stmt.close();
                    }
                    catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(conn != null) {
                    try	{
                        conn.close();
                    }
                    catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    第二次優(yōu)化:(比較兩種注冊驅動的方法)

    package com.zdx.source.code.jdbc;
     
    /*
    	JDBC完成Delete
    */
    import java.sql.*;
     
    public class JDBCTest02 {
        public static void main(String[] args) {
            // 1、注冊驅動
            // 2、獲取連接
            // 3、獲取數(shù)據(jù)庫操作對象
            // 4、執(zhí)行sql語句
            // 5、獲取查詢結果集
            // 6、釋放資源
     
            Connection conn = null;
            Statement stmt = null;
            try {
                Driver driver = new com.mysql.jdbc.Driver();
                DriverManager.registerDriver(driver);
     
                String url = "jdbc:mysql://127.0.0.1:3306/mydatabase";
                String user = "root";
                String password = "146";
                conn = DriverManager.getConnection(url,user,password);
     
                stmt = conn.createStatement();
     
                int count = stmt.executeUpdate("delete from dept where deptno = 50");
     
                System.out.println(count == 1? "刪除成功":"刪除失敗");
     
            } catch(SQLException e){
                e.printStackTrace();
            } finally {
                if(conn != null) {
                    try {
                        conn.close();
                    } catch(SQLException e){
                        e.printStackTrace();
                    }
                }
                if(stmt != null) {
                    try {
                        stmt.close();
                    } catch(SQLException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    第三次優(yōu)化:(最佳注冊驅動獲取連接)

    package com.zdx.source.code.jdbc;
     
    /*
    	注冊驅動的另一種方式
    */
     
    import java.sql.*;
     
    public class JDBCTest03 {
        public static void main(String[] args) {
            try{
                // 注冊驅動
                Class.forName("com.mysql.jdbc.Driver");
     
                // 獲取連接
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase","root","146");
                System.out.println(conn);
     
            } catch(SQLException e){
                e.printStackTrace();
            } catch(ClassNotFoundException e){
                e.printStackTrace();
            }
        }
    }

    第四次優(yōu)化:(使用資源綁定器)

    package com.zdx.source.code.jdbc;
     
    /*
    	使用資源綁定器
    */
     
    import java.sql.*;
    import java.util.*;
     
    public class JDBCTest04 {
        public static void main(String[] args) {
     
            ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
            String driver = bundle.getString("driver");
            String url = bundle.getString("url");
            String user = bundle.getString("user");
            String password = bundle.getString("password");
     
            Connection conn = null;
            Statement stmt = null;
            try {
                Class.forName(driver);
     
                conn = DriverManager.getConnection(url,user,password);
     
                stmt = conn.createStatement();
     
                int count = stmt.executeUpdate("insert into dept(deptno,dname,loc) values(50,'人事部','北京');");
     
                System.out.println(count == 1? "保存成功":"保存失敗");
     
            } catch(SQLException e){
                e.printStackTrace();
            } catch(ClassNotFoundException e) {
                e.printStackTrace();
            } finally {
                if(conn != null) {
                    try {
                        conn.close();
                    } catch(SQLException e){
                        e.printStackTrace();
                    }
                }
                if(stmt != null) {
                    try {
                        stmt.close();
                    } catch(SQLException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    第五次優(yōu)化:(對操作結果集的處理)

    package com.zdx.source.code.jdbc;
     
    /*
    	執(zhí)行DQL語句
    */
     
    import java.sql.*;
    import java.util.*;
     
    public class JDBCTest05 {
        public static void main(String[] args) {
            // 1、注冊驅動
            // 2、建立連接
            // 3、獲取數(shù)據(jù)庫操作對象
            // 4、執(zhí)行sql語句
            // 5、獲取查詢結果集
            // 6、釋放資源
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
     
            try{
                ResourceBundle rb = ResourceBundle.getBundle("jdbc");
                String driver = rb.getString("driver");
                String url = rb.getString("url");
                String user = rb.getString("user");
                String password = rb.getString("password");
     
                Class.forName(driver);
     
                conn = DriverManager.getConnection(url,user,password);
     
                stmt = conn.createStatement();
     
                rs = stmt.executeQuery("select empno,ename,sal from emp");
     
                while(rs.next()){
    				/*
    				String empno = rs.getString(1);
    				String ename = rs.getString(2);
    				String sal = rs.getString(3);
    				System.out.println(empno + "," + ename + "," + sal);
    				*/
     
    				/*
    				// 按下標取出,程序不健壯
    				String empno = rs.getString("empno");
    				String ename = rs.getString("ename");
    				String sal = rs.getString("sal");
    				System.out.println(empno + "," + ename + "," + sal);
    				*/
     
    				/*
    				// 以指定的格式取出
    				int empno = rs.getInt(1);
    				String ename = rs.getString(2);
    				double sal = rs.getDouble(3);
    				System.out.println(empno + "," + ename + "," + (sal + 100));
    				*/
     
                    int empno = rs.getInt("empno");
                    String ename = rs.getString("ename");
                    double sal = rs.getDouble("sal");
                    System.out.println(empno + "," + ename + "," + (sal + 200));
                }
     
            } catch(Exception e){
                e.printStackTrace();
            }finally{
                if(rs != null){
                    try{
                        rs.close();
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                }
                if(stmt != null){
                    try{
                        stmt.close();
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                }
                if(conn != null){
                    try{
                        conn.close();
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    總結:

    在上述五次優(yōu)化代碼的過程中,針對這六步

            // 1、注冊驅動
            // 2、獲取連接
            // 3、獲取數(shù)據(jù)庫操作對象
            // 4、執(zhí)行sql語句
            // 5、獲取查詢結果集
            // 6、釋放資源

    第一步的注冊驅動最終使用了反射,已達最優(yōu)

    第二步的獲取連接已達最優(yōu),已經有能力去完成JDBC連接數(shù)據(jù)庫的工具類的封裝了

    看到這里可以移步去學習—————>工具類的封裝啦!

    注:

    第三步的獲取數(shù)據(jù)庫操作對象中我們是使用Statement接口

    public interface Statement extends Wrapper, AutoCloseable

    還可以優(yōu)化成為PreparedStatement

    public interface PreparedStatement extends Statement

    在實際開發(fā)過程中由于PreparedStatement能防止注入,且預先編譯SQL語句的特性使得程序健壯性提高,所以實際開發(fā)中99.9%使用PreparedStatement。

    關于Java使用JDBC連接數(shù)據(jù)庫的步驟是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

    AI