代码 :
复制代码代码如下 :
패키지 com.lwj.test.proxy;
import java.lang.reflect.invocationHandler;
import java.lang.reflect.invocationTargetexception;
import java.lang.reflect.method;
java.lang.reflect.proxy import;
java.sql.connection 가져 오기;
java.sql.sqlexception 가져 오기;
공개 클래스 dbmanager {
Private Final STATIC THREADLOCAL <conn
개인 정적 부울 show_sql = true;
공개 최종 정적 연결 getConnection ()가 sqlexception {
연결 conn = (Connection) conns.get ();
if (conn == null || conn.isclosed ()) {
// connectionProvider 替代 DataSource 获取 연결
conn = connectionProvider.getConnection ();
conns.set (conn);
}
return (show_sql &&! proxy.isproxyclass (conn.getClass ()))?
new _debugconnection (conn) .getConnection () : conn;
}
/**
* 关闭连接
*/
공개 최종 정적 무효 CloseConnection () {
연결 conn = (Connection) 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 () {
return (connection) proxy.newproxyInstance (conn.getClass (). getClassLoader (), new Class [] {Connection.class}, this);
}
공개 객체 호출 (객체 프록시, 메소드 m, 개체 [] args) 던지기 가능
{
노력하다
{
문자열 메소드 = M.getName ();
if ( "준비".Equals (메소드) || "CreateStatement".Equals (Method)))
{
System.out.println (메소드);
System.out.println (Args [0]);
}
Return M.Invoke (Conn, Args);
} catch (invocationTargetexception e) {
던지기 e.getTargetexception ();
}
}
}
}
패키지 com.lwj.test.proxy;
java.sql.connection 가져 오기;
Java.SQL.DriverManager 가져 오기;
공개 클래스 ConnectionProvider {
공개 정적 연결 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 import;
java.sql.resultset import;
java.sql.sqlexception 가져 오기;
java.sql.statement import;
공개 수업 시험 관리 {
public static void main (String [] args)
{
연결 Conn = null;
문자 stmt = null;
준비된 상태 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', '12345678988777', 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) {
}마지막으로{
노력하다{
if (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 l