註冊數據庫驅動。java
創建數據庫鏈接。mysql
建立一個Statement。sql
執行SQL語句。數據庫
處理結果集。緩存
關閉數據庫鏈接tomcat
代碼以下安全
區別:服務器
PreparedStatement是預編譯的SQL語句,效率高於Statement。oracle
PreparedStatement支持?操做符,相對於Statement更加靈活。大數據
PreparedStatement能夠防止SQL注入,安全性高於Statement。
CallableStatement適用於執行存儲過程。
最好的辦法是利用sql語句進行分頁,這樣每次查詢出的結果集中就只包含某頁的數據內容。
工做原理:
JAVA EE服務器啓動時會創建必定數量的池鏈接,並一直維持很多於此數目的池鏈接。客戶端程序須要鏈接時,池驅動程序會返回一個未使用的池鏈接並將其表記爲忙。若是當前沒有空閒鏈接,池驅動程序就新建必定數量的鏈接,新建鏈接的數量有配置參數決定。當使用的池鏈接調用完成後,池驅動程序將此鏈接表記爲空閒,其餘調用就可使用這個鏈接。
實現方案:鏈接池使用集合來進行裝載,返回的Connection是原始Connection的代理,代理Connection的close方法,當調用close方法時,不是真正關鏈接,而是把它代理的Connection對象放回到鏈接池中,等待下一次重複利用。
Connection類中提供了4個事務處理方法:
setAutoCommit(Boolean autoCommit):設置是否自動提交事務,默認爲自動提交,即爲true,經過設置false禁止自動提交事務;
commit():提交事務;
rollback():回滾事務.
savepoint:保存點
注意:savepoint不會結束當前事務,普通提交和回滾都會結束當前事務的
Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost/test"; Stirng user='root'; String password='root'; Connection conn = DriverManager.getConnection(url,user,password);
JDBC的髒讀是什麼?哪一種數據庫隔離級別能防止髒讀?
髒讀:一個事務讀取到另一個事務未提交的數據
例子:A向B轉帳,A執行了轉帳語句,但A尚未提交事務,B讀取數據,發現本身帳戶錢變多了!B跟A說,我已經收到錢了。A回滾事務【rollback】,等B再查看帳戶的錢時,發現錢並無多。
下面的三種個隔離級別均可以防止:
Serializable【TRANSACTION_SERIALIZABLE】
Repeatable read【TRANSACTION_REPEATABLE_READ】
Read committed【TRANSACTION_READ_COMMITTED】
什麼是幻讀,哪一種隔離級別能夠防止幻讀?
是指在一個事務內讀取到了別的事務插入的數據,致使先後讀取不一致。
只有TRANSACTION_SERIALIZABLE隔離級別才能防止產生幻讀。
JDBC的DriverManager是用來作什麼的?
JDBC的DriverManager是一個工廠類,咱們經過它來建立數據庫鏈接。
當JDBC的Driver類被加載進來時,它會本身註冊到DriverManager類裏面
而後咱們會把數據庫配置信息傳成DriverManager.getConnection()方法,DriverManager會使用註冊到它裏面的驅動來獲取數據庫鏈接,並返回給調用的程序。
在查詢數據庫後會返回一個ResultSet,它就像是查詢結果集的一張數據表。
ResultSet對象維護了一個遊標,指向當前的數據行。開始的時候這個遊標指向的是第一行。若是調用了ResultSet的next()方法遊標會下移一行,若是沒有更多的數據了,next()方法會返回false。能夠在for循環中用它來遍歷數據集。
默認的ResultSet是不能更新的,遊標也只能往下移。也就是說你只能從第一行到最後一行遍歷一遍。不過也能夠建立能夠回滾或者可更新的ResultSet
當生成ResultSet的Statement對象要關閉或者從新執行或是獲取下一個ResultSet的時候,ResultSet對象也會自動關閉。
能夠經過ResultSet的getter方法,傳入列名或者從1開始的序號來獲取列數據。
DataSource即數據源,它是定義在javax.sql中的一個接口,跟DriverManager相比,它的功能要更強大。咱們能夠用它來建立數據庫鏈接,固然驅動的實現類會實際去完成這個工做。除了能建立鏈接外,它還提供了以下的特性:
緩存PreparedStatement以便更快的執行
能夠設置鏈接超時時間
提供日誌記錄的功能
ResultSet大小的最大閾值設置
經過JNDI的支持,能夠爲servlet容器提供鏈接池的功能
Tomcat服務器也給咱們提供了鏈接池,內部其實就是DBCP
步驟:
在META-INF目錄下配置context.xml文件【文件內容能夠在tomcat默認頁面的 JNDI Resources下Configure Tomcat's Resource Factory找到】
導入Mysql或oracle開發包到tomcat的lib目錄下
初始化JNDI->獲取JNDI容器->檢索以XXX爲名字在JNDI容器存放的鏈接池
context.xml文件的配置:
<Context>
<Resource name="jdbc/EmployeeDB"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/zhongfucheng"
maxActive="8"
maxIdle="4"/>
</Context>
try { //初始化JNDI容器 Context initCtx = new InitialContext(); //獲取到JNDI容器 Context envCtx = (Context) initCtx.lookup("java:comp/env"); //掃描以jdbc/EmployeeDB名字綁定在JNDI容器下的鏈接池 DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); Connection conn = ds.getConnection(); System.out.println(conn); }
若是用DataSource來獲取鏈接的話,一般獲取鏈接的代碼和驅動特定的DataSource是緊耦合的。另外,除了選擇DataSource的實現類,剩下的代碼基本都是同樣的。
Apache的DBCP就是用來解決這些問題的,它提供的DataSource實現成爲了應用程序和不一樣JDBC驅動間的一個抽象層。Apache的DBCP庫依賴commons-pool庫,因此要確保它們都在部署路徑下。
使用DBCP數據源的步驟:
導入兩個jar包【Commons-dbcp.jar和Commons-pool.jar】
讀取配置文件
獲取BasicDataSourceFactory對象
建立DataSource對象
JDBC中存在哪些不一樣類型的鎖?
從廣義上講,有兩種鎖機制來防止多個用戶同時操做引發的數據損壞。
樂觀鎖——只有當更新數據的時候纔會鎖定記錄。
悲觀鎖——從查詢到更新和提交整個過程都會對數據記錄進行加鎖。
java.util.Date和java.sql.Date有什麼區別?
java.util.Date包含日期和時間,而java.sql.Date只包含日期信息,而沒有具體的時間信息。若是你想把時間信息存儲在數據庫裏,能夠考慮使用Timestamp或者DateTime字段
clob和blob
clob用於存儲大文本
blob用於存儲二進制數據
MySQL存儲大文本是用Test【代替clob】,Test又分爲4類
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
同理blob也有這4類