JDBC簡介

JDBC操做數據庫的步驟 ?

  1. 註冊數據庫驅動。java

  2. 創建數據庫鏈接。mysql

  3. 建立一個Statement。sql

  4. 執行SQL語句。數據庫

  5. 處理結果集。緩存

  6. 關閉數據庫鏈接tomcat

代碼以下安全

 

 

 

JDBC中的Statement 和PreparedStatement,CallableStatement的區別?

區別:服務器

  • PreparedStatement是預編譯的SQL語句,效率高於Statement。oracle

  • PreparedStatement支持?操做符,相對於Statement更加靈活。大數據

  • PreparedStatement能夠防止SQL注入,安全性高於Statement。

  • CallableStatement適用於執行存儲過程。

JDBC中大數據量的分頁解決方法?

最好的辦法是利用sql語句進行分頁,這樣每次查詢出的結果集中就只包含某頁的數據內容。

 

說說數據庫鏈接池工做原理和實現方案?

工做原理:

  • JAVA EE服務器啓動時會創建必定數量的池鏈接,並一直維持很多於此數目的池鏈接。客戶端程序須要鏈接時,池驅動程序會返回一個未使用的池鏈接並將其表記爲忙。若是當前沒有空閒鏈接,池驅動程序就新建必定數量的鏈接,新建鏈接的數量有配置參數決定。當使用的池鏈接調用完成後,池驅動程序將此鏈接表記爲空閒,其餘調用就可使用這個鏈接。

實現方案:鏈接池使用集合來進行裝載,返回的Connection是原始Connection的代理,代理Connection的close方法,當調用close方法時,不是真正關鏈接,而是把它代理的Connection對象放回到鏈接池中,等待下一次重複利用。

Java中如何進行事務的處理?

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);

    execute,executeQuery,executeUpdate的區別是什麼?

  • JDBC的髒讀是什麼?哪一種數據庫隔離級別能防止髒讀?

    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的DriverManager是一個工廠類,咱們經過它來建立數據庫鏈接。

  • 當JDBC的Driver類被加載進來時,它會本身註冊到DriverManager類裏面

  • 而後咱們會把數據庫配置信息傳成DriverManager.getConnection()方法,DriverManager會使用註冊到它裏面的驅動來獲取數據庫鏈接,並返回給調用的程序

  • JDBC的ResultSet是什麼? ##

    • 在查詢數據庫後會返回一個ResultSet,它就像是查詢結果集的一張數據表。

    • ResultSet對象維護了一個遊標,指向當前的數據行。開始的時候這個遊標指向的是第一行。若是調用了ResultSet的next()方法遊標會下移一行,若是沒有更多的數據了,next()方法會返回false。能夠在for循環中用它來遍歷數據集。

    • 默認的ResultSet是不能更新的,遊標也只能往下移。也就是說你只能從第一行到最後一行遍歷一遍。不過也能夠建立能夠回滾或者可更新的ResultSet

    • 當生成ResultSet的Statement對象要關閉或者從新執行或是獲取下一個ResultSet的時候,ResultSet對象也會自動關閉。

    • 能夠經過ResultSet的getter方法,傳入列名或者從1開始的序號來獲取列數據。

  JDBC的DataSource是什麼,有什麼好處

  DataSource即數據源,它是定義在javax.sql中的一個接口,跟DriverManager相比,它的功能要更強大。咱們能夠用它來建立數據庫鏈接,固然驅動的實現類會實際去完成這個工做。除了能建立鏈接外,它還提供了以下的特性:

  • 緩存PreparedStatement以便更快的執行

  • 能夠設置鏈接超時時間

  • 提供日誌記錄的功能

  • ResultSet大小的最大閾值設置

  • 經過JNDI的支持,能夠爲servlet容器提供鏈接池的功能

如何經過JDBC的DataSource和Apache Tomcat的JNDI來建立鏈接池?

Tomcat服務器也給咱們提供了鏈接池,內部其實就是DBCP

步驟:

  1. 在META-INF目錄下配置context.xml文件【文件內容能夠在tomcat默認頁面的 JNDI Resources下Configure Tomcat's Resource Factory找到】

  2. 導入Mysql或oracle開發包到tomcat的lib目錄下

  3. 初始化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);

        } 

Apache的DBCP是什麼?

若是用DataSource來獲取鏈接的話,一般獲取鏈接的代碼和驅動特定的DataSource是緊耦合的。另外,除了選擇DataSource的實現類,剩下的代碼基本都是同樣的。

Apache的DBCP就是用來解決這些問題的,它提供的DataSource實現成爲了應用程序和不一樣JDBC驅動間的一個抽象層。Apache的DBCP庫依賴commons-pool庫,因此要確保它們都在部署路徑下。

使用DBCP數據源的步驟:

  1. 導入兩個jar包【Commons-dbcp.jar和Commons-pool.jar】

  2. 讀取配置文件

  3. 獲取BasicDataSourceFactory對象

  4. 建立DataSource對象

JDBC中存在哪些不一樣類型的鎖?

JDBC中存在哪些不一樣類型的鎖?

從廣義上講,有兩種鎖機制來防止多個用戶同時操做引發的數據損壞。

  • 樂觀鎖——只有當更新數據的時候纔會鎖定記錄

  • 悲觀鎖——從查詢到更新和提交整個過程都會對數據記錄進行加鎖。

java.util.Date和java.sql.Date有什麼區別?

java.util.Date和java.sql.Date有什麼區別?

java.util.Date包含日期和時間,而java.sql.Date只包含日期信息,而沒有具體的時間信息。若是你想把時間信息存儲在數據庫裏,能夠考慮使用Timestamp或者DateTime字段

處理大文本和二進制數據

clob和blob

  • clob用於存儲大文本

  • blob用於存儲二進制數據


MYSQL

MySQL存儲大文本是用Test【代替clob】,Test又分爲4類

  • TINYTEXT

  • TEXT

  • MEDIUMTEXT

  • LONGTEXT

同理blob也有這4類

相關文章
相關標籤/搜索