JDBC編程一一jdbc原理和基礎編程

JDBC

WHAT IS JDBC

Java Database Connectivity:Java訪問數據庫的解決方案。
JDBC是Java應用程序訪問數據庫的里程碑式解決方案。Java研發者但願用相同的方式訪問不一樣的數據庫,以實現與具體數據庫無關的Java操做界面。
JDBC定義了一套標準接口,即訪問數據庫的通用API,不一樣的數據庫廠商根據各自數據庫的特色去實現這些接口。

JDBC接口及數據庫廠商實現

JDBC中定義了一些接口:
一、驅動管理:
DriverManager
二、鏈接接口
Connection
DatabasemetaData
三、語句對象接口
Statement
PreparedStatement
CallableStatement
四、結果集接口
ResultSet
ResultSetMetaData

JDBC工做原理

JDBC只定義接口,具體實現由各個數據庫廠商負責。
程序員使用時只須要調用接口,實際調用的是底層數據庫廠商的實現部分。

經過JDBC訪問數據庫的過程

JDBC訪問數據庫的工做過程:
加載驅動,創建鏈接
建立語句對象
執行SQL語句
處理結果集
關閉鏈接

Driver接口及驅動類加載

要使用JDBC接口,須要先將對應數據庫的實現部分(驅動)加載進來。
驅動類加載方式(Oracle):
Class.forName("oracle.jdbc.driver.OracleDriver");

這條語句的含義是:裝載驅動類,驅動類經過static塊實如今DriverManager中的「自動註冊」。java

Connection接口

Connection接口負責應用程序對數據庫的鏈接,在加載驅動以後,使用url、username、password三個參數,建立到具體數據庫的鏈接。
Class.forName("oracle.jdbc.OracleDriver")
//根據url鏈接參數,找到與之匹配的Driver對象,調用其方法獲取鏈接
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.26:1521:tarena",
"openlab","open123");

須要注意的是:Connection只是接口,真正的實現是由數據庫廠商提供的驅動包完成的。程序員

Statement接口

Statement接口用來處理髮送到數據庫的SQL語句對象,經過Connection對象建立。主要有三個經常使用方法:
Statement stmt=conn.createStatement();
//1.execute方法,若是執行的sql是查詢語句且有結果集則返回true,若是是非查詢語句或者沒有結果集,返回false
boolean flag = stmt.execute(sql);
//2.執行查詢語句,返回結果集
ResultSetrs = stmt.executeQuery(sql);
//3.執行DML語句,返回影響的記錄數
int flag = stmt.executeUpdate(sql);

ResultSet接口

執行查詢SQL語句後返回的結果集,由ResultSet接口接收。
經常使用處理方式:遍歷 / 判斷是否有結果(登陸)。
String sql = "select * from emp";
ResultSetrs = stmt.executeQuery(sql);
while (rs.next()) {
    System.out.println(rs.getInt("empno")+",「
       +rs.getString("ename") );
}

查詢的結果存放在ResultSet對象的一系列行中,指針的最初位置在行首,使用next()方法用來在行間移動,getXXX()方法用來取得字段的內容。sql

處理結果集ResultSet

ResultSet表明DQL查詢結果,是2維結果. 其內部維護了一個讀取數據的遊標,默認狀況在,遊標在第一行數據以前, 當調用next() 方法時候, 遊標會向下移動,並將返回結果集中是否包含數據, 若是包含數據就返回true. 結果集還提供了很好getXXX方法用於獲取結果集遊標指向當前行數據.數據庫

原理:oracle

處理結果集ResultSet原理

案例:工具

/**
 * 執行DQL 語句 
 */
public class Demo03 {
    public static void main(String[] args) 
        throws Exception{
        //註冊驅動
        String driver="oracle.jdbc.OracleDriver";;
        Class.forName(driver);
        //鏈接數據庫
        String url="jdbc:oracle:thin:@192.168.201.227:1521:orcl";
        String user="openlab";
        String pwd="open123";
        Connection conn=DriverManager.getConnection(
                url, user, pwd);
        //建立Statement
        Statement st=conn.createStatement();
        //執行SQL(dql)
        String sql="select id, name "
                + "from robin_demo ";
        ResultSet rs=st.executeQuery(sql);
        //處理結果 ...
        //rs結果集中包含一個遊標,遊標默認在結果集
        //的第一行以前
        //rs.next():移動結果集遊標到下一行
        //檢查是否有數據, 若是有返回true, 不然false
        while(rs.next()){
            //getXXX(列名): 返回結果集當前行中
            // 指定列名的數據.
            int id = rs.getInt("id");
            String name=rs.getString("name");
            //輸出查詢結果
            System.out.println(id+","+name);
        }
        //關閉鏈接
        conn.close();
    }
}

使用Properties 讀取配置文件

Properties 是Java中專門用於讀取配置文件的API.url

  1. 其底層就是文本文件IO
  2. Properties 自己 實現 Map接口, 內部是散列表
  3. Properties限定了key和Value都是String 類型.

Properties 經常使用API方法:spa

  • load(流) 讀取一個配置文件
  • String getProperty(key) 讀取一個屬性值

使用步驟:設計

  1. 建立Properties對象
  2. 利用load方法讀取配置文件
  3. 利用getProperty查詢屬性文件的內容

案例, 讀取配置文件:指針

在resource 文件夾中添加配置文件 db.properties:

# db.properties
jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.201.227:1521:orcl
jdbc.username=openlab
jdbc.password=open123

使用Properties讀取配置文件內容:

public class Demo05 {
    public static void main(String[] args)
        throws IOException{
        // Properties 就是爲了讀取
        // *.properties 文件而設計的API
        // 其底層就是文本文件IO
        // Properties 自己 實現 Map接口
        // 內部是散列表, 限定了key和Value都是
        // String 類型.

        //方法: load(流) 將文件就讀取爲散列表
        //String getProperty(key) 查詢value

        //使用步驟
        //1 建立 Properties 對象
        Properties cfg = new Properties();
        System.out.println(cfg);
        System.out.println(cfg.size());
        System.out.println(cfg.isEmpty());
        //2\. 利用load方法讀取文件
        InputStream in=
            Demo05.class.getClassLoader()
            .getResourceAsStream("db.properties");
        //執行之後,將文件內容讀取到散列表中了
        cfg.load(in); 
        System.out.println(cfg);
        System.out.println(cfg.size());

        //3\. 查找文件內容, 就是讀取文件內容
        String s=
            cfg.getProperty("jdbc.driver");
        System.out.println(s); 
    }
}
利用配置文件能夠將程序中的參數保存到配置文件中, 修改程序參數只須要修改配置文件便可.

管理數據庫鏈接

在軟件中數據庫鏈接使用很是頻繁, 若是每次都建立鏈接, 就會形成代碼的大量冗餘, 常規的作法是創建數據庫鏈接工具類, 封裝數據庫鏈接過程, 統一數據庫鏈接過程, 使用時候就能夠簡化代碼.

實現步驟:

  1. 建立數據庫鏈接參數文件 db.properties
  2. 建立DbUtils.java 封裝數據庫鏈接方法

    • 利用Properties讀取配置文件夾中的數據庫鏈接參數
    • 建立方法 getConnection 封裝數據庫鏈接過程
  3. 使用 getConnection 方法

建立配置文件 db.properties

# db.properties
jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.201.227:1521:orcl
jdbc.username=openlab
jdbc.password=open123

建立DbUtils.java

public class DbUtils {
    static String driver;
    static String url;
    static String username;
    static String password;

    //讀取文件中的數據庫鏈接參數
    static{
        //初始化靜態屬性
        //1\. 利用Properties 讀取配置文件
        //2\. 從配置文件中查找 相應參數值
        try{
            Properties cfg=new Properties();
            InputStream in=
                DbUtils.class.getClassLoader()
                .getResourceAsStream("db.properties");
            cfg.load(in);
            System.out.println(cfg); 
            //初始化 鏈接參數 
            driver=cfg.getProperty("jdbc.driver");
            url=cfg.getProperty("jdbc.url");
            username=cfg.getProperty("jdbc.username");
            password=cfg.getProperty("jdbc.password");
            in.close();
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 封裝建立數據庫鏈接的過程
     * 簡化數據庫鏈接
     */
    public static Connection getConnection(){
        try{
            Class.forName(driver);
            Connection conn=
                DriverManager.getConnection(
                url, username, password);
            return conn;
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    //DbUtils.java
    /*
     * 關閉數據庫的鏈接方法, 封裝複雜的關閉過程
     */
    public static void close(Connection conn){
        if(conn!=null){
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace(); 
            }
        }
    }
}

說明:

  1. driver url username password 是4個數據庫鏈接參數, 由於只須要一份,則定義爲靜態變量.
  2. 靜態代碼塊的目的是從配置文件中讀取4個數據庫鏈接參數的值.
  3. getConnection方法封裝了數據庫鏈接過程
  4. close方法封裝了數據庫鏈接關閉的過程

DbUtils 的使用:

public class Demo06 {
    public static void main(String[] args) {
        Connection conn=null;
        try{
            conn=DbUtils.getConnection();
            Statement st=conn.createStatement();
            String sql="select * from robin_demo";
            ResultSet rs=st.executeQuery(sql);
            while(rs.next()){
                int id=rs.getInt("id");
                String name=rs.getString("name");
                System.out.println(id+","+name);
            }
            rs.close();//釋放查詢結果
            st.close();//釋放語句對象
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            DbUtils.close(conn);
        }
    }
}
顯然: 使用DbUtils能夠簡化JDBC代碼的書寫.
這個代碼中在finally中關閉數據庫鏈接, 其好處是可靠關閉鏈接.

最後,若是你們對這些內容感興趣的話能夠持續關注我,天天都有更新喔~
固然,須要以往的內容也能夠找我閱讀哦,我這裏都整合起來了方便你們閱讀,詳情點擊這裏!!!

相關文章
相關標籤/搜索