1. 程式人生 > >棟哥帶你學Java之JDBC

棟哥帶你學Java之JDBC

JDBC
什麼是JDBC?
JDBC(Java Data Base Connectivity,java資料庫連線)是一種用於執行SQL語句
的JavaAPI,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成.JDBC提供了一種基準,可以構建更高階的工具和介面,使資料庫開發人員能夠編寫數
據庫應用程式.
JDBC的四個核心類:
DriverManager:建立連線
Connection:連線類
Statement:執行SQL語句
RestultSet:執行SQL語句後的結果集
JDBC連線資料庫的步驟?
1.先註冊驅動
2.獲取連線
3.獲取SQL語句的執行物件
4.
執行SQL語句,並接收返回集 5.對返回集進行處理 6.關閉資源

這裡寫圖片描述

準備工作:先建立一個myjdbc的資料庫,並且建立一張users表,並新增幾條資料.
public class Demo01 {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        // 註冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        // 獲取連線
        // url是 訪問資料庫的連結地址
        String url = "jdbc:mysql://localhost:3306/myjdbc"
; // 獲取連線方式一 Connection connection = DriverManager.getConnection(url, "root", "123456"); // 獲取連線的方式二 // Properties info = new Properties(); // // 新增使用者名稱 密碼 // info.setProperty("user", "root"); // info.setProperty("password", "123456"); // Connection connection = DriverManager.getConnection(url, info);
// 獲取連線方式三 // 攜帶引數 訪問連線 String url2 = "jdbc:mysql://localhost:3306/myjdbc?user=root&password=123456"; Connection connection = DriverManager.getConnection(url2); // 獲取執行SQL語句的物件 Statement Statement statement = connection.createStatement(); // 執行SQL語句 返回結果集 // 結果集中新增 的索引 要和 查詢語句中的欄位對應 String sql = "select * from users"; ResultSet resultSet = statement.executeQuery(sql); // 處理結果集 // 迴圈遍歷結果集 輸出結果 // 有記錄 next()方法 返回true 反之 while (resultSet.next()) { // 列印資料 // 注意:查詢資料庫時 索引從1開始 System.out.println(resultSet.getObject(1)); System.out.println(resultSet.getObject(2)); System.out.println(resultSet.getObject(3)); System.out.println(resultSet.getObject(4)); System.out.println(resultSet.getObject(5)); } // 關閉資源 resultSet.close(); statement.close(); connection.close(); } } 解析:註冊驅動的話,要寫全限定類名,不然系統就不知道是找什麼包下的Driver類.url 是訪問資料庫的連線地址,mysql是你自己使用的資料庫,3306是資料庫的埠號,如果你 自己修改過埠號的就填寫你自己改過後的,myjdbc就是要查詢的資料庫名.獲取連線總 共有三種方式,一般是推薦使用第一種,第二種的話要使用集合,第三種的寫法不適合密碼 符號比較多的,比如密碼裡有等號之類的,這樣使用第三者寫法就比較麻煩.resultSet就 是根據SQL語句查詢出來的結果集,resultSet.next()是判斷是否還有記錄,這涉及到 指標,不呼叫next方法前指標是指向欄位那一行的.resultSet.getObject(1),裡面 的數字是欄位的順序,按照資料表中1就是id那個欄位.使用完後記得關閉資源.
增刪改查程式碼示例:
public class DemoCRUD {
    // 註解 用來測試方法
    // 注意:要使用public修飾 無返回值方法
    @Test
    public void testInsert() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/myjdbc?user=root&password=123456";
        Connection connection = DriverManager.getConnection(url);
        Statement statement = connection.createStatement();
        String sql = "insert into users values(5,'哈哈','000','[email protected]','2004-05-05')";
        // row受影響的行數
        int row = statement.executeUpdate(sql);
        System.out.println(row);
        statement.close();
        connection.close();
    }

    @Test
    public void testUpdate() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/myjdbc?user=root&password=123456";
        Connection connection = DriverManager.getConnection(url);
        Statement statement = connection.createStatement();
        String sql = "update users set name = 'xixi' where id = 5";
        int executeUpdate = statement.executeUpdate(sql);
        System.out.println(executeUpdate);
        statement.close();
        connection.close();
    }

    @Test
    public void testDelete() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/myjdbc?user=root&password=123456";
        Connection connection = DriverManager.getConnection(url);
        Statement statement = connection.createStatement();
        String sql = "delete from users where id = 5";
        int executeUpdate = statement.executeUpdate(sql);
        System.out.println(executeUpdate);
        statement.close();
        connection.close();
    }

    @Test
    public void testSelect() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/myjdbc?user=root&password=123456";
        Connection connection = DriverManager.getConnection(url);
        Statement statement = connection.createStatement();
        // 查詢
        String sql = "select id,name,email from users";
        ResultSet resultSet = statement.executeQuery(sql);
        // 處理結果集
        while (resultSet.next()) {
            System.out.println(resultSet.getObject("id"));
            System.out.println(resultSet.getObject("name"));
            System.out.println(resultSet.getObject("email"));
        }

        statement.close();
        connection.close();
    }
}
解析:使用註解@Test就可以直接測試帶程式碼正確不正確,不需要再寫main函數了,方便測
試.statement.executeUpdate(sql);這句程式碼返回值是int型別的,而它的值就是
表示執行完SQL語句後受到影響的行數.resultSet.getObject("id");上面
getObject的引數型別是int型別的表示欄位的位置,而這個方法同樣也提供傳入
String型別的,直接填寫欄位的名字也是一樣的效果的,因為有時候不需要檢視全部的字
段.
注意:這種寫法不知道大家是否發現有很多重複的程式碼,而且每執行一個方法就重新註冊了
一次驅動,完全沒必要,下面提供大家一個更簡單的方法.
準備工作:在src下建立一個檔案,我起的名字叫dbinfo.properties.
檔案裡面的內容如下:
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myjdbc
user=root
password=123456
程式碼如下:
public class JDBCUtil {
    private static String driverClass;
    private static String url;
    private static String user;
    private static String password;
    // 使用靜態程式碼塊載入驅動 讀取配置檔案
    static {
        // 使用系統類來讀取配置檔案
        ResourceBundle rb = ResourceBundle.getBundle("dbinfo");
        // 獲取檔案中的資料
        driverClass = rb.getString("driverClass");
        url = rb.getString("url");
        user = rb.getString("user");
        password = rb.getString("password");
//      Properties properties = new Properties();
//      FileInputStream fis;
//      try {
//          fis = new FileInputStream("src/dbinfo.properties");
//          properties.load(fis);
//          // 讀檔案
//          driverClass = properties.getProperty("driverClass");
//          url = properties.getProperty("url");
//          user = properties.getProperty("user");
//          password = properties.getProperty("password");
//      } catch (FileNotFoundException e) {
//          e.printStackTrace();
//      } catch (IOException e) {
//          e.printStackTrace();
//      }
//      // 讓驅動類只加載一次
        try {
            Class.forName(driverClass);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    // 獲取資料庫連線的方法
    public static Connection getConnection() throws ClassNotFoundException, SQLException {      
        return DriverManager.getConnection(url,user,password);
    }
    // 關閉資料庫的方法 如果沒有結果集需要關閉 直接傳null(空值)就行
    public static void closeAll(ResultSet resultSet,Statement statement,Connection connection) {
        // 關閉資源前要非空判斷 防止空指標出現
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException("關閉失敗");
            }
            // 加快系統回收的速度
            resultSet = null;
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                throw new RuntimeException("關閉失敗");
            }
            // 加快系統回收的速度
            resultSet = null;
        }           
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException("關閉失敗");
            }
            // 加快系統回收的速度
            connection = null;
        }   
    }
}
解析:為什麼字尾名要用properities.因為Properties集合是所有集合中可以直接操
作流的集合,用這個字尾名錶示這是個配置檔案.讀取檔案裡的資訊除了用該集合外,系統
也提供了一個類ResourceBundle.該類裡提供了一個靜態的方getBundle();這個方法
裡直接寫配置檔案的名字就行了,字尾名都不用寫.把只需要執行一次的帶程式碼都寫在程式碼
塊裡就行了.

相關推薦

JavaJDBC

JDBC 什麼是JDBC? JDBC(Java Data Base Connectivity,java資料庫連線)是一種用於執行SQL語句 的JavaAPI,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成.JDBC提供了一種基準

Java執行緒和鎖

執行緒 在說執行緒之前我們瞭解下什麼是程序. 程序:一個正在執行的程式(獨立執行). 程序和執行緒之間的關係: 一個程序可以只有一個執行緒(單執行緒程式),一個執行緒中也可以有多個執行緒(多執行緒程式). 執行緒:一個執行緒,相當於cpu的執行路徑,一個獨

Java泛型

在說泛型之前先建三個類. 第一個、Person類 /* * 姓名 和 年齡 * 構造 set/get toString * 建立一個學生類(構造方法) 繼承人類 */ public class Person { private Stri

Java跟蹤行號流、裝飾者模式以及列印流

跟蹤行號流 跟蹤行號字元輸入流:LineNumberReader 這個流有什麼特點呢? 沒什麼特別的特點,就是可以獲取行號. public void fun() throws FileNotFound

Java抽獎小遊戲

使用者資訊類: public class User { static String username; // 註冊時存入的使用者名稱 static String password; //

Java執行緒中斷

執行緒中斷 (一)stop方法 在早期,執行緒中又一個stop方法,可以直接終止執行緒.但是現在已經不用了,而且api上也已經在方法下標明已過時.這時因為stop方法一旦呼叫,不管執行緒是什麼狀態的都直接會被終 止,假如正在執行執行緒,run方法中的程式

Java static的用法

一、封裝 在說static關鍵詞的用法之前我們先說說Java面向物件的三大特徵之一的封裝. 什麼是封裝? 講類中的屬性或方法對外界隱藏,然後開放公共的訪問方式. 那麼怎麼隱藏呢? 之前我們寫mai

Java集合與迭代器

Java中的集合 為什麼會有集合? 因為陣列有弊端,所有才有了集合. 陣列的特點是什麼? 首先,陣列中只能新增相同型別的元素(基本資料型別和引用資料型別都能儲存),而且陣列的長度一旦確定就不能該改變, 如果要新增超出陣列長度個數的元素,就只能再宣告一個新的

GorillajavaFile

檔案 首先是獲取檔案的三種方法 // File類構造方法1 根據絕對路徑或者相對路徑構造 File file = new File("src/dd.txt"); // File類構造方法2 根據 parent 路徑名字串和 child 路徑名字串建立一

Gorillajava深入

轉換流 轉換流呢是可以查指定編碼表進行讀寫的流。 OutputStreamWriter(字元流轉向位元組流的橋樑) InputStreamReader(位元組流轉向字元流的橋樑) 具體操作如下: // 轉換流寫個UTF-8格式的檔案

【凱子Framework】Activity介面顯示全解析

前幾天凱子哥寫的Framework層的解析文章《Activity啟動過程全解析》,反響還不錯,這說明“寫讓大家都能看懂的Framework解析文章”的思想是基本正確的。 我個人覺得,深入分析的文章必不可少,但是對於更多的Android開發者——即

【凱子Framework】Activity啟動過程全解析

It’s right time to learn Android’s Framework ! 前言 一個App是怎麼啟動起來的? App的程式入口到底是哪裡? Launcher到底是什麼神奇的東西? 聽說還有個AMS的東西,它是做什麼的?

新霸進入java的世界

新霸哥從近期大家的留言中注意到了大家對基礎知識比較重視,很多的朋友希望多講一些入門的知識,為了滿足廣大開發愛好者的需求,新霸哥決定從最基礎的做起,一點一點的幫助大家一起走進雲端計算的世界。下面新霸哥首先帶領大家入門,今天入門的第一站就是進入java的世界。   喜歡程式設計

墨香Launcher(二)-資料載入流

上一篇墨香帶你學Launcher之-概述,我已經介紹了Launcher的佈局以及相關的介面跳轉,今天我們繼續學習,按照計劃,我們開始學習Launcher啟動之資料載入,主要是圖示、Widget和資料夾的載入. 1.基礎知識 在介紹載入之前我先

初識Anaconda------瀟入坑python學習(一)

最近參加一個服務外包比賽,接觸到了Anaconda,之前都是用一些簡單的IDE比如IDLE,PyCharm。所以寫這個系列的目的就是為了記錄自己的學習過程,方便自己回頭查閱,也是為方便同樣是初學者的讀者們提供一種學習的思路。

墨香Launcher(三)-繫結螢幕、圖示、資料夾和Widget

上一章我們講了Launcher的資料載入,包括:預設配置應用、資料夾以及widget的載入,所有應用的載入以及所有Widget的載入,資料載入完成後開始分批進行繪製到桌面上,包含預設配置bind,所有應用bind,所有小部件bind。下面我就從這幾個方面進

python-[第一章-初識Python]

license div 高級 今天 做什麽 挖掘 運維 自然語言 什麽 Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。 Python由Guido van Rossum於1989年底發明,第一個公開發行版發行於1991年。 像Perl語言一樣, Py

老侯Tensorflow19篇

    學習一門新技術,一定要有技巧,找到學習的捷徑就能事半功倍。現如今人工智慧產業發展迅

玩轉 Java Java 集合--list

list List 介面 List介面是一個有序的 Collection,使用此介面能夠精確的控制每個元素插入的位置,能夠通過索引 (元素在List中位置,類似於陣列的下標)來訪問List中的元素

名師微信開發(Java版)

IT 視頻 ava 14. ade BE src pict idt ======================================================= 長期更新IT編程視頻教程,資料收集整理不易,需要一點費用 有意者加QQ:277