代码:
复制代码代码如下:
パッケージcom.lwj.test.proxy;
java.lang.reflt.invocationhandlerをインポートします。
Import java.lang.Reflect.InvocationTargetException;
java.lang.reflt.methodをインポートします。
java.lang.reflt.proxyをインポートします。
Java.sql.Connectionをインポートします。
java.sql.sqlexceptionをインポートします。
パブリッククラスdbmanager {
private final static threadlocal <connection> conns = new ThreadLocal <Connection>();
private static boolean show_sql = true;
public final static connection getConnection()throws sqlexception {
接続conn =(connection)conns.get();
if(conn == null || conn.isclosed()){
// connectionProvider替代データソース获取接続
conn = connectionprovider.getConnection();
conns.set(conn);
}
return(show_sql &&!proxy.isproxyclass(conn.getClass()))?
new _debugconnection(conn).getConnection():conn;
}
/**
*关闭连接
*/
public final static void closeconnection(){
接続conn =(connection)conns.get();
試す {
if(conn!= null &&!conn.isclosed()){
conn.setautocommit(true);
conn.close();
}
} catch(sqlexception e){
}
conns.set(null);
}
/**
*用于跟踪执行的sql语句
*/
静的クラス_DebugConnection ImplestionInvocationHandler {
プライベート接続conn = null;
public _debugconnection(connection conn){
this.conn = conn;
}
パブリック接続getConnection(){
return(connection)proxy.newproxyinstance(conn.getClass()。getClassLoader()、new class [] {connection.class}、this);
}
パブリックオブジェクトの呼び出し(オブジェクトプロキシ、メソッドM、オブジェクト[] args)スロー可能
{
試す
{
文字列メソッド= m.getName();
if( "preparestatement" .equals(method)|| "CreateStatement" .equals(method))
{
system.out.println(method);
System.out.println(args [0]);
}
M.Invoke(conn、args)を返します。
} catch(InvocationTargetException e){
E.getTargetException();
}
}
}
}
パッケージcom.lwj.test.proxy;
Java.sql.Connectionをインポートします。
Java.sql.drivermanagerをインポートします。
パブリッククラスConnectionProvider {
public static Connection getConnection()
{
接続接続= null;
試す{
class.forname( "oracle.jdbc.oracledriver")。newInstance();
connection = 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をインポートします。
パブリッククラスのテストメイン{
public static void main(string [] args)
{
接続conn = null;
ステートメントstmt = null;
predtatement pstmt = null;
試す
{
conn = dbmanager.getConnection();
stmt = conn.createstatement(resultset.type_scroll_sensitive、resultset.concur_updatable);
stmt.executeUpdate( "test1(id、name、card、age、address)値に挿入値(9、 'liuwj'、 '123456789098890988777'、24、 'hubeitianmen')");
/*pstmt = conn.preparestatement( "test1(id、name、card、agre、addressに挿入)値(?、?、?、?、?)");
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){
}ついに{
試す{
if(pstmt!= null){
pstmt.close();
pstmt = null;
}
} catch(sqlexception e){
}
dbmanager.closeconnection();
}
}
}
论坛上看到用下列语句:
复制代码代码如下:
pstmt = conn.preparestatement( "test1(id、name、card、age、address)値(?、?、?、?、?)"); ");
pstmt.setString(1、 "10");
pstmt.setString(2、 "liuwj2");
PSTMT.SetString(3、 "1234567890988777");
pstmt.setString(4、 "22");
pstmt.setString(5、 "123456");
pstmt.execute();
才能打印出sql语句。