java之數據庫相關

這篇仍是在回顧知識。主要是關於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=密碼
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 {
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 }
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鏈接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 }
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類。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.事務..事務有點麻煩,要和線程混在一塊兒。。我再理解理解

相關文章
相關標籤/搜索