什麼是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 中對數據庫的操作時,一般是建立一個模型類,將數據庫的表映射到模型類,然後以面向對象的操作方法來處理。