最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用JDBC連接數(shù)據(jù)庫的詳細步驟

 更新時間:2022年01月04日 11:20:26   作者:九九舅舅酒酒  
本文詳細講解了Java使用JDBC連接數(shù)據(jù)庫的詳細步驟,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、JDBC是什么?

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

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

  • 制作到數(shù)據(jù)庫的連接。
  • 創(chuàng)建 SQL 或 MySQL 語句。
  • 執(zhí)行 SQL 或 MySQL 查詢數(shù)據(jù)庫。
  • 查看和修改所產(chǎn)生的記錄。

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

  1. Java 應(yīng)用程序
  2. Java Applets
  3. Java Servlets
  4. Java ServerPages (JSPs)
  5. Enterprise JavaBeans (EJBs)

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

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

二、使用步驟

1.注冊驅(qū)動

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

注冊驅(qū)動

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

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

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

關(guān)于反射的補充: Java中的靈魂-反射機制

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

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

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

上述一行代碼就可以通過反射這個動作調(diào)用類,實現(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(目標(biāo)端口)/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.處理查詢結(jié)果集

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);
				*/
 
				/*
				// 按下標(biāo)取出,程序不健壯
				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í)行查詢的方法返回值是操作結(jié)果集對象,即使ResultSet的實例化對象!

6.釋放資源

finally {
            // 6、釋放資源
            // 從小到大依次關(guān)閉
            //finally語句塊內(nèi)的語句一定會執(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)化:(比較兩種注冊驅(qū)動的方法)

 
 
 
import java.sql.*;
 
public class JDBCTest01 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;//先創(chuàng)建連接對象 和 操作對象 并且引用為空,是為了對象變量的生命周期不僅僅局限于try語句塊內(nèi),而是在整個main方法內(nèi),方便后續(xù)finally語句塊內(nèi)釋放資源
        try{
            // 1、注冊驅(qū)動
            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、處理查詢結(jié)果集
 
        } catch(SQLException e) {
            e.printStackTrace();
        } finally {
            // 6、釋放資源
            // 從小到大依次關(guān)閉
            //finally語句塊內(nèi)的語句一定會執(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)化:(比較兩種注冊驅(qū)動的方法)

package com.zdx.source.code.jdbc;
 
/*
	JDBC完成Delete
*/
import java.sql.*;
 
public class JDBCTest02 {
    public static void main(String[] args) {
        // 1、注冊驅(qū)動
        // 2、獲取連接
        // 3、獲取數(shù)據(jù)庫操作對象
        // 4、執(zhí)行sql語句
        // 5、獲取查詢結(jié)果集
        // 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)化:(最佳注冊驅(qū)動獲取連接)

package com.zdx.source.code.jdbc;
 
/*
	注冊驅(qū)動的另一種方式
*/
 
import java.sql.*;
 
public class JDBCTest03 {
    public static void main(String[] args) {
        try{
            // 注冊驅(qū)動
            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)化:(對操作結(jié)果集的處理)

package com.zdx.source.code.jdbc;
 
/*
	執(zhí)行DQL語句
*/
 
import java.sql.*;
import java.util.*;
 
public class JDBCTest05 {
    public static void main(String[] args) {
        // 1、注冊驅(qū)動
        // 2、建立連接
        // 3、獲取數(shù)據(jù)庫操作對象
        // 4、執(zhí)行sql語句
        // 5、獲取查詢結(jié)果集
        // 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);
				*/
 
				/*
				// 按下標(biāo)取出,程序不健壯
				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();
                }
            }
        }
    }
}

總結(jié):

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

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

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

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

看到這里可以移步去學(xué)習(xí)—————>工具類的封裝啦!

注:

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

public interface Statement extends Wrapper, AutoCloseable 

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

public interface PreparedStatement extends Statement

在實際開發(fā)過程中由于PreparedStatement能防止注入,且預(yù)先編譯SQL語句的特性使得程序健壯性提高,所以實際開發(fā)中99.9%使用PreparedStatement。這是后話,由于封裝工具類主要封裝的是注冊驅(qū)動,獲取連接和釋放資源,后續(xù)將專門寫一篇博客討論PreparedStatement

此外在實際開發(fā)中除了掌握上述六步還需要掌握事務(wù)提交回滾三部曲。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java判斷一個時間是否在當(dāng)前時間區(qū)間代碼示例

    Java判斷一個時間是否在當(dāng)前時間區(qū)間代碼示例

    這篇文章主要給大家介紹了關(guān)于使用Java判斷一個時間是否在當(dāng)前時間區(qū)間的相關(guān)資料,在日常開發(fā)中我們經(jīng)常會涉及到時間的大小比較或者是判斷某個時間是否在某個時間段內(nèi),需要的朋友可以參考下
    2023-07-07
  • Java?集合框架?Queue?和?Stack?體系

    Java?集合框架?Queue?和?Stack?體系

    這篇文章主要介紹了Java?集合框架Queue和Stack體系,Stack?繼承自Vector,并拓展了五個允許將容器視為棧結(jié)構(gòu)的操作,Queue接口定義了隊列的能力,它繼承自Collection,更多相關(guān)內(nèi)容需要得小伙伴可以參考一下
    2022-06-06
  • 帶著新人看java虛擬機01(推薦)

    帶著新人看java虛擬機01(推薦)

    這篇文章主要介紹了java虛擬機,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java Swing JCheckBox復(fù)選框的實現(xiàn)方法

    Java Swing JCheckBox復(fù)選框的實現(xiàn)方法

    這篇文章主要介紹了Java Swing JCheckBox復(fù)選框的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Mybatis-Plus條件構(gòu)造器的具體使用方法

    Mybatis-Plus條件構(gòu)造器的具體使用方法

    這篇文章主要介紹了Mybatis-Plus條件構(gòu)造器的具體使用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程

    Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程

    這篇文章主要介紹了Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • MyBatis逆向?程的生成過程

    MyBatis逆向?程的生成過程

    MyBatis官方為我們提供了一個逆向工程,通過這個逆向工程,只要建立好數(shù)據(jù)表,那么MyBatis就會根據(jù)這個表自動生成pojo類、dao接口、sql映射文件
    2023-02-02
  • Spring計劃任務(wù)用法實例詳解

    Spring計劃任務(wù)用法實例詳解

    這篇文章主要介紹了Spring計劃任務(wù)用法,結(jié)合實例形式詳細分析了spring計劃任務(wù)相關(guān)原理、配置、使用方法及操作注意事項,需要的朋友可以參考下
    2019-11-11
  • 使用SpringBoot整合Activiti6工作流的操作方法

    使用SpringBoot整合Activiti6工作流的操作方法

    這篇文章主要介紹了使用SpringBoot整合Activiti6工作流,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Java基于自定義類加載器實現(xiàn)熱部署過程解析

    Java基于自定義類加載器實現(xiàn)熱部署過程解析

    這篇文章主要介紹了Java基于自定義類加載器實現(xiàn)熱部署過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03

最新評論

珲春市| 交城县| 通渭县| 罗田县| 从江县| 正蓝旗| 鸡西市| 杭锦后旗| 西乌珠穆沁旗| 沾化县| 洪湖市| 义乌市| 慈利县| 绥棱县| 安西县| 拉孜县| 洪江市| 阿鲁科尔沁旗| 桃园县| 德安县| 淳化县| 文化| 渑池县| 新沂市| 民权县| 焉耆| 九龙坡区| 铁岭县| 阿瓦提县| 武平县| 淳化县| 益阳市| 和林格尔县| 英山县| 安达市| 东台市| 遂宁市| 延庆县| 页游| 湖口县| 郯城县|