第15篇-JAVA JDBC編程

2022-03-11 11:31 更新
  • 每篇一句 :對(duì)于勇敢者,嘗試是一條嶄新的生活之路
  • 初學(xué)心得: 但對(duì)于坎坷與泥濘,能以平常之心視之,就非常不容易
  • (筆者:JEEP/711)[JAVA筆記 | 時(shí)間:2017-05-08| JAVA JDBC編程 ]

1.JDBC概述

  • 通過(guò)使用JDBC API,Java程序可以非常方便地操作各種主流數(shù)據(jù)庫(kù),這是是Java語(yǔ)言的巨大魅力所在
    - 由于Java語(yǔ)言的跨平臺(tái)特性,所以使用JDBC API所編寫(xiě)的程序不僅可以實(shí)現(xiàn)跨數(shù)據(jù)庫(kù),還可以跨平臺(tái),具有非常優(yōu)秀的可移植性
    - 程序使用JDBC API以統(tǒng)一的方式來(lái)連接不同的數(shù)據(jù)庫(kù),然后通過(guò)Statement對(duì)象來(lái)執(zhí)行標(biāo)準(zhǔn)SQL語(yǔ)句,并可以獲得SQL語(yǔ)句訪問(wèn)數(shù)據(jù)庫(kù)的結(jié)果

2.JDBC驅(qū)動(dòng)程序類型

  • 1.JDBC驅(qū)動(dòng):稱為JDBC–ODBC橋,這種驅(qū)動(dòng)是最早實(shí)現(xiàn)的JDBC驅(qū)動(dòng)程序,主要目的是為了快速推廣JDBC。這種驅(qū)動(dòng)程序?qū)DBC API映射到ODBC API。JDBC-ODBC也需要驅(qū)動(dòng),這種驅(qū)動(dòng)由Sun公司提供實(shí)現(xiàn)
    - 2.JDBC驅(qū)動(dòng):直接將JDBC API映射成數(shù)據(jù)庫(kù)特定的客戶端API。這種驅(qū)動(dòng)程序包含特定數(shù)據(jù)庫(kù)的本地代碼,用于訪問(wèn)特定數(shù)據(jù)庫(kù)的客戶端
    - 3.JDBC驅(qū)動(dòng):支持三層結(jié)構(gòu)的JDBC訪問(wèn)方式。主要用于Applet階段,通過(guò)Applet訪問(wèn)數(shù)據(jù)庫(kù)
    - 4.JDBC驅(qū)動(dòng):是純Java的,直接與數(shù)據(jù)庫(kù)實(shí)例交互。這種驅(qū)動(dòng)是智能的,它知道數(shù)據(jù)庫(kù)使用的底層協(xié)議,這種驅(qū)動(dòng)是目前最流行的JDBC驅(qū)動(dòng)

3.安裝MySQL數(shù)據(jù)庫(kù)

  • (1)下載MySQL安裝文件
    - (2)開(kāi)始安裝MySQL后,在出現(xiàn)的對(duì)話框中單擊“Next”按鈕
    - (3)單擊對(duì)話框的“Next”按鈕,將出現(xiàn)選擇安裝組件和安裝路徑的對(duì)話框。
    - (4)單擊對(duì)話框中的“Next”按鈕,將可開(kāi)始安裝MySQL數(shù)據(jù)庫(kù)系統(tǒng),安裝成功后,系統(tǒng)還要求配置MySQL數(shù)據(jù)庫(kù)
    - (5)配置數(shù)據(jù)庫(kù)時(shí)注意選擇合適的字符集,并設(shè)置密碼

4.MySQL的常見(jiàn)命令


<br> - 查詢數(shù)據(jù)庫(kù):show databases;
<br> - 刪除數(shù)據(jù)庫(kù):drop database 數(shù)據(jù)庫(kù)名;
<br> - 進(jìn)入數(shù)據(jù)庫(kù):use 數(shù)據(jù)庫(kù)名
<br> - 顯示創(chuàng)建庫(kù)名的所有數(shù)據(jù):show tables;
<br> - 輸出表名:desc 表名
<br> SQL語(yǔ)句四大部分 
<br> - 數(shù)據(jù)定義語(yǔ)言(DDL):drop、create、alter
<br> - 數(shù)據(jù)操作語(yǔ)言(DML):insert、update、delete
<br> - 數(shù)據(jù)查詢語(yǔ)言(DQL):select、from、where、group by
<br> - 數(shù)據(jù)控制語(yǔ)言(DCL):grant、revoke、commit、rollback
<br> ```

5.JDBC常用接口和類

  • DriverManager
    - Connection
    - Statement
    - PreparedStatement
    - ResultSet

6.JDBC編程步驟

  • (1)加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)
    - (2)通過(guò)DriverManager獲取數(shù)據(jù)庫(kù)連接
    - (3)通過(guò)Connection對(duì)象創(chuàng)建Statement對(duì)象
    - (4)使用Statement執(zhí)行SQL語(yǔ)句。所有Statement都有如下三個(gè)方法來(lái)執(zhí)行SQL語(yǔ)句
    - (5)操作結(jié)果集。如果執(zhí)行的SQL語(yǔ)句是查詢語(yǔ)句,執(zhí)行結(jié)果將返回一個(gè)ResultSet對(duì)象,該對(duì)象里保存了SQL語(yǔ)句查詢的結(jié)果。程序可以通過(guò)操作該ResultSet對(duì)象來(lái)取出查詢結(jié)果

7.JDBC執(zhí)行SQL語(yǔ)句的方式

  • 使用executeUpdate執(zhí)行DDL和DML語(yǔ)句
    - 使用execute方法執(zhí)行SQL語(yǔ)句
    - 使用executeQuery方法執(zhí)行查詢語(yǔ)句

8.數(shù)據(jù)庫(kù)連接池

數(shù)據(jù)庫(kù)連接池的解決方案是:當(dāng)應(yīng)用程序啟動(dòng)時(shí),系統(tǒng)主動(dòng)建立足夠的數(shù)據(jù)庫(kù)連接,并將這些連接組成一個(gè)連接池
每次應(yīng)用程序請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),無(wú)需重新打開(kāi)連接,而是從池中取出已有的連接使用,使用完后,不再關(guān)閉數(shù)據(jù)庫(kù)連接,而是直接將該連接歸還給連接池。通過(guò)使用連接池,將大大提高程序運(yùn)行效率

數(shù)據(jù)庫(kù)連接池的常用參數(shù)有如下:
- 數(shù)據(jù)庫(kù)的初始連接數(shù)
- 連接池的最大連接數(shù)
- 連接池的最小連接數(shù)
- 連接池的每次增加的容量

9.兩種開(kāi)源數(shù)據(jù)源

  • DBCP:是Apache軟件基金組織下的開(kāi)源連接池實(shí)現(xiàn),該連接池依賴該組織下的另一個(gè)開(kāi)源系統(tǒng):common-pool
    - C3P0:數(shù)據(jù)源性能更勝一籌,Hibernate就推薦使用該連接池
    C3P0連接池不僅可自動(dòng)清理不再使用的Connection,還可以自動(dòng)清理Statement和ResultSet

10.JDBC連接驅(qū)動(dòng)實(shí)例


<br> package cn.jdbc;
<br> import java.sql.Connection;
<br> import java.sql.DriverManager;
<br> import java.sql.SQLException;
<br> /**
<br>  * 創(chuàng)建初始化并獲取
<br>  */
<br> public class MyJdBc {
<br>    private static Connection cot = null;//聲明
<br>    //靜態(tài)代碼塊
<br>    static{
<br>        try {
<br>            Class.forName("com.mysql.jdbc.Driver");
<br>            //數(shù)據(jù)庫(kù)名稱,用戶名,密碼
<br>            cot = DriverManager.getConnection("jdbc:mysql://localhost:3306/sqltestdb","root","root");
<br>            if(!cot.isClosed()){
<br>                System.out.println("數(shù)據(jù)連接成功");
<br>            }
<br>        } catch (ClassNotFoundException e) {
<br>            e.printStackTrace();
<br>        }catch(SQLException e){
<br>            e.printStackTrace();
<br>        }
<br>    }
<br>    public static Connection getInstace(){
<br>        return cot;//返回對(duì)象
<br>    }
<br> }
<br> ```
<br> ```
<br> package cn.jdbc;
<br> import java.sql.Connection;
<br> import java.sql.ResultSet;
<br> import java.sql.SQLException;
<br> import java.sql.Statement;
<br> import java.text.DateFormat;
<br> import java.text.ParseException;
<br> import java.text.SimpleDateFormat;
<br> import java.util.Date;
<br> import com.mysql.jdbc.PreparedStatement;
<br> /**
<br>  * JAVA連接JDBC驅(qū)動(dòng)器
<br>  * @author JEEP-711
<br>  *
<br>  */
<br> public class JdBc {
<br>    @SuppressWarnings("unused")
<br>    public static void main(String[] args) throws SQLException, ParseException {        
<br>            Connection cot = MyJdBc.getInstace();//連接
<br>            Statement st = cot.createStatement();//創(chuàng)建Statement類對(duì)象,來(lái)執(zhí)行SQL語(yǔ)句
<br>            String sql = "select * from emp";//要執(zhí)行的SQL語(yǔ)句
<br>            ResultSet rs = st.executeQuery(sql);//ResultSet類,用來(lái)存放獲取結(jié)果集
<br>            System.out.println("-----------------------------------------------");
<br>            System.out.println("------------------執(zhí)行結(jié)果如下所示------------------");
<br>            System.out.println("-----------------------------------------------");
<br>            System.out.println("ID"+"\t"+"姓名"+"\t"+"職稱"+"\t"+"\t時(shí)期"+"\t"+"資金");
<br>            System.out.println("-----------------------------------------------");
<br>            /**
<br>             * 查詢
<br>             */
<br>            String job = null;//職位
<br>            String names = null;//姓名
<br>            String empon = null;//id號(hào)
<br>            String hiredate = null;//時(shí)期
<br>            String sal = null;//資金
<br>            while(rs.next()){
<br>                job = rs.getString("job");//獲取表中過(guò)得字段職稱st列數(shù)據(jù)
<br>                names = rs.getString("ename");//獲取姓名數(shù)據(jù)
<br>                empon = rs.getString("empon");//獲取ID號(hào)
<br>                hiredate  = rs.getString("hiredate");//獲取時(shí)間時(shí)期
<br>                sal = rs.getString("sal");//獲取資金
<br>                System.out.println(empon+"\t"+names+"\t"+job+"\t"+hiredate+"\t"+sal);//輸出結(jié)果
<br>            /**
<br>             * 添加數(shù)據(jù) 
<br>             */
<br>            PreparedStatement pl;
<br>            ResultSet res;
<br>            //預(yù)處理添加數(shù)據(jù),其中有兩個(gè)參數(shù)--"?"
<br>            pl = (PreparedStatement) cot.prepareStatement("insert into emp (empon,ename,job,hiredate,sal)"+
<br>            "values(?,?,?,?,?)");
<br>            pl.setInt(1, 3211);//設(shè)置參數(shù)為1,id為3212
<br>            pl.setString(2, "王剛");//設(shè)置參數(shù)為2,name為王剛
<br>            pl.setString(3, "總裁");//設(shè)置參數(shù)3,職位為總裁
<br>            DateFormat df2 = new SimpleDateFormat("yyy-MM-dd");
<br>            Date myDate2 = df2.parse("2010-09-13");
<br>            pl.setDate(4, new java.sql.Date(myDate2.getTime()));
<br>            pl.setFloat(5, (float)2000.3);
<br>            pl.executeUpdate();//實(shí)行更新
<br>            /**
<br>             * 更新數(shù)據(jù)
<br>             */
<br>            //PreparedStatement gx;
<br>            //預(yù)處理更新(修改)數(shù)據(jù),將王剛的sal修改為5000.00
<br>            pl = (PreparedStatement) cot.prepareStatement("update emp set sal = ? where ename = ?");
<br>            pl.setFloat(1,(float) 5000.00);
<br>            pl.setString(2, "王剛");
<br>            pl.executeUpdate();//實(shí)行修改
<br>            /**
<br>             * 刪除數(shù)據(jù)
<br>             */
<br>            //PreparedStatement sc;
<br>            //預(yù)處理刪除數(shù)據(jù)
<br>            pl = (PreparedStatement) cot.prepareStatement("delete from emp where sal & ?");
<br>            pl.setFloat(1, 4500);
<br>            pl.executeUpdate();//實(shí)行刪除
<br>            pl.close();//關(guān)閉
<br>            }
<br>            rs.close();//關(guān)閉
<br>            cot.close();//關(guān)閉
<br>        } catch (ClassNotFoundException e) {
<br>            System.out.println("數(shù)據(jù)庫(kù)驅(qū)動(dòng)異常");//數(shù)據(jù)庫(kù)驅(qū)動(dòng)類異常處理
<br>            e.printStackTrace();
<br>        } catch (SQLException e) {
<br>            System.out.println("數(shù)據(jù)庫(kù)連接失敗");//數(shù)據(jù)庫(kù)連接失敗異常處理
<br>            e.printStackTrace();
<br>        } catch (Exception e) {
<br>            e.printStackTrace();
<br>        }finally{
<br>            System.out.println("數(shù)據(jù)庫(kù)數(shù)據(jù)成功獲取!");
<br>        }
<br>    }
<br> }
<br> ```

初學(xué)(JAVA JDBC編程 高級(jí)階段) 難點(diǎn): ★★★★★

希望每一篇文章都能夠?qū)ψx者們提供幫助與提升,這乃是每一位筆者的初衷

感謝您的閱讀 歡迎您的留言與建議

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)