readmehtml
1.JDBC的簡介:SUN公司提供,操做數據庫的一套規範(一組接口),實現類是數據庫的生產商。 2.驅動包提供的,使用什麼數據庫,相應的驅動包(jar包) 3.JDBC開發的入門步驟 * 註冊驅動 -- DriverManager * 獲取連接 -- Connection * 獲取執行SQL語句 -- Statement (PreparedStatement -- 預編譯) * 若是有查詢結果 -- ResultSet * 釋放資源 4.DriverManager * 註冊驅動 * Class.forName("com.mysql.jdbc.Driver"); * 獲取連接 * getConnection(url,username,password) * url: jdbc:mysql://localhost:3306/數據庫 5.Connection接口 * 獲取執行SQL對象 * Statement * PreparedStatement -- 預編譯 防止SQL注入 * 管理事物 * set autocommit(false) -- 設置事物不自動提交 * commit() -- 提交 * rollback() -- 回滾 6.Statement接口 * 執行SQL * executeQuery(sql) -- 查詢語句(ResultSet) * executeUpdate(sql) -- 執行增刪改語句(int) * 批處理 7.ResultSet接口 * 有一個遊標默認指向第一行數據以前。 * 默認只能向下移動(rs.next()) * 獲取數據 (getXXX(int) getXXX(String)) * 設置滾動的結果集 8.釋放資源 * 步驟 9.DAO的開發模式 * SUN提供的開發模式 * WEB層 -- 業務層 -- 持久層 10.登錄的案例(SQL注入) * 產生:拼接SQL的字符串 * PreparedStatement -- 編寫SQL語句的時候使用?佔位符代替的參數,預編譯 11.PreparedStatement完成DAO單表的增刪改查的操做 12.MyJdbcUtil的工具類 * 註冊驅動 * 獲取連接 * 釋放資源 13.大數據 14.批處理
事物java
1.什麼是事物:一組邏輯上的操做,要麼全都成功,要麼全都失敗。 2.模擬事物的操做 create database day18; use day18; create table t_account( id int primary key auto_increment, username varchar(30), money double ); insert into t_account values (null,'聰聰',10000); insert into t_account values (null,'美美',10000); insert into t_account values (null,'小鳳',10000); insert into t_account values (null,'如花',10000); insert into t_account values (null,'邦邦',10000);
MySQL使用事物mysql
1.在MySQL使用命令 start transaction; -- 開啓一個事物 sql1... sql2... commit; -- 把事物提交了 rollback; -- 把事物回滾了 2.MySQL數據庫中國,事物是默認提交的。 * show variables like '%commit%'; 能夠經過該命令查看數據庫是事物是不是默認提交的。 * 設置MySQL不讓默認提交的 (set autocommit = off或者0;) sql1.. sql2.. commit; -- 把事物提交了 rollback; -- 把事物回滾了 3.進行測試 * 第一種方式 * 開啓事物 * start transaction; * update t_account set money = money - 1000 where username = '聰聰'; * update t_account set money = money + 1000 where username = '美美'; * 提交或者回滾 * commit; 或者 rollback; * 測試第二種 * 設置MySQL不讓默認提交 * set autocommit = 0或者off; * update t_account set money = money - 1000 where username = '聰聰'; * update t_account set money = money + 1000 where username = '美美'; * 提交或者回滾 * commit; 或者 rollback;
JDBC代碼中使用事物git
1.哪一個對象能夠操做事物?使用Connection接口操做事物。 * void setAutoCommit(boolean autoCommit) -- 設置默認不默認提交 * void commit() -- 提交事物 * void rollback() -- 回滾事物
保存點github
1.Savepoint sp = conn.setSavepoint(); 2.conn.rollback(sp); 3.回滾到保存點的位置,事物沒有結束,必須還要提交或者回滾事物才結束。
事物的特性(面試)web
1.原子性 :強調事物的不可分隔特性。 2.一致性 :強調數據的完整性保存一致。 3.隔離性 :強調是的一個事物的執行,不該該受到另外的事物的打擾。 4.持久性 :強調是事物結束(提交或者回滾),數據永久的保存到數據庫中。
不考慮隔離性,產生一些問題面試
1.髒讀 :一個事物讀取到了另外一個事物未提交的數據 2.不可重複讀 :一個事物度讀取了(10000),另一個事物作了修改的操做,提交了。第一個事物又作了一次查詢,此次的查詢結果變成了12000,產生了不可重複讀。只要是在一個事物中,屢次的查詢結果必須是一致的。 3.虛讀(幻讀) :一個事物度讀取了(10000),另一個事物作了插入的操做,提交了。第一個事物又作了一次查詢,此次的查詢結果變成了12000,產生了不可重複讀。只要是在一個事物中,屢次的查詢結果必須是一致的。
設置事物的隔離級別sql
1.read uncommitted :未提交讀 髒讀、不可重複讀、虛讀均可能發生 2.read committed :提交讀 避免髒讀,可是不可重複讀和虛讀有可能發生 3.repeatable read :可重複讀 避免髒讀和不可重複讀,可是虛讀有可能發生 4.serializable :避免髒讀、不可重複讀、虛讀 * 安全性:read uncommitted < read committed < repeatable read < serializable * 效率:read uncommitted > read committed > repeatable read > serializable * 在數據庫的設置隔離級別中,根據安全性和效率考慮,確定不會用read uncommitted和serializable * 在MySQL中默認的隔離級別:repeatable read * 在Oracle中默認的隔離級別:read committed
演示上述過程的發生和解決方案數據庫
* 查詢數據庫的隔離級別 select @@tx_isolation * 設置數據庫的隔離級別 set session transaction isolation level XXX; (XXX表明上述4種級別) 1.測試髒讀 2.開啓兩個窗口A窗口和B窗口 3.分別登錄MySQL數據庫,使用day18數據庫。 4.設置隔離級別 * set session transaction isolation level read uncommitted; 5.在AB兩個窗口中分別開啓事物 * start transaction; 6.在B窗口中完成一些操做(轉帳的操做) * update t_account set money = money - 1000 where username = '聰聰'; * update t_account set money = money + 1000 where username = '美美'; * 提交了嗎?沒有提交!! 7.在A窗口作查詢的操做 * select * from t_account; 8.產生了髒讀
避免髒讀和演示不可重複讀canvas
1.設置A窗口的隔離級別 * set session transaction isolation level read committed; 2.在AB兩個窗口中分別開啓事物 * start transaction; 3.在B窗口中完成一些操做(轉帳的操做) * update t_account set money = money - 1000 where username = '聰聰'; * update t_account set money = money + 1000 where username = '美美'; 4.在A窗口中 * select * from t_account; 5.避免了髒讀,產生了不可重複讀
避免不可重複讀
1.設置A窗口的隔離級別 * set session transaction isolation level repeatable read; 2.在AB兩個窗口中分別開啓事物 * start transaction; 3.在B窗口中完成一些操做(轉帳的操做) * update t_account set money = money - 1000 where username = '聰聰'; * update t_account set money = money + 1000 where username = '美美'; 4.在A窗口中 * select * from t_account; 5.在A窗口中,結束事物,在作查詢 * 查詢的結果是最新的結果 6.總結:避免了髒讀和不可重複讀
演示serializable隔離級別
1.設置A窗口的隔離級別 * set session transaction isolation level serializable; 2.在AB兩個窗口中分別開啓事物 * start transaction; 3.在B窗口中添加一條數據 * insert into t_account values (null,'冠西',10000); 4.在A窗口中作查詢的操做 * select * from t_account;
在JDBC中設置隔離級別(瞭解)
* 在在Connection接口中提供了常量,這寫常量分別表明不一樣的隔離級別 static int TRANSACTION_READ_UNCOMMITTED :指示能夠發生髒讀 (dirty read)、不可重複讀和虛讀 (phantom read) 的常量。 static int TRANSACTION_READ_COMMITTED :指示不能夠發生髒讀的常量;不可重複讀和虛讀能夠發生。 static int TRANSACTION_REPEATABLE_READ :指示不能夠發生髒讀和不可重複讀的常量;虛讀能夠發生。 static int TRANSACTION_SERIALIZABLE :指示不能夠發生髒讀、不可重複讀和虛讀的常量。 * 經過方法來進行設置,在Connection接口提供了一個方法 * void setTransactionIsolation(int level)
數據庫鏈接池
1.爲何要有鏈接池:建立和銷燬是銷燬時間的,鏈接池初始化的時候建立幾個鏈接。 二、鏈接池池參數(開發自定義的鏈接池) 初始大小:10個 最小空閒鏈接數:3個 增量:一次建立的最小單位(5個) 最大空閒鏈接數:12個 最大鏈接數:20個 最大的等待時間:1000毫秒 2.使用鏈接池設置4個大參數(用戶給出) * 驅動類的包名+類 com.mysql.jdbc.Driver * url jdbc:mysql:///day18 * username root * passowrd root 3.怎麼使用鏈接池對象 * 獲取連接的方法
自定義數據庫鏈接池
1.實現DataSource接口 2.重寫幾個方法。 3.自定義的數據庫的鏈接池存在哪些問題? * 開源的鏈接池解決這一類的問題。 4.不能使用DataSource接口構造 5.歸還連接的方法 public void addBack(Connection conn){ // 添加到集合中 connlist.add(conn); } 6.若是能把close()加強了,變成歸還的方法
裝飾者模式(加強某個類中的方法)
1.目的:加強某個類中的某個方法,有哪些方式? * 繼承 :你須要知道它爹是誰? * 裝飾者的模式(加強Connection接口的實現類(還不知道名字,起個名字 小聰),中的close()方法) * 加強的類(本身來寫)和被加強的類(小聰)必須實現相同的接口。 * 在加強的類中能獲取到被加強類的引用。 * 動態代理
開源數據庫鏈接池
1.這些開源的鏈接池已經加強了close方法,所有都是歸還。
DBCP鏈接池
1.導入jar包。 * commons-dbcp-1.4.jar * commons-pool-1.5.6.jar 2.開發入門 * 須要手動設置連接的參數(必須得設置4大參數) * BasicDataSource * 讀取配置文件的方式(properties文件) * BasicDataSourceFactory 3.其餘的配置文件(課後看)
C3P0鏈接池
1.導入jar包 * c3p0-0.9.1.2.jar 2.使用 * ComboPooledDataSource * 設置參數 3.C3P0默認讀取一個XML的配置文件(c3p0-config.xml),文件存放在src的目錄下。 4.在c3p0-config.xml文件編寫配置(4大參數)
Tomcat內置鏈接池(配置)
1.介紹Tomcat內置在鏈接池。Tomcat管理鏈接池,只要配置信息。 2.介紹<Context>的配置某個位置 tomcat/conf/context.xml -- 被tomcat下的全部的虛擬主機、虛擬路徑訪問. tomcat/conf/Catalina/localhost/context.xml -- 被tomcat下的localhost虛擬主機下的全部虛擬路徑訪問. 工程下/META-INF/context.xml -- 被當前工程所訪問. 3.在context.xml須要配置什麼內容? <Context> <Resource name="jdbc/EmployeeDB" auth="Container" type="javax.sql.DataSource" username="root" password="123" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql:///day18" maxActive="8" maxIdle="4"/> </Context> 4.將mysql驅動包copy到tomcat/lib下 5.類必須是運做在Tomcat容器中才能夠訪問.Servlet/JSP
事物加在service或者DAO層
1.事物的解決方案有兩種 * 經過參數的方式向下傳遞 * 把conn綁定到當前的線程中 2.ThreadLocal類底層維護Map集合。默認把當前的線程做爲Map的key。