1.爲什麼要使用java連接池?
在我們用傳統的JDBC 連接數據庫,必須經常進行創建和銷燬,並且銷燬對象也不是很徹底,所以爲了節省時間、效率,可以使用連接池。
2.如何使用連接池?
在程序開始的時候,可以創建幾個連接,將連接放入到連接池中.用戶使用連接的時候,可以從連接池中進行獲取.用完之後,可以將連接歸還連接池。
常見連接池的有C3PO,DBCP,當然我們也可以自己定義——以下爲所寫代碼:
public class MyDataSource implements DataSource{
// 創建一個List集合用於存放多個連接對象.
privateList<Connection> list = new ArrayList<Connection>();
// 在程序開始的時候,初始化幾個連接,將連接存放到list中.
publicMyDataSource() {
// 初始化3個連接:
for(inti=1;i<=3;i++){
Connectionconn = JDBCUtils.getConnection();
list.add(conn);
}
}
@Override
// 獲得連接的方法:
publicConnection getConnection() throws SQLException {
if(list.size()<= 0){
for(inti=1;i<=3;i++){
Connectionconn = JDBCUtils.getConnection();
list.add(conn);
}
}
Connectionconn = list.remove(0);
returnconn;
}
// 歸還連接的方法:
publicvoid addBack(Connection conn){
list.add(conn);
}
...
}
3.什麼是DBUtils?
我們知道在執行select語句之後得到的是ResultSet,然後我們還需要對ResultSet進行轉換,得到最終我們想要的數據。你可以希望把ResultSet的數據放到一個List中,也可能想把數據放到一個Map中,或是一個Bean中。
DBUtils提供了一個接口ResultSetHandler,它就是用來ResultSet轉換成目標類型的工具。你可以自己去實現這個接口,把ResultSet轉換成你想要的類型。
DBUtils提供了很多個ResultSetHandler接口的實現,這些實現已經基本夠用了,我們通常不用自己去實現ResultSet接口了。
MapHandler:單行處理器!把結果集轉換成Map<String,Object>,其中列名爲鍵! |
MapListHandler:多行處理器!把結果集轉換成List<Map<String,Object>>; |
BeanHandler:單行處理器!把結果集轉換成Bean,該處理器需要Class參數,即Bean的類型; |
BeanListHandler:多行處理器!把結果集轉換成List<Bean>; |
ColumnListHandler:多行單列處理器!把結果集轉換成List<Object>,使用ColumnListHandler時需要指定某一列的名稱或編號,例如:newColumListHandler(“name”)表示把name列的數據放到List中。 |
ScalarHandler:單行單列處理器!把結果集轉換成Object。一般用於聚集查詢,例如select count(*) fromtab_student。 |
MapListHandler處理器
Bean處理器
Column處理器
4.QueryRunner查詢方式?
QueryRunner的查詢方法是:
public <T> Tquery(String sql, ResultSetHandler<T> rh, Object… params)
public <T> Tquery(Connection con, String sql, ResultSetHandler<T> rh, Object… params)
query()方法會通過sql語句和params查詢出ResultSet,然後通過rh把ResultSet轉換成對應的類型再返回。
java代碼:
@Test
public void fun2() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student";
List<Map<String,Object>>list = qr.query(sql, new MapListHandler()[ThinkPad1] );
for(Map<String,Object> map : list) {
System.out.println(map);
}
}
@Test
public void fun3() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student wherenumber=?";
Student stu = qr.query(sql, new BeanHandler<Student>(Student.class)[ThinkPad1] , "S_2000");
System.out.println(stu);
}