JDBC基本知識課件_第1頁
JDBC基本知識課件_第2頁
JDBC基本知識課件_第3頁
JDBC基本知識課件_第4頁
JDBC基本知識課件_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

JDBC講師:張曉飛IT資訊交流網(wǎng)數(shù)據(jù)持久化持久化(persistence):把數(shù)據(jù)保存到可掉電式存儲設(shè)備中以供之后使用,也稱為“固化”。在大多數(shù)情況下,服務(wù)器或客戶端應(yīng)用中數(shù)據(jù)的持久化是通過關(guān)系型數(shù)據(jù)庫來實(shí)現(xiàn)存儲設(shè)備:磁盤、硬盤,U盤,光盤等存儲形式:數(shù)據(jù)庫、xml文件、txt文件等數(shù)據(jù)XML文件數(shù)據(jù)庫其它存儲形式知識點(diǎn)1:數(shù)據(jù)持久化為什么用數(shù)據(jù)庫持久化數(shù)據(jù)?IT資訊交流網(wǎng)Java中的數(shù)據(jù)庫存儲技術(shù)在Java中,數(shù)據(jù)庫存取技術(shù)可分為如下幾類:JDBC直接訪問數(shù)據(jù)庫第三方O/R工具,如Hibernate,ibatis等JDBC是java訪問數(shù)據(jù)庫的基石,其他技術(shù)都是對jdbc的封裝知識點(diǎn)2:Java中的數(shù)據(jù)存儲技術(shù)學(xué)好JDBC是王道!?。T資訊交流網(wǎng)ODBCODBC(OpenDatabaseConnectivity,開放數(shù)據(jù)庫連接)是微軟公司開放服務(wù)結(jié)構(gòu)中有關(guān)數(shù)據(jù)庫的一個(gè)組成部分,它建立了一組規(guī)范,并提供了一組對數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)API知識點(diǎn)4:什么是ODBC(了解)IT資訊交流網(wǎng)JDBC分類目前有四種可供使用的JDBC驅(qū)動程序,不同類型的的驅(qū)動程序有著不一樣的使用方法,所以當(dāng)我們在連接數(shù)據(jù)庫之前,必須先依照我們的需求選擇一個(gè)適當(dāng)?shù)尿?qū)動程序,這四種不同類型的驅(qū)動程序分別是:

1JDBC-ODBC橋:橋接器型的驅(qū)動程序,2部分本地API部分Java的驅(qū)動程序,也是橋接器型驅(qū)動程序之一3JDBC網(wǎng)絡(luò)純Java驅(qū)動程序4本地協(xié)議的純Java驅(qū)動程序:這類型的驅(qū)動程序是最成熟的JDBC驅(qū)動程序,不但無需在使用者計(jì)算機(jī)上安裝任何額外的驅(qū)動程序,也不需在服務(wù)器端安裝任何的中介程序(middleware),所有存取數(shù)據(jù)庫的操作,都直接由驅(qū)動程序來完成。知識點(diǎn)5:JDBC的分類(了解)IT資訊交流網(wǎng)JDBC-ODBC橋JDBC-ODBC橋是在JDK中由SUN本身開發(fā)出來的一套數(shù)據(jù)庫訪問操作,在JDBC-ODBC橋接中它的各種操作API都是最新的,但性能不高在JDK中,提供了JDBC-ODBC橋的實(shí)現(xiàn)類(sun.jdbc.odbc.JdbcOdbcDriver)Java應(yīng)用程序JDBCAPIJDBC-ODBC橋ODBCAPI數(shù)據(jù)庫ODBC層知識點(diǎn)5_1:JDBC-ODBC橋(了解)

IT資訊交流網(wǎng)部分本地API部分Java的驅(qū)動程序這種類型的JDBC驅(qū)動程序使用Java編寫,它調(diào)用數(shù)據(jù)庫廠商提供的本地API通過這種類型的JDBC驅(qū)動程序訪問數(shù)據(jù)庫減少了ODBC的調(diào)用環(huán)節(jié),提高了數(shù)據(jù)庫訪問的效率在這種方式下需要在客戶的機(jī)器上安裝本地JDBC驅(qū)動程序和特定廠商的本地APIJava應(yīng)用程序JDBCAPIJDBC驅(qū)動程序廠商提供的本地API數(shù)據(jù)庫知識點(diǎn)5_2:部分本地API部分Java的驅(qū)動程序(了解)IT資訊交流網(wǎng)*本地協(xié)議的純Java驅(qū)動程序多數(shù)數(shù)據(jù)庫廠商已經(jīng)支持允許客戶程序通過網(wǎng)絡(luò)直接與數(shù)據(jù)庫通信的網(wǎng)絡(luò)協(xié)議。這種類型的驅(qū)動程序完全使用Java編寫,通過與數(shù)據(jù)庫建立的Socket連接,采用具體與廠商的網(wǎng)絡(luò)協(xié)議把JDBC調(diào)用轉(zhuǎn)換為直接連接的網(wǎng)絡(luò)調(diào)用Java應(yīng)用程序JDBCAPIJDBC驅(qū)動程序數(shù)據(jù)庫知識點(diǎn)5_4:*****本地協(xié)議的純Java驅(qū)動程序(了解)IT資訊交流網(wǎng)獲取與數(shù)據(jù)庫的連接編碼實(shí)現(xiàn)得到代表與數(shù)據(jù)庫連接的Connection對象三種方式IT資訊交流網(wǎng)獲取數(shù)據(jù)庫連接方法二:驅(qū)動管理器注冊知識點(diǎn)7_2:采用注冊驅(qū)動的方式DriverManager.registerDriver(driver)向DriverManager注冊給定驅(qū)動程序IT資訊交流網(wǎng)獲取數(shù)據(jù)庫連接方法三:加載驅(qū)動類字節(jié)碼知識點(diǎn)7_3:采用class.forName的方式加載JDBC驅(qū)動需調(diào)用Class類的靜態(tài)方法forName(),向其傳遞要加載的JDBC驅(qū)動的類名DriverManager類是驅(qū)動程序管理器類,負(fù)責(zé)管理驅(qū)動程序通常不用顯式調(diào)用DriverManager類的registerDriver()方法來注冊驅(qū)動程序類的實(shí)例,因?yàn)镈river接口的實(shí)現(xiàn)類都包含了靜態(tài)代碼塊,在這個(gè)靜態(tài)代碼塊中,會調(diào)用DriverManager.registerDriver()方法來注冊自身的一個(gè)實(shí)例IT資訊交流網(wǎng)連接數(shù)據(jù)庫的URLJDBCURL的標(biāo)準(zhǔn)由三部分組成,各部分間用冒號分隔。協(xié)議:<子協(xié)議>:<子名稱>協(xié)議:JDBCURL中的協(xié)議總是jdbc子協(xié)議:子協(xié)議用于標(biāo)識一個(gè)數(shù)據(jù)庫驅(qū)動程序子名稱:一種標(biāo)識數(shù)據(jù)庫的方法。子名稱可以依不同的子協(xié)議而變化,用子名稱的目的是為了定位數(shù)據(jù)庫提供足夠的信息

知識點(diǎn)7_4:連接數(shù)據(jù)庫的URLjdbc:mysql://localhost:3306/test協(xié)議子協(xié)議子名稱jdbc:mysql://localhost:3306/db_nameURL的作用:1、找到驅(qū)動程序(協(xié)議)2、確定連接的數(shù)據(jù)庫(子名稱)IT資訊交流網(wǎng)操作數(shù)據(jù)庫數(shù)據(jù)庫連接被用于向數(shù)據(jù)庫服務(wù)器發(fā)送命令和SQL語句,在連接建立后,需要對數(shù)據(jù)庫進(jìn)行訪問,執(zhí)行sql語句在java.sql包中有3個(gè)接口分別定義了對數(shù)據(jù)庫的調(diào)用的不同方式:StatementPrepatedStatementCallableStatement知識點(diǎn)8_1:jdbc對數(shù)據(jù)庫的調(diào)用方式2IT資訊交流網(wǎng)Statement 通過調(diào)用Connection對象的createStatement方法創(chuàng)建該對象該對象用于執(zhí)行靜態(tài)的SQL語句,并且返回執(zhí)行結(jié)果Statement接口中定義了下列方法用于執(zhí)行SQL語句:intexcuteUpdate(Stringsql)(針對DDL和DML操作)ResultSetexcuteQuery(Stringsql)(針對DQL操作)知識點(diǎn)8_2:statement對象對數(shù)據(jù)庫的crud操作用statement實(shí)現(xiàn)DDL,DML用statement實(shí)現(xiàn)DQL的操作IT資訊交流網(wǎng)ResultSetIT資訊交流網(wǎng)getXxxx方法Xxxx數(shù)據(jù)類型IT資訊交流網(wǎng)完成JDBC工具類JDBCUtils3封裝JDBC的工具類JdbcUtilsIT資訊交流網(wǎng)練習(xí)字段名說明類型id流水號Intname姓名Varchar(20)sex性別Char(2)grade成績Double(5,2)

學(xué)生表(Student),表結(jié)構(gòu)如下:

實(shí)現(xiàn)對Student表的CRUD操作的DAO類及測試類IT資訊交流網(wǎng)可滾動的ResultSetResultSet的Type說明TYPE_FORWARD_ONLY結(jié)果集不能滾動,只可向前滾動TYPE_SCROLL_INSENSITIVE雙向滾動,但不及時(shí)更新,就是如果數(shù)據(jù)庫里的數(shù)據(jù)修改過,并不在ResultSet中反應(yīng)出來TYPE_SCROLL_SENSITIVE雙向滾動,并及時(shí)跟蹤數(shù)據(jù)庫的更新,以便更改ResultSet中的數(shù)據(jù)ResultSet的Concurrency(并發(fā)類型)說明CONCUR_READ_ONLY結(jié)果集不可用于更新數(shù)據(jù)庫CONCUR_UPDATABLE結(jié)果集可以用于更新數(shù)據(jù)庫知識點(diǎn)9_3:可滾動的ResultSet(了解)對Mysql數(shù)據(jù)庫無效:總是可以前后滾動對Oralce數(shù)據(jù)有效IT資訊交流網(wǎng)ResultSet滾動的結(jié)果集next()previous()first()last()absolute()relative()beforeFirst()afterLast()isFirst()isLast()isBeforeFirst()isAfterLast()在mysql上測試幾個(gè)重要的方法IT資訊交流網(wǎng)PreparedStatement可以通過調(diào)用Connection對象的preparedStatement()方法獲取PreparedStatement對象PreparedStatement接口是Statement的子接口,它表示一條預(yù)編譯過的SQL語句PreparedStatement對象所代表的SQL語句中的參數(shù)用問號(?)來表示,調(diào)用PreparedStatement對象的setXXX()方法來設(shè)置這些參數(shù).setXXX()方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是要設(shè)置的SQL語句中的參數(shù)的索引(從1開始),第二個(gè)是設(shè)置的SQL語句中的參數(shù)的值知識點(diǎn)10:PreparedStatement對象對數(shù)據(jù)庫crud操作用PreparedStatement實(shí)現(xiàn)表數(shù)據(jù)的CRUD操作IT資訊交流網(wǎng)PreparedStatement與statement比較代碼的可讀性和可維護(hù)性.PreparedStatement能保證安全性(解決sql注入問題)PreparedStatement能最大可能提高性能:DBServer會對預(yù)編譯語句提供性能優(yōu)化。因?yàn)轭A(yù)編譯語句有可能被重復(fù)調(diào)用,所以語句在被DBServer的編譯器編譯后的執(zhí)行代碼被緩存下來,那么下次調(diào)用時(shí)只要是相同的預(yù)編譯語句就不需要編譯,只要將參數(shù)直接傳入編譯過的語句執(zhí)行代碼中就會得到執(zhí)行。在statement語句中,即使是相同操作但因?yàn)閿?shù)據(jù)內(nèi)容不一樣,所以整個(gè)語句本身不能匹配,沒有緩存語句的意義.事實(shí)是沒有數(shù)據(jù)庫會對普通語句編譯后的執(zhí)行代碼緩存.這樣每執(zhí)行一次都要對傳入的語句編譯一次.

對Mysql來說幾乎沒有區(qū)別,但對oracle數(shù)據(jù)庫則非常明顯知識點(diǎn)11_2:PreparedStatementVSStatement在mysql和oracle上分別測試二者在性能上的差別測試SQL注入問題IT資訊交流網(wǎng)使用CallableStatement當(dāng)不直接使用SQL語句,而是調(diào)用數(shù)據(jù)庫中的StoreProcedure時(shí),要用到CallableStatement知識點(diǎn)12:CallableStatement對象調(diào)用存儲過程IT資訊交流網(wǎng)小結(jié)java.sql.DriverManager用來裝載驅(qū)動程序,獲取數(shù)據(jù)庫連接。java.sql.Connection完成對某一指定數(shù)據(jù)庫的聯(lián)接,獲取數(shù)據(jù)庫操作對象java.sql.Statement在一個(gè)給定的連接中作為SQL執(zhí)行聲明的容器,他包含了兩個(gè)重要的子類型。Java.sql.PreparedSatement用于執(zhí)行預(yù)編譯的sql聲明Java.sql.CallableStatement用于執(zhí)行數(shù)據(jù)庫中存儲過程的調(diào)用java.sql.ResultSet對于給定聲明取得結(jié)果的途徑IT資訊交流網(wǎng)引入概念:數(shù)據(jù)庫事務(wù)以銀行存款為例來說明事務(wù)的應(yīng)用#賬戶基本信息表createtableaccount(accountidvarchar(18),#賬號balancedouble(10,2)#余額)#存款表createtableinaccount( accountidvarchar(18),#賬號 inbalancedouble(10,2)#存入余額)實(shí)現(xiàn)模擬某人向其賬戶存入100元的業(yè)務(wù)向賬戶中存入100元:Insertintoinaccount(accountid,inbalance)values(‘500612345’,100);Insertintoaccount(accountid,balance)values(‘500612345’,100);IT資訊交流網(wǎng)數(shù)據(jù)庫事務(wù)在數(shù)據(jù)庫中,所謂事務(wù)是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。為確保數(shù)據(jù)庫中數(shù)據(jù)的一致性,數(shù)據(jù)的操縱應(yīng)當(dāng)是離散的成組的邏輯單元:當(dāng)它全部完成時(shí),數(shù)據(jù)的一致性可以保持,而當(dāng)這個(gè)單元中的一部分操作失敗,整個(gè)事務(wù)應(yīng)全部視為錯誤,所有從起始點(diǎn)以后的操作應(yīng)全部回退到開始狀態(tài)。事務(wù)的操作:先定義開始一個(gè)事務(wù),然后對數(shù)據(jù)作修改操作,這時(shí)如果提交(COMMIT),這些修改就永久地保存下來,如果回退(ROLLBACK),數(shù)據(jù)庫管理系統(tǒng)將放棄您所作的所有修改而回到開始事務(wù)時(shí)的狀態(tài)。知識點(diǎn)13:數(shù)據(jù)庫事務(wù)IT資訊交流網(wǎng)數(shù)據(jù)庫事務(wù)事務(wù)的ACID屬性1.原子性(Atomicity)

原子性是指事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。

2.一致性(Consistency)

事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另外一個(gè)一致性狀態(tài)。(數(shù)據(jù)不被破壞)3.隔離性(Isolation)

事務(wù)的隔離性是指一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。4.持久性(Durability)

持久性是指一個(gè)事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對其有任何影響IT資訊交流網(wǎng)JDBC事務(wù)處理事務(wù)處理:保證所有事務(wù)都作為一個(gè)工作單元來執(zhí)行,即使出現(xiàn)了故障,都不能改變這種執(zhí)行方式。當(dāng)在一個(gè)事務(wù)中執(zhí)行多個(gè)操作時(shí),要么所有的事務(wù)都被提交(commit),要么整個(gè)事務(wù)回滾(rollback)到最初狀態(tài)在JDBC中,事務(wù)默認(rèn)是自動提交的,每次執(zhí)行一個(gè)SQL語句時(shí),如果執(zhí)行成功,就會向數(shù)據(jù)庫自動提交,而不能回滾為了讓多個(gè)SQL語句作為一個(gè)事務(wù)執(zhí)行:調(diào)用Connection對象的setAutoCommit(false);以取消自動提交事務(wù)在所有的SQL語句都成功執(zhí)行后,調(diào)用commit();方法提交事務(wù)在出現(xiàn)異常時(shí),調(diào)用rollback();方法回滾事務(wù)可以通過Connection的getAutoCommit()方法來獲得當(dāng)前事務(wù)的提交方式IT資訊交流網(wǎng)事務(wù)處理:命令行實(shí)現(xiàn)

1查看提交模式

select@@autocommit;1用begin,rollback,commit來實(shí)現(xiàn)

begin//開始一個(gè)事務(wù)

rollback//事務(wù)回滾

commit//提交事務(wù)

例如:mysql>begin;mysql>insertintotestvalues(9,'dd','dd');mysql>commit;2直接用set來改變mysql的自動提交模式

MYSQL默認(rèn)是自動提交的,也就是你提交一個(gè)QUERY,它就直接執(zhí)行

setautocommit=0禁止自動提交

setautocommit=1開啟自動提交,來實(shí)現(xiàn)事務(wù)的處理。

*當(dāng)你用setautocommit=0的時(shí)候,你以后所有的SQL都將做為事務(wù)處理,直到你用commit確認(rèn)或rollback結(jié)束。*注意:當(dāng)你結(jié)束這個(gè)事務(wù)的同時(shí)也開啟了個(gè)新的事務(wù)

知識點(diǎn)13:命令行實(shí)現(xiàn)事務(wù)處理IT資訊交流網(wǎng)多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題知識點(diǎn)14:理解事務(wù)并發(fā)A表客戶端1客戶端2IT資訊交流網(wǎng)多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題知識點(diǎn)15:理解事務(wù)隔離級別事務(wù)隔離級別(transactionisolationlevels):隔離級別就是對事務(wù)并發(fā)控制的四個(gè)等級。分為

1串行化(SERIALIZABLE)2可重復(fù)讀(REPEATABLEREAD)3讀已提交(READCOMMITED)4讀未提交(READUNCOMMITED)IT資訊交流網(wǎng)北京傳智播客教育多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題隔離級別含義讀未提交數(shù)據(jù)ReadUncommitted能查看到其它事務(wù)還未提交的數(shù)據(jù),,可能導(dǎo)致臟、幻、不可重復(fù)讀()讀已提交數(shù)據(jù)ReadCommitted只能查到其它事務(wù)已提交的數(shù)據(jù),而未提交的數(shù)據(jù)是看不到的。可防止臟讀,但幻讀和不可重復(fù)讀仍可發(fā)生()可重復(fù)讀取RepeatableRead一個(gè)事務(wù)讀取的數(shù)據(jù)在整個(gè)事務(wù)過程中,看到的一直不變,看不到其它事務(wù)對這些數(shù)據(jù)的更新,.可防止臟讀,不可重復(fù)讀,但幻讀可能發(fā)生。序列化Serializable同一DB上的不現(xiàn)事務(wù)只能串行執(zhí)行,不能并發(fā)運(yùn)行。不會發(fā)生臟讀、不可重復(fù)讀和幻讀知識點(diǎn)16:數(shù)據(jù)庫的四種隔離級別介紹IT資訊交流網(wǎng)北京傳智播客教育多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題1、mysql默認(rèn)的隔離級別為Repeatable_Read2、sqlserver默認(rèn)的隔離級別為ReadCommited3、oracle數(shù)據(jù)庫支持READCOMMITTED和SERIALIZABLE兩種事務(wù)隔離性級別,不支持READUNCOMMITTED和REPEATABLEREAD這兩種隔離性級別,Oracle數(shù)據(jù)庫默認(rèn)使用的事務(wù)隔離性級別卻是READCOMMITTED.知識點(diǎn)17:常用數(shù)據(jù)庫默認(rèn)的隔離級別IT資訊交流網(wǎng)多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題設(shè)置當(dāng)前mysql.exe的隔離級別

隔離級需要使用SET命令來設(shè)定其語法如下:

SETTRANSACTIONISOLATIONLEVEL隔離級別隔離級別分為四種:

READUNCOMMITTED|READCOMMITTED |REPEATABLEREAD

|SERIALIZABLE查詢隔離級別

select@@tx_isolation設(shè)置數(shù)據(jù)庫系統(tǒng)的全局的隔離級別隔離級需要使用SET命令來設(shè)定其語法如下:

SETglobalTRANSACTIONISOLATIONLEVEL隔離級別知識點(diǎn)18:設(shè)置數(shù)據(jù)庫的隔離級別IT資訊交流網(wǎng)北京傳智播客教育多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題對于同時(shí)運(yùn)行的多個(gè)事務(wù),當(dāng)這些事務(wù)訪問數(shù)據(jù)庫相同的數(shù)據(jù)時(shí),如果沒有采取必要的隔離機(jī)制,就會產(chǎn)生并發(fā)問題.臟讀:一個(gè)事務(wù)讀取了另一個(gè)事務(wù)改寫但還未提交的數(shù)據(jù),如果這些數(shù)據(jù)被回滾,則讀到的數(shù)據(jù)是無效的。不可重復(fù)讀:在同一事務(wù)中,多次讀取同一數(shù)據(jù)返回的結(jié)果有所不同。換句話說就是,后續(xù)讀取可以讀到另一事務(wù)已提交的更新數(shù)據(jù)??芍貜?fù)讀:在同一事務(wù)中多次讀取數(shù)據(jù)時(shí),能夠保證所讀數(shù)據(jù)一樣,也就是,后續(xù)讀取不能讀到另一事務(wù)已提交的更新數(shù)據(jù)?;米x:一個(gè)事務(wù)讀取了幾行記錄后,另一個(gè)事務(wù)插入一些記錄,幻讀就發(fā)生了。再后來的查詢中,第一個(gè)事務(wù)就會發(fā)現(xiàn)有些原來沒有的記錄。知識點(diǎn)20:數(shù)據(jù)庫并發(fā)操作存在的異常情況IT資訊交流網(wǎng)北京傳智播客教育測試:多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題知識點(diǎn)21:以張三在招商銀行的賬號和存款為例

1、創(chuàng)建一個(gè)銀行賬號Table

CREATETABLEbankaccount( idCHAR(16)NOTNULL,--銀行賬號 usernameNVARCHAR(32)NOTNULL,--用戶 balanceDOUBLE(15,2)NOTNULL,--余額 lastupdateTIMESTAMP)2.準(zhǔn)備數(shù)據(jù)假設(shè)張三在招商銀行北京分行開設(shè)了一個(gè)賬號,并向其中存入了100元--北京分行賬號INSERTINTObankaccount(id,username,balance)VALUES('95555','張三',100.00);IT資訊交流網(wǎng)測試:多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題知識點(diǎn)21:數(shù)據(jù)庫并發(fā)操作存在的異常情況—臟讀設(shè)置數(shù)據(jù)庫的隔離級別:

setglobalTRANSACTIONISOLATIONLEVELREADUNCOMMITTED;業(yè)務(wù)情景:

張三準(zhǔn)備用ATM機(jī)向其北京招行的帳戶匯1000塊錢,在匯之前先用其智能手機(jī)的手機(jī)銀行客戶端查詢到其北京賬戶還剩10000,接著他用ATM機(jī)向其北京帳戶打過去1000,在提示確認(rèn)提交時(shí),他又用手機(jī)查看了一下其帳戶余額竟然為11000。IT資訊交流網(wǎng)測試:多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題知識點(diǎn)21:數(shù)據(jù)庫并發(fā)操作存在的異常情況—不可重復(fù)讀設(shè)置數(shù)據(jù)庫的隔離級別:

setglobalTRANSACTIONISOLATIONLEVELREADCOMMITTED;業(yè)務(wù)情景:

張三用其智能手機(jī)的手機(jī)銀行客戶端查詢其招行帳戶余額為10000元,他沒有馬上退出,去做了一會別的事,在此過程中他老婆在一個(gè)ATM機(jī)上向其帳戶上匯入了1000元,他回來后又刷新了一下余額,竟然為11000元。IT資訊交流網(wǎng)測試:多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題知識點(diǎn)21:數(shù)據(jù)庫并發(fā)操作存在的情況—可重復(fù)讀設(shè)置數(shù)據(jù)庫的隔離級別:

setglobalTRANSACTIONISOLATIONLEVELREPEATABLEREAD;業(yè)務(wù)情景:

張三用其智能手機(jī)的手機(jī)銀行客戶端查詢其招行帳戶余額為99.9元,但他需要100元才能支付搶購,他QQ告知老婆,他老婆立馬在一個(gè)ATM機(jī)上向其帳戶上匯入了100元并打電話告知了張三,他立馬用手機(jī)又刷新了一下余額,竟然還是99.9元.IT資訊交流網(wǎng)測試:多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題知識點(diǎn)21:數(shù)據(jù)庫并發(fā)操作存在的異常情況—幻讀(Magicread)設(shè)置數(shù)據(jù)庫的隔離級別:

setglobalTRANSACTIONISOLATIONLEVELREPEATABLEREAD;業(yè)務(wù)情景:

張三用其智能手機(jī)的手機(jī)銀行客戶端查詢其招行帳戶余額為300元,他準(zhǔn)備用其中的200去搶購一個(gè)商品,在他沒付款之前他的老婆取走100元,接著他也花了200支付了商品,他再次查了一下余額,竟然發(fā)現(xiàn)賬戶里一毛錢都沒有啦!IT資訊交流網(wǎng)測試:多個(gè)事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題知識點(diǎn)21:數(shù)據(jù)庫并發(fā)操作存在的情況— 不能并發(fā)設(shè)置數(shù)據(jù)庫的隔離級別:

setglobalTRANSACTIONISOLATIONLEVELSERIALIZABLE;業(yè)務(wù)情景:

張三用其智能手機(jī)的手機(jī)銀行客戶端查詢其招行帳戶余額為99.9元,但他需要100元才能支付搶購,他QQ告知老婆在線等待,他老婆立馬找到一個(gè)ATM機(jī)準(zhǔn)備向其帳戶上匯入了100元,但錢就是匯不進(jìn)去。IT資訊交流網(wǎng)批量處理---提高處理速度當(dāng)需要成批插入或者更新記錄時(shí)??梢圆捎肑ava的批量更新機(jī)制,這一機(jī)制允許多條語句一次性提交給數(shù)據(jù)庫批量處理。通常情況下比單獨(dú)提交處理更有效率JDBC的批量處理語句包括下面兩個(gè)方法:addBatch(String):添加需要批量處理的SQL語句或是參數(shù);executeBatch();執(zhí)行批量處理語句;通常我們會遇到兩種批量執(zhí)行SQL語句的情況:多條SQL語句的批量處理;一個(gè)SQL語句的批量傳參;知識點(diǎn)24:批量處理JDBC語句提高處理速度

IT資訊交流網(wǎng)多條SQL語句的批量處理Connectioncon=null;Statementstmt=null;try{con=dbManager.getConnection();stmt=con.createStatement();Stringsql=null;Longbegintime=System.currentTimeMillis();for(inti=1;i<5000;i++){sql="insertintoperson(id,name,email)values("+",'name"+i+"','email"+i+"')";stmt.addBatch(sql);if((i+1)%1000==0){//批量處理intarray[]=stmt.executeBatch();//清除stmt中積攢的參數(shù)列表stmt.clearBatch();}}Longendtime=System.currentTimeMillis();System.out.println((endtime-begintime)/1000);IT資訊交流網(wǎng)一個(gè)SQL語句的批量傳參Connectioncon=null;PreparedStatementpstmt=null;con=dbManager.getConnection();Stringsql="insertintoperson(id,name,email)values(?,?,?)";Longbegintime=System.currentTimeMillis();pstmt=con.prepareStatement(sql);for(inti=1;i<100000;i++){pstmt.setInt(1,i);pstmt.setString(2,"name“+i);pstmt.setString(3,"email“+i);pstmt.addBatch();if((i+1)%1000==0){//批量處理pstmt.executeBatch();//清空pstmt中積攢的sqlpstmt.clearBatch();}}Longendtime=System.currentTimeMillis();System.out.println((endtime-begintime)/1000);IT資訊交流網(wǎng)MySQLBLOB類型介紹MySQL中,BLOB是一個(gè)二進(jìn)制大型對象,是一個(gè)可以存儲大量數(shù)據(jù)的容器,它能容納不同大小的數(shù)據(jù)。BLOB類型實(shí)際是個(gè)類型系列(TinyBlob、Blob、MediumBlob和LongBlob),除了在存儲的最大信息量上不同外,他們是等同的。MySQL的四種BLOB類型實(shí)際使用中根據(jù)需要存入的數(shù)據(jù)大小定義不同的BLOB類型。需要注意的是:如果你存儲的文件過大,數(shù)據(jù)庫的性能會下降很多。有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應(yīng)4種BLOB類型,有相同的最大長度和存儲需求知識點(diǎn)25:大對象操作

IT資訊交流網(wǎng)使用JDBC驅(qū)動程序處理元數(shù)據(jù)

Java通過JDBC獲得連接以后,得到一個(gè)Connection對象,可以從這個(gè)對象獲得有關(guān)數(shù)據(jù)庫管理系統(tǒng)的各種信息,包括數(shù)據(jù)庫中的各個(gè)表,表中的各個(gè)列,數(shù)據(jù)類型,觸發(fā)器,存儲過程等各方面的信息。根據(jù)這些信息,JDBC可以訪問一個(gè)事現(xiàn)事先并不了解的數(shù)據(jù)庫。獲取這些信息的方法都是在DatabaseMetaData類的對象上實(shí)現(xiàn)的,而DataBaseMetaData對象是在Connection對象上獲得的。知識點(diǎn)26:使用JDBC驅(qū)動程序處理元數(shù)據(jù)(什么是元數(shù)據(jù))

IT資訊交流網(wǎng)獲取數(shù)據(jù)庫元數(shù)據(jù)DatabaseMetaData類中提供了許多方法用于獲得數(shù)據(jù)源的各種信息,通過這些方法可以非常詳細(xì)的了解數(shù)據(jù)庫的信息:getURL():返回一個(gè)String類對象,代表數(shù)據(jù)庫的URL。getUserName():返回連接當(dāng)前數(shù)據(jù)庫管理系統(tǒng)的用戶名。isReadOnly():返回一個(gè)boolean值,指示數(shù)據(jù)庫是否只允許讀操作。getDatabaseProductName():返回?cái)?shù)據(jù)庫的產(chǎn)品名稱。getDatabaseProductVersion():返回?cái)?shù)據(jù)庫的版本號。getDriverName():返回驅(qū)動驅(qū)動程序的名稱。getDriverVersion():返回驅(qū)動程序的版本號。知識點(diǎn)26:使用JDBC驅(qū)動程序處理元數(shù)據(jù)

IT資訊交流網(wǎng)獲取數(shù)據(jù)庫元數(shù)據(jù)Meta-data:關(guān)于數(shù)據(jù)的數(shù)據(jù),是有關(guān)數(shù)據(jù)庫和數(shù)據(jù)庫表等數(shù)據(jù)庫對象的信息通過Connection的getMetaData()方法獲得包含數(shù)據(jù)庫元數(shù)據(jù)的DatabaseMetaData對象,然后在此對象上調(diào)用相關(guān)的方法獲得對應(yīng)的信息//獲取一個(gè)DatabaseMetaData對象,//該對象包含關(guān)于此Connection對象所連接的數(shù)據(jù)庫的元數(shù)據(jù)。DatabaseMetaDatadmd=conn.getMetaData();System.out.println("數(shù)據(jù)庫名稱"+dmd.getDatabasePr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論