這篇仍是在回顧知識。主要是關於java鏈接Sqlserver2012數據庫的一些方式記錄,以便之後查詢。java
十一以內複習完這些知識就能夠新學Hibernate啦(*^▽^*)sql
1.普通方式數據庫
注意,在鏈接數據庫以前要導入JDBC驅動。由於我用的是sqlserver,因此我導入了sqljdbc4.jarapache
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 { return DriverManager.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=密碼
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 { 10 private static DataSource ds = null; 11 static { 12 Properties prop = new Properties(); 13 try { 14 prop.load(DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties")); 15 ds = BasicDataSourceFactory.createDataSource(prop);//獲得一個數據源,自動實現了裝飾模式 16 } catch (Exception e) { 17 throw new ExceptionInInitializerError("初始化錯誤請檢查配置文件"); 18 } 19 } 20 public static Connection getConnectin(){ 21 try { 22 return ds.getConnection(); 23 } catch (SQLException e) { 24 throw new RuntimeException("鏈接失敗"); 25 } 26 27 } 28 public static void release(Connection connection, PreparedStatement statement, ResultSet resultSe){ 29 if (resultSe != null){ 30 try { 31 resultSe.close(); 32 } catch (SQLException e) { 33 e.printStackTrace(); 34 } 35 } 36 //resultSe = null; 37 if (statement != null){ 38 try { 39 statement.close(); 40 } catch (SQLException e) { 41 e.printStackTrace(); 42 } 43 } 44 //statement = null; 45 if (connection != null){ 46 try { 47 connection.close(); 48 } catch (SQLException e) { 49 e.printStackTrace(); 50 } 51 } 52 } 53 }
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
3.C3P0鏈接ide
需導入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 { 9 private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); 10 11 public static ComboPooledDataSource getDataSource() { 12 return dataSource; 13 } 14 15 public static Connection getConnection(){ 16 try { 17 return dataSource.getConnection(); 18 } catch (SQLException e) { 19 throw new RuntimeException("請檢查配置文件。"); 20 } 21 } 22 public static void release(Connection conn, Statement stmt, ResultSet rs){ 23 24 if(rs!=null){ 25 try { 26 rs.close(); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } 30 rs = null; 31 } 32 if(stmt!=null){ 33 try { 34 stmt.close(); 35 } catch (Exception e) { 36 e.printStackTrace(); 37 } 38 stmt = null; 39 } 40 if(conn!=null) { 41 try { 42 conn.close(); 43 } catch (Exception e) { 44 e.printStackTrace(); 45 } 46 conn = null; 47 } 48 } 49 }
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>
DBUtils:(commons-dbutils-1.4.jar)工具
DBUtils封裝了對JDBC的操做,簡化了讀寫操做,可使用數據源,數據庫鏈接池等技術來優化性能。三個核心對象:QueryRunner類,ResultSetHandler接口,DBUtils類。sqlserver
(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.事務..事務有點麻煩,要和線程混在一塊兒。。我再理解理解