Java面試手冊:JDBC

什麼是JDBC

Java數據庫連接,簡稱JDBC(java Database Connectivity),是一種用於執行SQL語句的java API,它由一組java編寫的類和接口組成。JDBC爲工具/數據庫開發人員提供了一個標準的API,據此可以構建更高級的工具和接口,使數據的開發人員能夠用純java API編寫數據庫應用程序。

  • 有了JDBC 向各種關係型數據庫發送SQL語句就是一件很容易的事。是一個獨立於數據庫的管理系統,提供了通用的SQL數據庫存取操作的接口(CRUD:Create Read Update Delete),定義了一組同一標準,爲訪問不同數據庫提供同一途徑。它是由sum公司開發的一套系統組件,供開發者直接調用。
程序是如何同數據庫進行溝通的

  • 數據庫本身就是一個獨立運行的應用程序,編寫應用程序就是利用網絡通信協議與數據庫進行命令交換,來進行命令的增刪查找。雙層架構

  • 問題的重點在於,你的應用程序如何調用這組程序庫?
    • 因爲每個數據庫的通常有不同的通信協議,用於連接不同數據庫在API上也會有所不同
    • JDBC 基本上就是用來解決這些問題,當應用程序需要練級數據庫就調用這組標準的API,而標準的API中的接口由數據庫廠商實現,通常稱爲JDBC驅動程序(Driver)。
    • 三層架構
JDBC分爲兩部分
  • JDBC 應用程序開發者接口((ApplicationDeveloper Interface)
  • JDBC 驅動程序開發者接口 (Driver Developer Interface)),驅動程序接口是數據庫廠商要實現驅動程序時的規範,一般開發者並不用瞭解。

使用JDBC代碼進行數據庫連接處理:

開發應用程序過程中,如果要操作數據庫,我們是通過JDBC所提供的接口來實現設計程序的,理論上必須更換數據庫的時候,應用程序不用修改,直接更換數據庫驅動程序實現數據庫的更換。

Connection conn = DriverManager.getConnection(....);  //驅動
Statement st = conn.createStatement();  //聲明
ResultSet rs = st.executeQuery("select * from T_user"); //executeQuery 執行命令

假設這段代碼是連接MySQL數據庫,你會需要在Classpath中設置MySQL;對應JDBC的驅動程序。
具體來說,就是在Classpath 中設置一個JAR文件此時應用程序、JDBC 與數據庫的關係如下圖所示。

  • 連接MySQL 數據庫
  • 連接Oracle 數據庫
JDBC體系結構:java訪問各種關係型數據庫的一系列API,功能包括

1、建立數據庫連接

2、創建SQL語句

3、執行SQL語句

4、查看或修改結果

具體的方法:

代碼實例:Connection  conn =  DriverManager.getConnection("URL",“user”,"password")url:數據庫地址,jdbc:mysql://localhost:/database(數據庫名字)?useUnicode=true&characterEncoding=UTF-8 //在數據庫名字後面最好加入utf—8

user:數據庫用戶名

password:數據庫密碼

oracle:連接驅動://Connection  conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:dabase",“user”,“password”)
  • executeQuery():運行select 語句,返回ResultSet 結果集。
  • executeUpdate():運行 insert、delete、update的操作,返回更新的行數。
  • true:表示 SQL執行返回的結果是resultSet類型(select)
  • 表示 SQL執行返回的結果不是是resultSet類型 (insert,delete,update)
  • Statement :執行SQL語句:並且返回他所生成的結果對象:Statement,由createStatement創建,用於發送簡單的sql語句(不帶參數):不使用,而使用它的子類PreparedStatement
  • PreparedStatement接口:用於發送一個或者多個輸入參數的sql語句,它的父類是Statement,但是其效率更高, 並且可以防止SQL注入,因此我們一般都用prepareStatement.
  • CallableStatement,繼承prepareStatement,由preParCall創建, 用於調用存儲過程。
  • execute():運行語句返回是否有結果集:true/false, 不過該方法很少用來返回結果集,因爲容易發生SQL注入
  • 我們常用的是:
  • DriverManager:驅動管理
  • Connection:連接與特定數據庫的連接(會話),在連接上下文中執行SQL語句並且返回結果
  • DriverManager 的 getConnection()方法是建立JDBC URL中定義的數據庫在Connection 連接的(連接對象內部其實包含了Socket對象,是一個遠程連接,比較耗時,這是Connection對象管理的一個要點, 在實際開發中,爲了提高效率,我們使用連接池來管理連接對象)
使用JDBC的步驟

  • 導入jar包 :MySQL-connector-java-5.1.33-bin.jar
  • 編寫代碼:
    • name="root";
    • password= "1121"
    • url = "jdbc:mysql://localhost:/database(數據庫名字)?useUnicode=true&characterEncoding=UTF-8"
    • driveClassName = "com.mysql.jdbc.Driver"
    • 編寫連接MySQL的四大參數
  • 加載MySQL的驅動類
    • class.forName(driveClassName)
  • 獲取MySQL數據庫的連接對象
    • Connection conn = DriveManger.getConnection(url,name,password);
  • 向MySQL數據庫發送SQL語句
    • String sql = "insert into dept values(65,"tt","oo")";
    • Statement stmt = conn.createStatement();
    • int result = stmt.executeUpdate(sql);
  • 查詢語句的話,讀取結果集中的數據
  • 關閉MySQL數據庫相關的連接
    • stmt.close();
    • conn.close();
  • 用到的對象:
    • Result executeQuery(String sql) :返回結果集
    • int stmt.executeUpdate(sql) : 返回返回更新數據
    • DriverManager (管理JDBC驅動程序):getConnection(String url,name,password)
    • Connection(管理連接):conn.createStatement()
    • Statement (執行靜態SQL語句):
  • ResultSet(查詢數據庫得到的結果集):將結果集封裝成類
    • next()
    • first()
    • last()
    • previous()
    • relative(int rows)
    • absolute(int row)
    • 移動光標:
    • 獲取字段: getxxx();
JDBC 連接池:相當於容器

  • Connection 連接的弊端,每次連接都要驗證密碼和用戶名,用完後由被關閉,當下次執行的時候又再次連接,這樣既耗時又浪費資源(可以比較爲一次性手機和公共電話),爲了提高程序效率我們使用連接池。
  • 數據庫連接池基本思想:爲數據庫建立緩衝池(連接的集合),預先在裏面方一定數量的的連接對象,當Java application(應用程序)需要獲取數據庫連接時,直接從連接池中取一個出來,用完後不關閉,再放到池中,重複利用,做到資源共享。
  • JDBC 提供了DataSource接口來使用數據庫連接池,但是JDBC沒用對該接口進行實現,但是在實際開發中我們不需要自己實現,直接利用第三方工c3p0 就可以完成。
  • c3p0是在JDBC的第二步使用,替換連接步驟。
    • c3p0產生的類和原生的類不一樣,前者是代理連接數據庫,後者是直接連接數據庫
    • 關閉釋放資源的方式不同,c3p0這個時候調用的close()方法不是扔掉,而是還回連接池.
  • c3p0 使用步驟:
    • 導入c3p0jar 包
    • 創建C3P0數據源
    • 設置數據庫屬性(url , user. password)
    • 加載驅動(不用class.forName())
    • 設置初始化的連接數(連接池大小):最大連接數(雖然連接池的初始化連接是10,但是當鏈接不夠時還可以重新申請,直到上限,如果超過上限,則等待),和最小連接(2)
  • C3P0—config.xml 文件名不能修改,放置在src路徑下
    • name—config.xml 標籤的name屬性不可以自定義
    • property 標籤的name屬性不能修改
    • Property 標籤內部的值不能加雙引號
  • DBUtils工具:簡化JDBC代碼,查詢數據,可以完成自動封裝,但是隻能單表查詢封裝,多表關聯無法封裝,多表關聯封裝以後MyBatis 框架或者Hibernate 框架來完成。
    • 自動封裝的原理:通過反射機制創建目標對象,必須調用無參構造,實體類必須有一個無參構造,屬性必須有stter方法
注意

  • 提供SQL佔位符:用?代替參數。
    • String sql = "update card set name = ? ,classs= ? where cno= ?";
  • 關於SQL注入:
    • 原理:利用系統沒有對用戶輸入的數據進行充分驗證,在用戶輸入的信息中注入非法SQL語句,從而利用系統的sql引擎完成惡意行爲的做法。
    • 解決方案:佔位符替換,也不用拼接sql語句。定義子類。
  • 在數據庫中保存圖片(音頻 視頻):(圖片音視頻都是以二進制的形式保存在數據庫中(選擇適合的類型,注意資源大小),二進制保存類型有(只是大小不同)tinyblob:255kb 、blob:65kb 、mediublob: 16M )
  • JDBC 事務:(一般框架裏面都有,具體寫代碼的時候不用自己去寫)
    • 關閉自動提交 //setAutoCommit(false);
    • 手動提交 //conn.commit();
    • 回滾 //conn.rollback();
  • 硬編碼:是將數據庫信息寫死在程序中,每次修改信息,都需要重新編譯java程序;一般會將數據庫的連接信息提取出來放在配置文件裏面,java程序只需要讀取配置文件就、就可以了。
  • 寫底層框架的條件:(學會看源碼)1.xml解析 2.反射 3. 接口---->實現類
  • 框架:就是工具,提高編寫效率(類似於洗衣機) 按照正確的步驟操作。
  • 異常處理:1,自己處理(try catch 自己處理)。 2,拋出給上級 。類似於公司出問題自己處理或者上級處理,但是最高是JVM。
  • 關於封裝:當一個代碼多次重複執行,那麼我們可以將它封裝成一個類,一個方法多次被調用,那麼將他放到靜態代碼塊中。
  • java 中對數據庫的操作時,一般是建立一個模型類,將數據庫的表映射到模型類,然後以面向對象的操作方法來處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章