第15篇-JAVA JDBC編程

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

1.JDBC概述

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

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

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

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

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

4.MySQL的常見命令

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

5.JDBC常用接口和類

  • DriverManager
    - Connection
    - Statement
    - PreparedStatement
    - ResultSet

6.JDBC編程步驟

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

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

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

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

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

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

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

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

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

  1. <br> package cn.jdbc;
  2. <br> import java.sql.Connection;
  3. <br> import java.sql.DriverManager;
  4. <br> import java.sql.SQLException;
  5. <br> /**
  6. <br> * 創(chuàng)建初始化并獲取
  7. <br> */
  8. <br> public class MyJdBc {
  9. <br> private static Connection cot = null;//聲明
  10. <br> //靜態(tài)代碼塊
  11. <br> static{
  12. <br> try {
  13. <br> Class.forName("com.mysql.jdbc.Driver");
  14. <br> //數(shù)據(jù)庫名稱,用戶名,密碼
  15. <br> cot = DriverManager.getConnection("jdbc:mysql://localhost:3306/sqltestdb","root","root");
  16. <br> if(!cot.isClosed()){
  17. <br> System.out.println("數(shù)據(jù)連接成功");
  18. <br> }
  19. <br> } catch (ClassNotFoundException e) {
  20. <br> e.printStackTrace();
  21. <br> }catch(SQLException e){
  22. <br> e.printStackTrace();
  23. <br> }
  24. <br> }
  25. <br> public static Connection getInstace(){
  26. <br> return cot;//返回對象
  27. <br> }
  28. <br> }
  29. <br> ```
  30. <br> ```
  31. <br> package cn.jdbc;
  32. <br> import java.sql.Connection;
  33. <br> import java.sql.ResultSet;
  34. <br> import java.sql.SQLException;
  35. <br> import java.sql.Statement;
  36. <br> import java.text.DateFormat;
  37. <br> import java.text.ParseException;
  38. <br> import java.text.SimpleDateFormat;
  39. <br> import java.util.Date;
  40. <br> import com.mysql.jdbc.PreparedStatement;
  41. <br> /**
  42. <br> * JAVA連接JDBC驅(qū)動器
  43. <br> * @author JEEP-711
  44. <br> *
  45. <br> */
  46. <br> public class JdBc {
  47. <br> @SuppressWarnings("unused")
  48. <br> public static void main(String[] args) throws SQLException, ParseException {
  49. <br> Connection cot = MyJdBc.getInstace();//連接
  50. <br> Statement st = cot.createStatement();//創(chuàng)建Statement類對象,來執(zhí)行SQL語句
  51. <br> String sql = "select * from emp";//要執(zhí)行的SQL語句
  52. <br> ResultSet rs = st.executeQuery(sql);//ResultSet類,用來存放獲取結(jié)果集
  53. <br> System.out.println("-----------------------------------------------");
  54. <br> System.out.println("------------------執(zhí)行結(jié)果如下所示------------------");
  55. <br> System.out.println("-----------------------------------------------");
  56. <br> System.out.println("ID"+"\t"+"姓名"+"\t"+"職稱"+"\t"+"\t時期"+"\t"+"資金");
  57. <br> System.out.println("-----------------------------------------------");
  58. <br> /**
  59. <br> * 查詢
  60. <br> */
  61. <br> String job = null;//職位
  62. <br> String names = null;//姓名
  63. <br> String empon = null;//id號
  64. <br> String hiredate = null;//時期
  65. <br> String sal = null;//資金
  66. <br> while(rs.next()){
  67. <br> job = rs.getString("job");//獲取表中過得字段職稱st列數(shù)據(jù)
  68. <br> names = rs.getString("ename");//獲取姓名數(shù)據(jù)
  69. <br> empon = rs.getString("empon");//獲取ID號
  70. <br> hiredate = rs.getString("hiredate");//獲取時間時期
  71. <br> sal = rs.getString("sal");//獲取資金
  72. <br> System.out.println(empon+"\t"+names+"\t"+job+"\t"+hiredate+"\t"+sal);//輸出結(jié)果
  73. <br> /**
  74. <br> * 添加數(shù)據(jù)
  75. <br> */
  76. <br> PreparedStatement pl;
  77. <br> ResultSet res;
  78. <br> //預(yù)處理添加數(shù)據(jù),其中有兩個參數(shù)--"?"
  79. <br> pl = (PreparedStatement) cot.prepareStatement("insert into emp (empon,ename,job,hiredate,sal)"+
  80. <br> "values(?,?,?,?,?)");
  81. <br> pl.setInt(1, 3211);//設(shè)置參數(shù)為1,id為3212
  82. <br> pl.setString(2, "王剛");//設(shè)置參數(shù)為2,name為王剛
  83. <br> pl.setString(3, "總裁");//設(shè)置參數(shù)3,職位為總裁
  84. <br> DateFormat df2 = new SimpleDateFormat("yyy-MM-dd");
  85. <br> Date myDate2 = df2.parse("2010-09-13");
  86. <br> pl.setDate(4, new java.sql.Date(myDate2.getTime()));
  87. <br> pl.setFloat(5, (float)2000.3);
  88. <br> pl.executeUpdate();//實(shí)行更新
  89. <br> /**
  90. <br> * 更新數(shù)據(jù)
  91. <br> */
  92. <br> //PreparedStatement gx;
  93. <br> //預(yù)處理更新(修改)數(shù)據(jù),將王剛的sal修改為5000.00
  94. <br> pl = (PreparedStatement) cot.prepareStatement("update emp set sal = ? where ename = ?");
  95. <br> pl.setFloat(1,(float) 5000.00);
  96. <br> pl.setString(2, "王剛");
  97. <br> pl.executeUpdate();//實(shí)行修改
  98. <br> /**
  99. <br> * 刪除數(shù)據(jù)
  100. <br> */
  101. <br> //PreparedStatement sc;
  102. <br> //預(yù)處理刪除數(shù)據(jù)
  103. <br> pl = (PreparedStatement) cot.prepareStatement("delete from emp where sal & ?");
  104. <br> pl.setFloat(1, 4500);
  105. <br> pl.executeUpdate();//實(shí)行刪除
  106. <br> pl.close();//關(guān)閉
  107. <br> }
  108. <br> rs.close();//關(guān)閉
  109. <br> cot.close();//關(guān)閉
  110. <br> } catch (ClassNotFoundException e) {
  111. <br> System.out.println("數(shù)據(jù)庫驅(qū)動異常");//數(shù)據(jù)庫驅(qū)動類異常處理
  112. <br> e.printStackTrace();
  113. <br> } catch (SQLException e) {
  114. <br> System.out.println("數(shù)據(jù)庫連接失敗");//數(shù)據(jù)庫連接失敗異常處理
  115. <br> e.printStackTrace();
  116. <br> } catch (Exception e) {
  117. <br> e.printStackTrace();
  118. <br> }finally{
  119. <br> System.out.println("數(shù)據(jù)庫數(shù)據(jù)成功獲取!");
  120. <br> }
  121. <br> }
  122. <br> }
  123. <br> ```

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

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

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號