JDBC基础
JDBC
1簡介
JDBC(Java DataBase Connectivity)是SUN公司提供的一組用于執行SQL語句的Java API,它主要由接口組成。可以為多種關系數據庫提供統一訪問。
Sun公司為簡化數據庫開發,定義了一套JDBC接口,這套接口由數據庫廠商去實現,這樣,開發人員只需要學習JDBC接口,并通過JDBC加載具體的驅動,就可以操作數據庫。
組成JDBC的2個包: java.sql ?javax.sql
以上2個包已經包含在J2SE中,所以不用導入,開發這只需要導入JDBC的實現類即數據庫驅動包。開發JDBC應用需要以上2個包的支持外,還需要導入相應JDBC的數據庫實現(即數據庫驅動)。
2采用JDBC訪問數據庫的基本步驟:
????A.載入JDBC DriverManager 驅動程序
注冊數據庫驅動兩種方式:
DriverManager.registerDriver(newDriver())
Class.forName(“數據庫廠商提供的驅動類”);?? 推薦
????B.定義連接URL
jdbc:oracle:thin:? @127.0.01:1521:orcl
(1)JDBC協議:JDBC URL中的協議總是jdbc。
(2)<子協議>:驅動程序名或數據庫連接機制的名稱
(3)<子名稱>:種標識數據庫的方法。
????C.建立Connection連接
DriverManager.getConnection獲取連接
????D.創建Statement對象
createStatement():創建向數據庫發送sql的statement對象。
prepareStatement(sql):創建向數據庫發送預編譯sql的PrepareSatement對象。
prepareCall(sql):創建執行存儲過程的CallableStatement對象。
setAutoCommit(boolean?autoCommit):設置事務是否自動提交。
commit():在鏈接上提交事務。
rollback():在此鏈接上回滾事務。
?
E.執行SQL查詢或更新
executeQuery(String?sql):用于向數據發送查詢語句。
executeUpdate(String?sql):用于向數據庫發送insert、update或delete語句
execute(Stringsql):用于向數據庫發送任意sql語句
addBatch(String?sql):把多條sql語句放到一個批處理中。
executeBatch():向數據庫發送一批sql語句執行。
????F. 返回ResultSet結果處理
ResultSet還提供了對結果集進行滾動的方法:
??? next():?????????? 移動到下一行
??? previous():?????? 移動到前一行
??? absolute(int row): 移動到指定行
??? beforeFirst():??? 移動resultSet的最前面。
??? afterLast() : 移動到resultSet的最后面
????G.關閉連接
??????????? 在關閉數據庫連接時應該以ResultSet、Statement、Connection的順序進行
3增刪改查
? Jdbc中的statement對象用于向數據庫發送SQL語句,想完成對數據庫的增刪改查,只需要通過這個對象向數據庫發送增刪改查語句即可。
Statement對象的executeUpdate方法,用于向數據庫發送增、刪、改的sql語句,executeUpdate執行完后,將會返回一個整數(即增刪改語句導致了數據庫幾行數據發生了變化)。
Statement.executeQuery方法用于向數據庫發送查詢語句,executeQuery方法返回代表查詢結果的ResultSet對象。
4PreparedStatement
SQL注入是用戶利用某些系統沒有對輸入數據進行充分的檢查,從而進行惡意破壞的行為。
1、statement存在sql注入攻擊問題,例如登陸用戶名采用' or 1=1 or name=‘
2、對于防范 SQL 注入,可以采用PreparedStatement取代Statement。
PreperedStatement是Statement的子接口,它的實例對象可以通過調用Connection.preparedStatement()方法獲得,相對于Statement對象而言:
?? 1. 【程序安全】 PreperedStatement可以避免SQL注入的問題。
?? 2. 【執行效率】 Statement會使數據庫頻繁編譯SQL,可能造成數據庫緩沖區溢出。PreparedStatement 可對SQL進行預編譯,從而提高數據庫的執行效率。
?????? < 對于整個DB中,只要預編譯的語句語法和緩存中匹配.那么在任何時候就可以不需要再次編譯而可以直接執行.而statement的語句中,即使是相同一操作,而由于每次操作的數據不同所以使整個語句相匹配的機會極小,幾乎不太可能匹配 >
?
?? 3. 【開發效率】并且PreperedStatement對于sql中的參數,允許使用占位符的形式進行替換,簡化sql語句的編寫。
5使用事務
當JDBC程序向數據庫獲得一個Connection對象時,默認情況下這個Connection對象會自動向數據庫提交在它上面發送的SQL語句。若想關閉這種默認提交方式,讓多條SQL在一個事務中執行,可使用下列語句:
Connection.setAutoCommit(false);start transaction
Connection.rollback();? rollback
Connection.commit();? commit
6事務的特性
原子性(Atomicity)是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。?
?
一致性(Consistency)事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。
?
隔離性(Isolation)事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。
?
持久性(Durability)持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。
7事務的隔離級別
多個線程開啟各自事務操作數據庫中數據時,數據庫系統要負責隔離操作,以保證各個線程在獲取數據時的準確性。
如果不考慮隔離性,可能會引發如下問題:
臟讀(dirty reads)
一個事務讀取了另一個未提交的并行事務寫的數據。
不可重復讀(non-repeatable reads)
一個事務重新讀取前面讀取過的數據,發現該數據已經被另一個已提交的事務修改過。
幻讀(phantom read)
一個事務重新執行一個查詢,返回一套符合查詢條件的行,發現這些行因為其他最近提交的事務而發生了改變
? 設置一個事務的隔離級別
?? set?transaction? isolation? level?read? committed ;
?? set?transaction? isolation? level?serializable ;
?? set?transaction? read? only ;
設置增個會話的隔離級別
?? alter session set isolation_levelserializable
?? alter session SET isolation_level READcommitted
8CallableStatement
CallableStatement是PreparedStatement的子接口,用于執行 SQL 存儲過程。
JDBC執行存儲過程的四種情況
[1]、只有輸入IN參數,沒有輸出OUT參數
[2]、既有輸入IN參數,也有輸出OUT參數,輸出是簡單值(非列表)
[3]、既有輸入IN參數,也有輸出OUT參數,輸出是列表
[4]、輸入輸出參數是同一個(INOUT)
9使用JDBC進行批處理
業務場景:當需要向數據庫發送一批SQL語句執行時,應避免向數據庫一條條的發送執行,而應采用JDBC的批處理機制,以提升執行效率。
實現批處理有兩種方式,
第一種方式:Statement.addBatch(sql)
?? 執行批處理SQL語句
?? executeBatch()方法:執行批處理命令
?? clearBatch()方法:清除批處理命令
優點:可以向數據庫發送多條不同的SQL語句。
缺點:SQL語句沒有預編譯。當向數據庫發送多條語句相同,但僅參數不同的SQL語句時,需重復寫上很多條SQL語句。
第二種方式:? PreparedStatement.addBatch()
優點:發送的是預編譯后的SQL語句,執行效率高。
缺點:只能應用在SQL語句相同,但參數不同的批處理中。因此此種形式的批處理經常用于在同一個表中批量插入數據,或批量更新表的數據。
10O-R Mapping簡介
常用O-R Mapping映射工具
??? Hibernate Ibatis、Mybatis? Commons DbUtils(只是對JDBC簡單封裝)
11CommonsDbUtils是Apache組織提供的一個對JDBC進行簡單封裝的開源工具類庫,使用它能夠簡化JDBC應用程序的開發,同時也不會影響程序的性能
DBUtils是java編程中的數據庫操作實用工具,小巧簡單實用,需要項目導入commons-dbutils-1.6.jar才能夠正常使用DBUtils工具。
特征:
? 1.對于數據表的讀操作,他可以把結果轉換成List,Array,Set等java集合,便于程序員操作;
? 2.對于數據表的寫操作,也變得很簡單(只需寫sql語句)
? 3.可以使用數據源,使用JNDI,數據庫連接池等技術來優化性能--重用已經構建好的數據庫連接對象
Dbutils三個核心功能介紹
?????? QueryRunner中提供對sql語句操作的API.
? ? ?update(Connection conn, String sql, Object... params) ,用來完成表數據的增加、刪除、更新操作
? ? ?query(Connection conn, String sql,ResultSetHandler<T> rsh, Object... params) ,用來完成表數據的查詢操作
? ? ?ResultSetHandler接口,用于定義select操作后,怎樣封裝結果集.
?????? DbUtils類,它就是一個工具類,定義了關閉資源與事務處理的方法
12連接池技術
連接池是創建和管理一個連接的緩沖池的技術,這些連接準備好被任何需要它們的線程使用。數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接,來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。
連接池技術的核心思想是:連接復用,通過建立一個數據庫連接池以及一套連接使用、分配、管理策略,使得該連接池中的連接可以得到高效、安全的復用,避免了數據庫連接頻繁建立、關閉的開銷。
連接池主要由三部分組成:
?連接池的建立、連接池中連接的使用管理、連接池的關閉。
優點:
1資源重用:
由于數據庫連接得以重用,避免了頻繁創建,釋放連接引起的大量性能開銷。在減少系統消耗的基礎上,另一方面也增加了系統運行環境的平穩性。
2更快的系統反應速度
數據庫連接池在初始化過程中,往往已經創建了若干數據庫連接置于連接池中備用。此時連接的初始化工作均已完成。對于業務請求處理而言,直接利用現有可用連接,避免了數據庫連接初始化和釋放過程的時間開銷,從而減少了系統的響應時間
3新的資源分配手段
對于多應用共享同一數據庫的系統而言,可在應用層通過數據庫連接池的配置,實現某一應用最大可用數據庫連接數的限制,避免某一應用獨占所有的數據庫資源
4統一的連接管理,避免數據庫連接泄露
在較為完善的數據庫連接池實現中,可根據預先的占用超時設定,強制回收被占用連接,從而避免了常規數據庫連接操作中可能出現的資源泄露
現在很多WEB服務器(Weblogic, WebSphere , Jboss , Tomcat)都提供了DataSoruce的實現,即連接池的實現。通常我們把DataSource的實現,按其英文含義稱之為數據源,數據源中都包含了數據庫連接池的實現。
?
也有一些開源組織提供了數據源的獨立實現:
DBCP數據庫連接池?? (tomcat)
C3P0數據庫連接池?? (hibernate、Spring)
c3p0與dbcp區別
dbcp沒有自動回收空閑連接的功能
c3p0有自動回收空閑連接功能
?
數據源(DataSource):
DataSource對象是獲取連接的首選方法, DriverManager 的替代項。
javax.sql.DataSource接口負責建立與數據庫的連接。
連接池中的連接對象是由該對象創建。
DataSource接口由驅動程序供應商實現
實現 DataSource 接口的對象通常在基于JNDI而工作。
?
DBCP是 Apache 軟件基金組織下的開源連接池實現,該連接池依賴該組織下的另一個開源系統:Common-pool.如需使用該連接池實現,應在系統中增加如下三個 jar 文件:
?? Commons-dbcp.jar:連接池的實現
?? Commons-pool.jar:連接池實現的依賴庫
?? Commons-logging-1.2.jar
Tomcat的連接池正是采用該連接池來實現的。該數據庫連接池既可以與應用服務器整合使用,也可由應用程序獨立使用
在Tomcat的context.xml文件配置
<Resource
? ??????name = "jdbc/java1709"
????? ??auth="Container"
????? ??type="javax.sql.DataSource"
????? ??username="??? "
????? ??password="??? "
????? ??maxActive ="100"
????? ??maxIdle="30"
????? ?? maxWait="10000"
????? ??driverClassName="oracle.jdbc.driver.OracleDriver"
????? ??url="jdbc:oracle:thin:@localhost:1521:orcl"
????? ??/>
總結
- 上一篇: iPhone屏幕各种尺寸分辨率(更新至X
- 下一篇: 1-2 三位数反转(算法竞赛入门经典)