1. 鍦ㄤ笟鍔″眰浣跨敤JDBC鐩存帴鎿嶄綔鏁版嵁搴擄紞鏈綆鍗曪紝鏈鐩存帴鐨勬搷浣?/FONT>
1錛夋暟鎹簱url,username,password鍐欐鍦ㄤ唬鐮佷腑
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl";
String user="scott";
String password="tiger";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
2錛夐噰鐢‵acade鍜孋ommand妯″紡錛屼嬌鐢―BUtil綾誨皝瑁匤DBC鎿嶄綔錛?/FONT>
鏁版嵁搴搖rl,username,password鍙互鏀懼湪閰嶇疆鏂囦歡涓紙濡倄ml,properties,ini絳夛級銆?/FONT>
榪欑鏂規硶鍦ㄥ皬紼嬪簭涓簲鐢ㄨ緝澶氥?/FONT>
2.DAO(Data Accessor Object)妯″紡錛嶆澗鑰﹀悎鐨勫紑濮?/FONT>
DAO = data + accessor + domain object
渚嬪User綾伙紞domain object (javabean)
UserDAO綾伙紞accessor 錛屾彁渚涚殑鏂規硶getUser(int id)錛宻ave(User user)鍐呭寘鍚簡JDBC鎿嶄綔
鍦ㄤ笟鍔¢昏緫涓嬌鐢ㄨ繖涓や釜綾繪潵瀹屾垚鏁版嵁鎿嶄綔銆?/FONT>
浣跨敤Factory妯″紡鍙互鏂逛究涓嶅悓鏁版嵁搴撹繛鎺ヤ箣闂寸殑縐繪銆?/FONT>
3.鏁版嵁搴撹祫婧愮鐞嗘ā寮?/FONT>
3.1 鏁版嵁搴撹繛鎺ユ睜鎶鏈?/FONT>
璧勬簮閲嶇敤錛岄伩鍏嶉綣佸垱寤猴紝閲婃斁榪炴帴寮曡搗澶уぇ閲忔ц兘寮閿錛?/FONT>
鏇村揩鐨勭郴緇熷搷搴旈熷害錛?/FONT>
閫氳繃瀹炵幇JDBC鐨勯儴鍒嗚祫婧愬璞℃帴鍙? Connection, Statement, ResultSet )錛屽彲浠ヤ嬌鐢―ecorator璁捐妯″紡鍒嗗埆浜х敓涓夌閫昏緫璧勬簮瀵硅薄: PooledConnection, PooledStatement鍜?PooledResultSet銆?/FONT>
涓涓渶綆鍗曞湴鏁版嵁搴撹繛鎺ユ睜瀹炵幇錛?/FONT>
public class ConnectionPool {
private static Vector pools;
private final int POOL_MAXSIZE = 25;
/**
* 鑾峰彇鏁版嵁搴撹繛鎺?/SPAN>
* 濡傛灉褰撳墠姹犱腑鏈夊彲鐢ㄨ繛鎺ワ紝鍒欏皢姹犱腑鏈鍚庝竴涓繑鍥烇紱鑻ユ病鏈夛紝鍒欏垱寤轟竴涓柊鐨勮繑鍥?/SPAN>
*/
public synchronized Connection getConnection() {
Connection conn = null;
if (pools == null) {
pools = new Vector();
}
if (pools.isEmpty()) {
conn = createConnection();
} else {
int last_idx = pools.size() - 1;
conn = (Connection) pools.get(last_idx);
pools.remove(last_idx);
}
return conn;
}
/**
* 灝嗕嬌鐢ㄥ畬姣曠殑鏁版嵁搴撹繛鎺ユ斁鍥炴睜涓?/SPAN>
* 鑻ユ睜涓繛鎺ュ凡緇忚秴榪囬槇鍊鹼紝鍒欏叧闂榪炴帴錛涘惁鍒欐斁鍥炴睜涓笅嬈″啀浣跨敤
*/
public synchronized void releaseConnection(Connection conn) {
if (pools.size() >= POOL_MAXSIZE)
try {
conn.close();
} catch (SQLException e) {
// TODO鑷姩鐢熸垚 catch 鍧?/SPAN>
e.printStackTrace();
} else
pools.add(conn);
}
public static Connection createConnection() {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user = "scott";
String password = "tiger";
conn = DriverManager.getConnection(url, user, password);
} catch (InstantiationException e) {
// TODO鑷姩鐢熸垚 catch 鍧?/SPAN>
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO鑷姩鐢熸垚 catch 鍧?/SPAN>
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO鑷姩鐢熸垚 catch 鍧?/SPAN>
e.printStackTrace();
} catch (SQLException e) {
// TODO鑷姩鐢熸垚 catch 鍧?/SPAN>
e.printStackTrace();
}
return conn;
}
}
娉ㄦ剰錛氬埄鐢╣etConnection()鏂規硶寰楀埌鐨凜onnection錛岀▼搴忓憳寰堜範鎯湴璋冪敤conn.close()鏂規硶鍏抽棴浜嗘暟鎹簱榪炴帴錛岄偅涔堜笂榪扮殑鏁版嵁搴撹繛鎺ユ満鍒朵究褰㈠悓铏氳銆?SPAN style="BACKGROUND-COLOR: #ffffff">鍦ㄨ皟鐢╟onn.close()鏂規硶鏂規硶鏃跺浣曡皟鐢╮eleaseConnection()鏂規硶錛熻繖鏄叧閿傝繖閲岋紝鎴戜滑浣跨敤Proxy妯″紡鍜宩ava鍙嶅皠鏈哄埗銆?/SPAN>
public synchronized Connection getConnection() {
Connection conn = null;
if (pools == null) {
pools = new Vector();
}
if (pools.isEmpty()) {
conn = createConnection();
} else {
int last_idx = pools.size() - 1;
conn = (Connection) pools.get(last_idx);
pools.remove(last_idx);
}
ConnectionHandler handler=new ConnectionHandler(this);
return handler.bind(con);
}
public class ConnectionHandler implements InvocationHandler {
private Connection conn;
private ConnectionPool pool;
public ConnectionHandler(ConnectionPool pool){
this.pool=pool;
}
/**
* 灝嗗姩鎬佷唬鐞嗙粦瀹氬埌鎸囧畾Connection
* @param conn
* @return
*/
public Connection bind(Connection conn){
this.conn=conn;
Connection proxyConn=(Connection)Proxy.newProxyInstance(
conn.getClass().getClassLoader(), conn.getClass().getInterfaces(),this);
return proxyConn;
}
/* 錛堥潪 Javadoc錛?/SPAN>
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO鑷姩鐢熸垚鏂規硶瀛樻牴
Object obj=null;
if("close".equals(method.getName())){
this.pool.releaseConnection(this.conn);
}
else{
obj=method.invoke(this.conn, args);
}
return obj;
}
}
鍦ㄥ疄闄呴」鐩腑錛屽茍涓嶉渶瑕佷綘鏉ヤ粠澶村紑濮嬫潵璁捐鏁版嵁搴撹繛鎺ユ睜鏈哄埗錛岀幇鍦ㄦ垚鐔熺殑寮婧愰」鐩紝濡侰3P0,dbcp,Proxool絳夋彁渚涗簡鑹ソ鐨勫疄鐜般備竴鑸帹鑽愪嬌鐢ˋpache dbcp錛屽熀鏈嬌鐢ㄥ疄渚嬶細
DataSource ds = null;
try{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource)envCtx.lookup("jdbc/myoracle");
if(ds!=null){
out.println("Connection is OK!");
Connection cn=ds.getConnection();
if(cn!=null){
out.println("cn is Ok!");
Statement stmt = cn.createStatement();
ResultSet rst = stmt.executeQuery("select * from BOOK");
out.println("<p>rst is Ok!" + rst.next());
while(rst.next()){
out.println("<P>BOOK_CODE:" + rst.getString(1));
}
cn.close();
}else{
out.println("rst Fail!");
}
}
else
out.println("Fail!");
}catch(Exception ne){ out.println(ne);
}
3.2 Statement Pool
鏅氶緙栬瘧浠g爜錛?/FONT>
String strSQL=鈥漵elect name from items where id=?鈥?
PreparedStatement ps=conn.prepareStatement(strSQL);
ps.setString(1, 鈥?鈥?;
ResultSet rs=ps.executeQuery();
浣嗘槸PreparedStatement 鏄笌鐗瑰畾鐨凜onnection鍏寵仈鐨勶紝涓鏃onnection鍏抽棴錛屽垯鐩稿叧鐨凱reparedStatement 涔熶細鍏抽棴銆?/FONT>
涓轟簡鍒涘緩PreparedStatement 緙撳啿姹狅紝鍙互鍦╥nvoke鏂規硶涓氳繃sql璇彞鍒ゆ柇姹犱腑榪樻湁娌℃湁鍙敤瀹炰緥銆?/FONT>
4. 鎸佷箙灞傝璁′笌O/R mapping 鎶鏈?/FONT>
1錛?nbsp;Hernate錛氶傚悎瀵規柊浜у搧鐨勫紑鍙戯紝榪涜灝侀棴鍖?SPAN style="BACKGROUND-COLOR: #ffffff">鐨勮璁?
Hibernate 2003騫磋Jboss鎺ョ錛?SPAN style="FONT-SIZE: 10pt">閫氳繃鎶?/SPAN>java pojo瀵硅薄鏄犲皠鍒版暟鎹簱鐨?/SPAN>table涓紝閲囩敤浜?/SPAN>xml/javareflection鎶鏈瓑銆?/SPAN>3.0鎻愪緵浜嗗瀛樺偍榪囩▼鍜屾墜鍐?/SPAN>sql鐨勬敮鎸侊紝鏈韓鎻愪緵浜?/SPAN>hql璇█銆?/SPAN>
寮鍙戞墍闇瑕佺殑鏂囦歡錛?/FONT>
hibernate閰嶇疆鏂囦歡錛?/SPAN> hibernate.cfg.xml 鎴?/SPAN> hibernate.properties
hibernate 鏄犲皠鏂囦歡錛?/SPAN> a.hbm.xml
pojo綾繪簮鏂囦歡錛?/SPAN> a.java銆銆
瀵煎嚭琛ㄤ笌琛ㄤ箣闂寸殑鍏崇郴錛?/FONT>
a. 浠?/SPAN>java瀵硅薄鍒?/SPAN>hbm鏂囦歡錛?/SPAN>xdoclet
b. 浠?/SPAN>hbm鏂囦歡鍒?/SPAN>java瀵硅薄錛?/SPAN>hibernate extension
c. 浠庢暟鎹簱鍒?/SPAN>hbm鏂囦歡錛?/SPAN>middlegen
d. 浠?/SPAN>hbm鏂囦歡鍒版暟鎹簱錛?/SPAN>SchemaExport
2錛?SPAN style="BACKGROUND-COLOR: #ffffff">Iatis 錛氶傚悎瀵歸仐鐣欑郴緇熺殑鏀歸犲拰瀵規棦鏈夋暟鎹簱鐨勫鐢紝鏈夊緢寮虹殑鐏墊椿鎬?3錛?Apache OJB錛氫紭鍔垮湪浜庡鏍囧噯鐨勫叏闈㈡敮鎸?4錛塃JB錛氶傚悎闆嗙兢鏈嶅姟鍣紝鍏舵ц兘涔熶笉璞℃煇浜涗漢鎵璇熺梾鐨勯偅涔堝樊鍔?5錛?JDO (java data object)
璁劇疆涓涓狿roperties瀵硅薄錛屼粠鑰岃幏鍙栦竴涓狫DO鐨凱ersistenceManagerFactory錛堢浉褰撲簬JDBC榪炴帴姹犱腑鐨凞ataSource錛夛紝榪涜岃幏寰椾竴涓狿ersistenceManager瀵硅薄錛堢浉褰撲簬JDBC涓殑Connection瀵硅薄錛夛紝涔嬪悗錛屼綘鍙互鐢ㄨ繖涓狿ersistenceManager瀵硅薄鏉ュ鍔犮佹洿鏂般佸垹闄ゃ佹煡璇㈠璞°?/FONT>
JDOQL鏄疛DO鐨勬煡璇㈣璦錛涘畠鏈夌偣璞QL錛屼絾鍗存槸渚濈収Java鐨勮娉曠殑銆?/FONT>
5. 鍩轟簬寮婧愭鏋剁殑Struts+Spring+Hibernate瀹炵幇鏂規
紺轟緥錛氳繖鏄竴涓?/SPAN>3灞傛灦鏋勭殑web 紼嬪簭錛岄氳繃涓涓?/SPAN>Action 鏉ヨ皟鐢ㄤ笟鍔′唬鐞嗭紝鍐嶉氳繃瀹冩潵鍥炶皟 DAO綾匯備笅闈㈢殑嫻佺▼鍥捐〃紺轟簡MyUsers鏄浣曞伐浣滅殑銆傛暟瀛楄〃鏄庝簡嫻佺▼鐨勫厛鍚庨『搴忥紝浠?/SPAN>web灞?/SPAN>(UserAction)鍒頒腑闂村眰(UserManager)錛屽啀鍒版暟鎹眰(UserDAO)錛岀劧鍚庤繑鍥炪?/SPAN>
Spring鏄?/SPAN>AOP, UserManager鍜?/SPAN>UserDAO閮芥槸鎺ュ彛.
1) web灞?/SPAN>(UserAction) 錛氳皟鐢ㄤ腑闂村眰鐨勬帴鍙f柟娉曪紝灝?/SPAN>UserManager浣滀負灞炴ф敞鍏ャ?/SPAN>
閲囩敤嫻佽鐨凷truts妗嗘灦錛岃櫧鐒舵湁寰堝浜轟笉灞戜竴欏撅紝浣嗘槸榪欓」鎶鏈湪涓氱晫鐢ㄧ殑姣旇緝鏅亶錛岃兘婊¤凍鍩烘湰鐨勫姛鑳斤紝鍙互鍑忓皯鍩硅瀛︿範鎴愭湰銆?/FONT>
2) 涓棿灞?/SPAN>(UserManager)錛氬皢UserDAO浣滀負灞炴ф敞鍏ワ紝鍏跺疄鐜頒富瑕佹槸璋冪敤鏁版嵁灞傛帴鍙g殑涓浜涙柟娉曪紱瀹冨浜庝簨鍔℃帶鍒朵腑銆?/SPAN>
閲囩敤Spring妗嗘灦瀹炵幇錛孖OC涓嶢OP鏄畠鐨勪唬鍚嶈瘝錛屽姛鑳介綈鍏紝闈炲父媯掔殑涓涓灦鏋勩?/FONT>
3) 鏁版嵁灞?/SPAN>(UserDAO)錛氬疄鐜扮被緇ф壙HibernateDaoSupport綾伙紝鍦ㄨ綾諱腑鍙互璋冪敤getHibernateTemplate()鐨勪竴浜涙柟娉曟墽琛屽叿浣撶殑鏁版嵁鎿嶄綔銆?/SPAN>
閲囩敤Hibernate鍋歄/R mapping錛屼粠縐嶇榪硅薄鍙互鐪嬪嚭錛孒ibernate灝辨槸EJB3.0鐨刡eta鐗堛?/FONT>

]]>