當前位置:首頁 » 編程語言 » jdbc動態sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

jdbc動態sql

發布時間: 2023-07-08 15:56:58

① 真正的Mybatis動態sql —MyBatis Dynamic SQL

這個庫是一個用於生成動態SQL語句的框架。可以將它看作是一個類型安全的sQL模板庫,它提供了對MyBatis3和Spring JDBC模板的額外支持。該庫將生成供MyBatis或Spring使用的格式化的fuL LETE INET、SELECT和UPDATE語句。最常見的用例是生成可以直接由MyBatis使用的語句和一組數學參數。該庫還將生成與Spring JDBC模板兼容的語句和參數對象。該庫通過實現一個類似SQL的DSL來工作,該DSL創建一個對象,該對象包含完整的SQL語句和該語句所需的任何參數。

https://github.com/mybatis/mybatis-dynamic-sql

https://mybatis.org/mybatis-dynamic-sql/docs/introction.html

org.mybatis.dynamic.sql.SqlTable 表定義包括表的實際名稱(包括適當的模式)。如果需要,可以在選擇語句中應用表別名。你的Table應該繼承SqlTable 類。
org. mybatiss .dynamic.sql. sqlcolumn 用於定義在庫中使用的列。應該使用SqlTable中的構建器方法創建SqlColumns。列定義包括:

我們建議使用以下使用模式以提供最大的靈活性。這個模式允許您以「限定」或「非限定」的方式使用表和列名,這看起來像自然的SQL。例如,在下面的列中,一個列可以被稱為 firstName 或 user.firstName 。

該庫將創建用作 MyBatis mapper 輸入的類。這些類包括生成的SQL,以及與生成的SQL匹配的參數集。這兩者都是MyBatis所要求的。這些對象應該是 MyBatis mapper 方法的唯一參數。
(注意: MyBatis Dynamic SQL 不需要XML文件就能工作的很好,但並不意味著不支持XML,畢竟 **MyBatis **最初被設計為是一個 XML 驅動的框架。當你使用關聯查詢,需要復雜的映射,那麼使用XML 與 MyBatis Dynamic SQL 結合起來或者是更好選擇,你的XML或許只需要包含一些)

② 通過JDBC連接oracle資料庫的幾個技巧

java資料庫連接(jdbc)api是一系列能夠讓java編程人員訪問資料庫的介面,各個開發商的介面並不完全相同。以下是一些技巧,這些技巧能夠使我們更好地發揮系統的性能和實現更多的功能。

1、在客戶端軟體開發中使用thin驅動程序

在開發java軟體方面,oracle的資料庫提供了四種類型的驅動程序,二種用於應用軟體、applets、servlets等客戶端軟體,另外二種用於資料庫中的java存儲過程等伺服器端軟體。在客戶機端軟體的開發中,我們可以選擇oci驅動程序或thin驅動程序。oci驅動程序利用java本地化介面(jni),通過oracle客戶端軟體與資料庫進行通訊。thin驅動程序是純java驅動程序,它直接與資料庫進行通訊。為了獲得最高的性能嫌塵,oracle建議在客戶端軟體的開發中使用oci驅動程序,這似乎是正確的。但我建議使用thin驅動程序,因為通過多次測試發現,在通常情況下,thin驅動程序的性能都超過了oci驅動程序。

2、關閉自動提交功能,提高系統性能

在第一次建立與資料庫的連接時,在預設情況下,連接是在自動提交模式下的。為了獲得更好的性能,可以通過調用帶布爾值false參數的connection類的setautocommit()方法關閉自動提交功能,如下所示:

conn.setautocommit(false);

值得注意的是,一旦關閉了自動提交功能,我們就需要通過調用connection類的commit()和rollback()方法來人工的方式對事務進行管理。

3、在動態sql或有時間限制的命令中使用statement對象

在執行sql命令時,我們有二種選舉明擇:可以使用preparedstatement對象,也可以使用statement對象。無論多少次地使用同一個sql命令,preparedstatement都只對它解析和編譯一次。當使用statement對象時,每次執行一個sql命令時,都會對它進行解析和芹答禪編譯。這可能會使你認為,使用preparedstatement對象比使用statement對象的速度更快。然而,我進行的測試表明,在客戶端軟體中,情況並非如此。因此,在有時間限制的sql操作中,除非成批地處理sql命令,我們應當考慮使用statement對象。

此外,使用statement對象也使得編寫動態sql命令更加簡單,因為我們可以將字元串連接在一起,建立一個有效的sql命令。因此,我認為,statement對象可以使動態sql命令的創建和執行變得更加簡單。

4、利用helper函數對動態sql命令進行格式化

在創建使用statement對象執行的動態sql命令時,我們需要處理一些格式化方面的問題。例如,如果我們想創建一個將名字o'reilly插入表中的sql命令,則必須使用二個相連的“''”號替換o'reilly中的“'”號。完成這些工作的最好的方法是創建一個完成替換操作的helper方法,然後在連接字元串心服用公式表達一個sql命令時,使用創建的helper方法。與此類似的是,我們可以讓helper方法接受一個date型的值,然後讓它輸出基於oracle的to_date()函數的字元串表達式。

5、利用preparedstatement對象提高資料庫的總體效率

在使用preparedstatement對象執行sql命令時,命令被資料庫進行解析和編譯,然後被放到命令緩沖區。然後,每當執行同一個preparedstatement對象時,它就會被再解析一次,但不會被再次編譯。在緩沖區中可以發現預編譯的命令,並且可以重新使用。在有大量用戶的企業級應用軟體中,經常會重復執行相同的sql命令,使用preparedstatement對象帶來的編譯次數的減少能夠提高資料庫的總體性能。如果不是在客戶端創建、預備、執行preparedstatement任務需要的時間長於statement任務,我會建議在除動態sql命令之外的所有情況下使用preparedstatement對象。

6、在成批處理重復的插入或更新操作中使用preparedstatement對象

如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時間。oracle提供的statement和 callablestatement並不真正地支持批處理,只有preparedstatement對象才真正地支持批處理。我們可以使用addbatch()和executebatch()方法選擇標準的jdbc批處理,或者通過利用preparedstatement對象的setexecutebatch()方法和標準的executeupdate()方法選擇速度更快的oracle專有的方法。要使用oracle專有的批處理機制,可以以如下所示的方式調用setexecutebatch():

preparedstatement pstmt3d null;
try {
((oraclepreparedstatement)
pstmt).setexecutebatch(30);
...
pstmt.executeupdate();
}

調用setexecutebatch()時指定的值是一個上限,當達到該值時,就會自動地引發sql命令執行,標準的executeupdate()方法就會被作為批處理送到資料庫中。我們可以通過調用preparedstatement類的sendbatch()方法隨時傳輸批處理任務。

7、使用oracle locator方法插入、更新大對象(lob)

oracle的preparedstatement類不完全支持blob和clob等大對象的處理,尤其是thin驅動程序不支持利用preparedstatement對象的setobject()和setbinarystream()方法設置blob的值,也不支持利用setcharacterstream()方法設置clob的值。只有locator本身中的方法才能夠從資料庫中獲取lob類型的值。可以使用preparedstatement對象插入或更新lob,但需要使用locator才能獲取lob的值。由於存在這二個問題,因此,我建議使用locator的方法來插入、更新或獲取lob的值。

8、使用sql92語法調用存儲過程

在調用存儲過程時,我們可以使用sql92或oracle pl/sql,由於使用oracle pl/sql並沒有什麼實際的好處,而且會給以後維護你的應用程序的開發人員帶來麻煩,因此,我建議在調用存儲過程時使用sql92。

9、使用object sql將對象模式轉移到資料庫中

既然可以將oracle的資料庫作為一種面向對象的資料庫來使用,就可以考慮將應用程序中的面向對象模式轉到資料庫中。目前的方法是創建java bean作為偽裝的資料庫對象,將它們的屬性映射到關系表中,然後在這些bean中添加方法。盡管這樣作在java中沒有什麼問題,但由於操作都是在資料庫之外進行的,因此其他訪問資料庫的應用軟體無法利用對象模式。如果利用oracle的面向對象的技術,可以通過創建一個新的資料庫對象類型在資料庫中模仿其數據和操作,然後使用jpublisher等工具生成自己的java bean類。如果使用這種方式,不但java應用程序可以使用應用軟體的對象模式,其他需要共享你的應用中的數據和操作的應用軟體也可以使用應用軟體中的對象模式。

③ java中使用JDBC完成資料庫操作的基本步驟是什麼

創建一個以JDBC連接資料庫的程序,包含7個步驟: x0dx0a 1、載入JDBC驅動程序: x0dx0a 在連接資料庫之前,首先要載入想要連接的資料庫的驅動到JVM(Java虛擬機), x0dx0a 這通過java.lang.Class類的靜態方法forName(String className)實現。 x0dx0a 例如: x0dx0a try{ x0dx0a //載入MySql的驅動類 x0dx0a Class.forName("com.mysql.jdbc.Driver") ; x0dx0a }catch(ClassNotFoundException e){ x0dx0a System.out.println("找不到驅動程序類 ,載入驅動失敗!"); x0dx0a e.printStackTrace() ; x0dx0a } x0dx0a 成功載入後,會將Driver類的實例注冊到DriverManager類中。 x0dx0a 2、提供JDBC連接的URL x0dx0a •連接URL定義了連接資料庫時的協議、子協議、數據源標識。 x0dx0a •書寫形式:協議:子協議:數據源標識 x0dx0a 協議:在JDBC中總是以jdbc開始 x0dx0a 子協議:是橋連接的驅動程序或是資料庫管理系統名稱。 x0dx0a 數據源標識:標記找到資料庫來源的地址與連接埠。 x0dx0a 例如:(MySql的連接URL) x0dx0a jdbc:mysql: x0dx0a //localhost:3306/test?useUnicode=true&characterEncoding=gbk ; x0dx0a useUnicode=true:表示使用Unicode字元集。如果characterEncoding設置為 x0dx0a gb2312或GBK,本參數必須設置為true 。characterEncoding=gbk:字元編碼方式。 x0dx0a 3、創建資料庫的連接 x0dx0a •要連接資料庫,需要向java.sql.DriverManager請求並獲得Connection對象, x0dx0a 該對象就代表一個資料庫的連接。 x0dx0a •使用DriverManager的getConnectin(String url , String username , x0dx0a String password )方法傳入指定的欲連接的資料庫的路徑、資料庫的用戶名和 x0dx0a 密碼來獲得。 x0dx0a 例如: x0dx0a //連接MySql資料庫,用戶名和密碼都是root x0dx0a String url = "jdbc:mysql://localhost:3306/test" ; x0dx0a String username = "root" ; x0dx0a String password = "root" ; x0dx0a try{ x0dx0a Connection con = x0dx0a DriverManager.getConnection(url , username , password ) ; x0dx0a }catch(SQLException se){ x0dx0a System.out.println("資料庫連接失敗!"); x0dx0a se.printStackTrace() ; x0dx0a } x0dx0a 4、創建一個Statement x0dx0a •要執行SQL語句,必須獲得java.sql.Statement實例,Statement實例分為以下3 x0dx0a 種類型: x0dx0a 1、執行靜態SQL語句。通常通過Statement實例實現。 x0dx0a 2、執行動態SQL語句。通常通過PreparedStatement實例實現。 x0dx0a 3、執行資料庫存儲過程。通常通過CallableStatement實例實現。 x0dx0a 具體的實現方式: x0dx0a Statement stmt = con.createStatement() ; x0dx0a PreparedStatement pstmt = con.prepareStatement(sql) ; x0dx0a CallableStatement cstmt = x0dx0a con.prepareCall("{CALL demoSp(? , ?)}") ; x0dx0a 5、執行SQL語句 x0dx0a Statement介面提供了三種執行SQL語句的方法:executeQuery 、executeUpdate x0dx0a 和execute x0dx0a 1、ResultSet executeQuery(String sqlString):執行查詢資料庫的SQL語句 x0dx0a ,返回一個結果集(ResultSet)對象。 x0dx0a 2、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或 x0dx0a DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等 x0dx0a 3、execute(sqlString):用於執行返回多個結果集、多個更新計數或二者組合的 x0dx0a 語句。 x0dx0a 具體實現的代碼: x0dx0a ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; x0dx0a int rows = stmt.executeUpdate("INSERT INTO ...") ; x0dx0a boolean flag = stmt.execute(String sql) ; x0dx0a 6、處理結果 x0dx0a 兩種情況: x0dx0a 1、執行更新返回的是本次操作影響到的記錄數。 x0dx0a 2、執行查詢返回的結果是一個ResultSet對象。 x0dx0a • ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些 x0dx0a 行中數據的訪問。 x0dx0a • 使用結果集(ResultSet)對象的訪問方法獲取數據: x0dx0a while(rs.next()){ x0dx0a String name = rs.getString("name") ; x0dx0a String pass = rs.getString(1) ; // 此方法比較高效 x0dx0a } x0dx0a (列是從左到右編號的,並且從列1開始) x0dx0a 7、關閉JDBC對象 x0dx0a 操作完成以後要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲 x0dx0a 明順序相反: x0dx0a 1、關閉記錄集 x0dx0a 2、關閉聲明 x0dx0a 3、關閉連接對象 x0dx0a if(rs != null){ // 關閉記錄集 x0dx0a try{ x0dx0a rs.close() ; x0dx0a }catch(SQLException e){ x0dx0a e.printStackTrace() ; x0dx0a } x0dx0a } x0dx0a if(stmt != null){ // 關閉聲明 x0dx0a try{ x0dx0a stmt.close() ; x0dx0a }catch(SQLException e){ x0dx0a e.printStackTrace() ; x0dx0a } x0dx0a } x0dx0a if(conn != null){ // 關閉連接對象 x0dx0a try{ x0dx0a conn.close() ; x0dx0a }catch(SQLException e){ x0dx0a e.printStackTrace() ; x0dx0a } x0dx0a }