jdbc连接数据库详解

Spring簡化了JDBC的數據庫操作,數據訪問不必使用煩瑣的Try…catch塊。同時還支持查詢結果的對象化

JDBC基礎,JDBC的全稱是Java Database Connectivity,即Java數據庫連接。通JDBC可以使用同一種API操作不同的數據庫系統。JDBC完成數據庫連接、發送SQL語句、處理結果三個基本的工作。JDBC 與數據庫之間還有一層,用於將JDBC調用映射成特定的數據庫調用,這個特殊的層就是JDBC驅動程序
JDBC常用的接口和類簡介:
1.DriverManager:管理JDBC驅動的報務類。
2.Connection:數據庫連接對象
3.Statement:執行SQL語句的工具接口
4.PreparedStatement是Statement的子接口,它可以預編譯SQL語句
5.ResultSet:結果集,這裡說一下它的一個方法:boolean absolute(int row)throws SQLException,要使用這個方法,必須使用帶參數的createStatement方法創建Statement對象
傳統的JDBC訪問數據庫
Class.forName(“oracle.jdbc.driver.OracleDriver”);
String url=”jdbc:oracle:thin:@localhost:1521:orcl”;
Connection conn=DriverManager.getConnection(url,”scott”,”tiger”);
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(“select * from test”);

數據庫連接池
數據庫的建立及關閉是極耗系統資源的操作。數據庫連接池的解決方案是:當應用程序啟動時,系統主動建立足夠的數據庫連接,並將這些連接組成一個連接池,每次使用時從池中取出已有的連接,關閉時歸還給連接池。JDBC標準的API並沒有提供連接池實現,僅僅提供DataSource接口。

事務處理
JDBC的Connection本身設置Connection的AutoCommit屬性爲false,提供對事務的支持,然後顯式地調用commit或rollback方法提交或囬滾事務

連接池的實現
連接池通常包括連接池類(DBConnectionPool)和連接池管理類(DBConnectionPoolManager)。目前流行的開源連接池有如下兩個:DBCP和C3P0
1.DBCP連接池
使用這個連接池要在系統中增加兩個jar文件:commons-dbcp-1.2.1.jar(連接池的實現)和commons-pool.jar(連接池的依賴庫),通過DBCP連接池得到數據庫連接代碼如下:
BasicDataSource ds=new BasicDataSource();
ds.setDriverClassName(“C”);ds.setUrl(“U”);ds.setUsername(“N”);ds.setPassword(“P”);ds.getConnection();
2.C3P0連接池
使用C3P0要到這個實現類包:c3p0-0.8.5.2.jar
ComboPooledDataSource ds =new ComboPooledDataSource();
ds.setDriverClassName(“C”);ds.setJdbcUrl(“U”);ds.setUsername(“N”);ds.setPassword(“P”);ds.getConnection();

Spring的JDBC體系
1.Spring的JDBC封裝。JDBC封裝的核心JdbcTemplate,牠幫助建立Statement,使用Statement執行命令,衹需提供SQL命令,無須關心連接的建立和關閉,無須關心Statement的創建和釋放。JdbcTemplate提供系列方法來簡化數據庫的訪問,具體方法請使用Eclipse的提示。
2.JDBC封裝的回調接口(我認爲囬調這個詞很形象,就是封裝了JDBC又囬調不封裝了)
使用囬調接口,允許在Spring的JDBC抽象體系內,使用原生JDBC查詢,有如下幾種囬調接口:
A.CallableStatementCallBack:可以使用原生的JDBC命令調用存儲過程和函數
B.CallableStatementCreator:用來獲得CallableStatementCallBack對 象
C.PreparedStatementCallback:可以使用原生的JDBC命令訪問數據庫
D.PreparedStatementCreator:用來獲得PreparedStatementCallback對象
E.StatementCallback:類似於PreparedStatementCallback,但沒有預編譯功能

Spring的JDBC和傳統的JDBC對比
簡化了數據庫的訪問、優秀的面向對象的操作方式、一致的異常繼承體系,無須捕捉JDBC特定的數據庫異常

使用JdbcTemplate訪問數據庫
//以下的訪問方式還不如上一章中的使JDBC DAO支持體系
ComboPooledDataSource ds=new ComboPooledDataSource();
ds.setDriverClass(“”);………..
JdbcTemplate jt=new JdbcTemplate();
jt.setDataSource(ds);
List nameList=jt.queryForList(“select name from …”);
//執行簡單的DDL。
jt.execute(“drop table if exists wawa”);
//使用StatementCallback訪問數據庫,該接口衹有一個方法需要實現:Object doInStatement(Statement stmt)throws //SQLException
jt.excecute(new StatementCallback(){
public Object doInStatement(Statement stmt)throws SQLException{
stmt.execute(“update …”);
}
});
//使用PreparedStatementCallback,實現這個接口也衹要實現一個方法:
Object doInPreparedStatement(PreparedStatement pstmt)throws SQLException,DataAccessException;
jt.excecute(“update…”,new StatementCallback(){
public Object doInPreparedStatement(PreparedStatement pstmt)throws SQLException{
pstmt.setString(1,””);
pstmt.execute();
}
});

連接數據庫的輔助類
衹要是用來連接數據庫的
1.使用數據源工具類(DataSourceUtils)
ComboPooledDataSource ds=new ComboPooledDataSource();
ds.setDriverClass(“”);………..
Connection conn=DataSourceUtils.getConnection(ds);
這與通過DataSource的getConnection獲取數據庫連接相比,前者是智能的,可以在必要是自動關閉連接,無須手動關閉
2.智能數據源(SmartDataSource)接口介紹
SmartDataSource繼承DataSource接口,它墜子提供DataSource的基本方法之外,還提供一個額外的功能:在恰當的時候關閉連接,它通過boolean shouldClose(Connection con)返回true時關閉連接
3.單連接數據源SingleConnectionDataSource
牠實現了SmartDataSource接口,它是單連接的DataSource,這個連接衹有銷毀SingleConnectionDataSource時才會關閉,牠主要作用是用來測試
SingleConnectionDataSource ds=new SingleConnectionDataSource();
ds.setDriverClassName(“C..”);
Connection conn=DataSourceUtils.getConnection(ds);
4.另一個數據源實現DriverManagerDataSource
牠繼承Spring的一個抽象類:AbstractDataSource,牠總是獲得新的連接,不會緩存連接,因此性能不好,主要的作用是用來測試
DriverManagerDataSourceds=new DriverManagerDataSource ();
ds.setDriverClassName(“C..”);
Connection conn=DataSourceUtils.getConnection(ds);

數據庫操作的對象化
對象化的操作由org.springframework.jdbc.object包中的類完成
查詢結果的對象化有如下兩种方法
1.使用RowMapper接口
2.使用MappingSqlQuery或MappingSqlQueryWithParameters
實現RowMapper接口衹有一個方法:
Object mapRow(ResultSet rs,int rowNum)throws SQLException
JdbcTemplate jt=new JdbcTemplate();
jt.setDataSource(ds);
List persionList=jt.query(“select *…”,new RowMapper(){
public Object mapRow(ResultSet rs,int rowNum)throws SQLException{
Person p=new Person();
p.setName(rs.getString(2));
}
});

查詢對象
查詢對象的父類是SqlQuery,通常使用牠的子類:MappingSqlQuery,MappingSqlQueryWithParameters和UpdatableSqlQuery。(我認爲可以把牠看作是一條封裝好原始SQL語句,返囬對象化結果的包裝好的SQL語句)。\
1.使用MappingSqlQuery,牠的子類必須實現mapRow(ResultSet int),把ResultSet的每一行轉換成對象
private class PersonMappingQuery extends MappingSqlQuery{
public PersonMappingQuery(DataSource ds){
super(ds,”select ….where p_age>?”);
super.declareParameter(new SqlParameter(“id”,Types.INTEGER));//參數類型
compile();//編譯
}
public Object mapRow(ResultSet rs, int rowNumber) throws SQLException
{
Person p = new Person();
p.setAge(rs.getInt(3));
p.setName(rs.getString(2));
return p;
}
}
使用方式:
PersonMappingQuery pmq=new PersonMappingQuery(ds);
Object[] values={new Integer(30)};
List personList=pmq.execute(values);
2.更新對象
更新對象通常繼承Sqlupdate類實現
class PersonUpdate extends SqlUpdate
{
public PersonUpdate(DataSource ds)
{
super(ds, "update person_test set p_name=’老人’ WHERE p_age > ?" );
super.declareParameter(new SqlParameter(“id”,Types.INTEGER));
compile();
}
}
使用方式:
PersonUpdate pmq = new PersonUpdate(ds);
Object[] values = {new Integer(30)};
int dd = pmq.update(values);
調用存儲過程或函數,略

你可能感兴趣的:(spring,oracle,sql,c,jdbc)