代碼:
複製代碼代碼如下:
包com.lwj.test.proxy;
導入java.lang.reflect.invocationhandler;
導入java.lang.reflect.invocationTargetException;
導入java.lang.reflect.Method;
導入java.lang.reflect.proxy;
導入java.sql.connection;
導入java.sql.sqlexception;
公共類dbmanager {
私有最終靜態螺紋線<連接> conns = new ThreadLocal <connection>();
私有靜態布爾show_sql = true;
公共最終靜態連接getConnection()拋出sqlexception {
連接conn =(連接)conns.get();
if(conn == null || conn.isclosed()){
//這裡使用我定義的一個簡單的Connection -provider替代數據源獲取連接
conn = ConnectionProvider.getConnection();
conns.set(conn);
}
return(show_sql &&!proxy.isproxyclass(conn.getClass()))?
新的_debugConnection(conn).getConnection():conn;
}
/**
*關閉連接
*/
公共最終靜態void colleconnection(){
連接conn =(連接)conns.get();
嘗試 {
if(conn!= null &&!conn.isclosed()){
conn.setautocommit(true);
conn.close();
}
} catch(sqlexception e){
}
conns.set(null);
}
/**
*用於跟踪執行的sql語句
*/
靜態類_debugConnection實現InvocationHandler {
私有連接conn = null;
public _debugConnection(Connection conn){
this.conn = conn;
}
公共連接getConnection(){
返回(連接)proxy.newproxyinstance(conn.getClass()。getClassLoader(),new class [] {connection.class},this);
}
公共對象調用(對象代理,方法M,對象[] args)可拋出
{
嘗試
{
字符串方法= m.getName();
if(“ prepareStatement” .equals(方法)||“ createStatement” .Equals(method))
{
System.out.println(方法);
system.out.println(args [0]);
}
返回M.Invoke(Conn,args);
} catch(InvocationTargetException e){
投擲e.getTargetException();
}
}
}
}
包com.lwj.test.proxy;
導入java.sql.connection;
導入java.sql.drivermanager;
公共類Connection Provider {
公共靜態連接getConnection()
{
連接= null;
嘗試{
class.forname(“ oracle.jdbc.oracledriver”)。newInstance();
連接= drivermanager.getConnection(“ jdbc:oracle:thin:@192.168.1.101:1521:orcl”,“ scott”,“ tiger”);
} catch(異常E){
}
返回連接;
}
}
包com.lwj.test.proxy;
導入java.sql.connection;
導入java.sql.preparedstatement;
導入Java.sql.ResultSet;
導入java.sql.sqlexception;
導入java.sql.statement;
公共類Testmain {
公共靜態void main(string [] args)
{
連接conn = null;
語句stmt = null;
準備的pstmt = null;
嘗試
{
conn = dbmanager.getConnection();
stmt = conn.CreateStatement(resultset.type_scroll_sentive,resultset.concur_updatable);
stmt.executeupdate(“插入test1(ID,名稱,卡,年齡,地址)值(9,'liuwj','12345678909887777',24,'hubeitianmen')”);
/*pstmt = conn.preparestatement(“插入test1(ID,名稱,卡,年齡,地址)值(?,?,?,?,?,?)”);
PSTMT.SetString(1,“ 10”);
pstmt.setstring(2,“ liuwj2”);
PSTMT.SetString(3,“ 1234567890988777”);
PSTMT.SetString(4,“ 22”);
PSTMT.SetString(5,“ 123456”);
pstmt.execute();*/
} catch(sqlexception e){
}最後{
嘗試{
如果(pstmt!= null){
pstmt.close();
pstmt = null;
}
} catch(sqlexception e){
}
dbmanager.closeconnection();
}
}
}
論壇上看到用下列語句:
複製代碼代碼如下:
pstmt = conn.preparestatement(“插入test1(ID,名稱,卡,年齡,地址)值(?,?,?,?,?,?)”);
PSTMT.SetString(1,“ 10”);
pstmt.setstring(2,“ liuwj2”);
PSTMT.SetString(3,“ 1234567890988777”);
PSTMT.SetString(4,“ 22”);
PSTMT.SetString(5,“ 123456”);
pstmt.execute();
才能打印出sql語句。