jdbc提升

 

readmehtml

課程回顧JDBC第一天

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。
相關文章
相關標籤/搜索