java之資料庫相關
這篇還是在回顧知識。主要是關於java連線Sqlserver2012資料庫的一些方式記錄,以便以後查詢。
十一之內複習完這些知識就可以新學Hibernate啦(*^▽^*)
1.普通方式
注意,在連線資料庫之前要匯入JDBC驅動。因為我用的是sqlserver,所以我匯入了sqljdbc4.jar
import java.sql.*; import java.util.ResourceBundle; //注意:dbinfo.properties要和該載入檔案放到一個目錄下,不用寫全稱,只需要寫dbinfo即可 public class DBUtils { private static String driverClass; private static String url; static { //此物件是用來載入properties檔案資料的 ResourceBundle rb = ResourceBundle.getBundle("dbinfo"); driverClass = rb.getString("driverClass"); url = rb.getString("url"); try { Class.forName(driverClass); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws Exception { returnDriverManager.getConnection(url); } public static void closeAll(ResultSet resultSe, Statement statement, Connection connection){ if (resultSe != null){ try { resultSe.close(); } catch (SQLException e) { e.printStackTrace(); } } //resultSe = null; if (statement != null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } //statement = null; if (connection != null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } // connection = null; } } 連線程式碼
driverClass=com.microsoft.sqlserver.jdbc.SQLServerDriver url=jdbc:sqlserver://localhost:1433;databaseName=你的資料庫名字;username=使用者名稱;password=密碼 dbinfo.properties
2.DBCP連線
需匯入commons-dbcp-1.4.jar,commons-pool-1.5.6.jar。dbcpconfig.properties裡面有關於執行緒池的內容。
1 import org.apache.commons.dbcp.BasicDataSourceFactory; 2 import javax.sql.DataSource; 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.util.Properties; 8 9 public class DBCPUtils { 10private static DataSource ds = null; 11static { 12Properties prop = new Properties(); 13try { 14prop.load(DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties")); 15ds = BasicDataSourceFactory.createDataSource(prop);//得到一個數據源,自動實現了裝飾模式 16} catch (Exception e) { 17throw new ExceptionInInitializerError("初始化錯誤請檢查配置檔案"); 18} 19} 20public static Connection getConnectin(){ 21try { 22return ds.getConnection(); 23} catch (SQLException e) { 24throw new RuntimeException("連線失敗"); 25} 26 27} 28public static void release(Connection connection, PreparedStatement statement, ResultSet resultSe){ 29if (resultSe != null){ 30try { 31resultSe.close(); 32} catch (SQLException e) { 33e.printStackTrace(); 34} 35} 36//resultSe = null; 37if (statement != null){ 38try { 39statement.close(); 40} catch (SQLException e) { 41e.printStackTrace(); 42} 43} 44//statement = null; 45if (connection != null){ 46try { 47connection.close(); 48} catch (SQLException e) { 49e.printStackTrace(); 50} 51} 52} 53 } DBCP連線
1 #連線設定 2 driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver 3 url=jdbc:sqlserver://localhost:1433;databaseName=資料庫名;username=使用者名稱;password=密碼 4 5 6 #<!-- 初始化連線 --> 7 initialSize=10 8 9 #最大連線數量 10 maxActive=50 11 12 #<!-- 最大空閒連線 --> 13 maxIdle=20 14 15 #<!-- 最小空閒連線 --> 16 minIdle=5 17 18 #<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等於60秒 --> 19 maxWait=60000 20 21 22 #JDBC驅動建立連線時附帶的連線屬性屬性的格式必須為這樣:[屬性名=property;] 23 #注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這裡不需要包含他們。 24 connectionProperties=useUnicode=true;characterEncoding=utf8 25 26 #指定由連線池所建立的連線的自動提交(auto-commit)狀態。 27 defaultAutoCommit=true 28 29 #driver default 指定由連線池所建立的連線的只讀(read-only)狀態。 30 #如果沒有設定該值,則“setReadOnly”方法將不被呼叫。(某些驅動並不支援只讀模式,如:Informix) 31 defaultReadOnly= 32 33 #driver default 指定由連線池所建立的連線的事務級別(TransactionIsolation)。 34 #可用值為下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE 35 defaultTransactionIsolation=REPEATABLE_READ dbcpconfig.properties
3.C3P0連線
需匯入c3p0-0.9.1.2.jar。c3p0-config.xml放在包外。
1 import com.mchange.v2.c3p0.ComboPooledDataSource; 2 3 import java.sql.Connection; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 public class C3P0Utils { 9private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); 10 11public static ComboPooledDataSource getDataSource() { 12return dataSource; 13} 14 15public static Connection getConnection(){ 16try { 17return dataSource.getConnection(); 18} catch (SQLException e) { 19throw new RuntimeException("請檢查配置檔案。"); 20} 21} 22public static void release(Connection conn, Statement stmt, ResultSet rs){ 23 24if(rs!=null){ 25try { 26rs.close(); 27} catch (Exception e) { 28e.printStackTrace(); 29} 30rs = null; 31} 32if(stmt!=null){ 33try { 34stmt.close(); 35} catch (Exception e) { 36e.printStackTrace(); 37} 38stmt = null; 39} 40if(conn!=null) { 41try { 42conn.close(); 43} catch (Exception e) { 44e.printStackTrace(); 45} 46conn = null; 47} 48} 49 } c3p0連線
1 <?xml version="1.0" encoding="UTF-8"?> 2 <c3p0-config> 3<default-config> 4<property name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 5<property name="jdbcUrl">jdbc:sqlserver://localhost:1433;databaseName=day12</property> 6<property name="user">sun</property> 7<property name="password">123000</property> 8<property name="initialPoolSize">10</property> 9<property name="maxIdleTime">30</property> 10<property name="maxPoolSize">100</property> 11<property name="minPoolSize">10</property> 12 13</default-config> 14 15 </c3p0-config> c3p0-config.xml
DBUtils:(commons-dbutils-1.4.jar)
DBUtils封裝了對JDBC的操作,簡化了讀寫操作,可以使用資料來源,資料庫連線池等技術來優化效能。三個核心物件:QueryRunner類,ResultSetHandler介面,DBUtils類。
(1)QueryRunner類
提供對sql語句操作的API
query():用於執行select
update():用於執行insert,update,delete
batch():批處理
建構函式:
> new QueryRunner(); 它的事務可以手動控制。
也就是說此物件呼叫的方法(如:query、update、batrch)引數中要有Connection物件。
> new QueryRunner(DataSource ds); 它的事務是自動控制的。一個sql一個事務。
此物件呼叫的方法(如:query、update、batrch)引數中無需Connection物件
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());//不開啟事務 list = qr.query("select * from users where id=?",new BeanListHandler<User>(User.class),1);
QueryRunner qr = new QueryRunner();//事務
qr.update(ManagerThreadLocal.getConnection(),"update account set money=? where name=?",account.getMoney(),account.getName());
(2)ResultSetHandler介面
用於定義select操作後怎麼封裝結果集
ArrayHandler:適合取1條記錄。把該條記錄的每列值封裝到一個數組中Object[]
ArrayListHandler:適合取多條記錄。把每條記錄的每列值封裝到一個數組中Object[],把陣列封裝到一個List中
ColumnListHandler:取某一列的資料。封裝到List中。
KeyedHandler:取多條記錄,每一條記錄封裝到一個Map中,再把這個Map封裝到另外一個Map中,key為指定的欄位值。
MapHandler:適合取1條記錄。把當前記錄的列名和列值放到一個Map中
MapListHandler:適合取多條記錄。把每條記錄封裝到一個Map中,再把Map封裝到List中
ScalarHandler:適合取單行單列資料
BeanHandler:取第一行資料。 new BeanHandler<XXX>(XXX.class),封裝到泛型指定的物件中去。XXX要有set方法。
BeanListHandler
(3)DBUtils類
工具類,定義了關閉資源和事務處理的方法
4.因為涉及到執行緒池關閉執行緒(實際上不是關閉,而是把當前執行緒放回到執行緒池中),所以要用到包裝類(即裝飾設計模式)。目的是為了改寫已存在類的某個方法或某些方法。下面將寫一下我對包裝類的理解。實際上我們不需要手寫,因為dbcp,c3p0都已經自帶執行緒池管理了。但是還是需要了解,所以就再回顧一下。
裝飾設計模式(包裝模式)的書寫口訣:
(1)編寫一個類,實現與被包裝類相同的介面
(2)定義一個被包裝類型別的物件
(3)定義構造方法,把被包裝類的物件注入,給被包裝類變數賦值
(4)對於不需要改寫的方法,呼叫原有的方法
(5)對於需要改寫的方法,寫自己的程式碼。
下面是關於當前執行緒放回pool的close放的改寫:
5.事務..事務有點麻煩,要和執行緒混在一起。。我再理解理解