代码 :
复制代码代码如下:
paquete com.lwj.test.proxy;
import java.lang.reflect.invocationHandler;
import java.lang.reflect.invocationTargetException;
import java.lang.reflect.method;
import java.lang.reflect.proxy;
import java.sql.connection;
import java.sql.sqlexception;
clase pública dbmanager {
PRIVADO FINAL STICTLOCAL <Enection> conns = new ThreadLocal <Enection> ();
privado static boolean show_sql = true;
Public Final Static Connection getConnection () lanza SQLException {
Conexión conn = (conexión) conns.get ();
if (conn == null || conn.isClosed ()) {
// 这里使用我定义的一个简单的 ConnectionProvider 替代 DataSource 获取 Conexión
Conn = ConnectionProvider.getConnection ();
conns.set (Conn);
}
return (show_sql &&! proxy.isproxyclass (conn.getclass ()))?
new _DebugConnection (Conn) .getConnection (): Conn;
}
/**
* 关闭连接
*/
Public final estática vecina Closeconnection () {
Conexión conn = (conexión) conns.get ();
intentar {
if (conn! = null &&! conn.isClosed ()) {
conn.setAutOcommit (verdadero);
conn.close ();
}
} Catch (SQLException e) {
}
conns.set (nulo);
}
/**
* 用于跟踪执行的 SQL 语句
*/
clase estática _DebugConnection implementa InvocationHandler {
Conexión privada Conn = NULL;
public _DebugConnection (Connection Conn) {
this.conn = Conn;
}
Public Connection getConnection () {
return (conexión) proxy.newproxyInstance (conn.getClass (). getClassLoader (), nueva clase [] {Connection.Class}, esto);
}
Public Object Invoke (proxy de objeto, método m, objeto [] args) lanza lanzamiento
{
intentar
{
Método de cadena = m.getName ();
if ("PrepareStatement" .equals (método) || "createstatement" .equals (método))
{
System.out.println (método);
System.out.println (args [0]);
}
regresar M.invoke (Conn, Args);
} catch (invocationTargetException e) {
tirar e.getTargetException ();
}
}
}
}
paquete com.lwj.test.proxy;
import java.sql.connection;
import java.sql.drivermanager;
Public Class ConnectionProvider {
Conexión estática pública getConnection ()
{
Conexión Connection = NULL;
intentar{
Class.forname ("oracle.jdbc.oracledriver"). NewInstance ();
conexión = Drivermanager.getConnection ("JDBC: Oracle: Thin:@192.168.1.101: 1521: orcl", "Scott", "Tiger");
} Catch (Exception e) {
}
conexión de devolución;
}
}
paquete com.lwj.test.proxy;
import java.sql.connection;
import java.sql.preparedStatement;
import java.sql.resultset;
import java.sql.sqlexception;
import java.sql.statement;
TestMain de clase pública {
Public static void main (String [] args)
{
Conexión conn = nulo;
Instrucción stmt = null;
Preparado PSTMT = NULL;
intentar
{
conn = dbmanager.getConnection ();
stmt = conn.createStatement (resultset.type_scroll_sensitive, resultset.concur_updatable);
stmt.executeUpdate ("Insertar en test1 (id, nombre, tarjeta, edad, dirección) valores (9, 'liuwj', '1234567890988777', 24, 'Hubeitianmen')");
/*pstmt = conn.prepareStatement ("inserte en test1 (id, nombre, tarjeta, edad, dirección) valores (?,?,?,?,?)");
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) {
}finalmente{
intentar{
if (pstmt! = null) {
pstmt.close ();
pstmt = nulo;
}
} Catch (SQLException e) {
}
Dbmanager.Closeconnection ();
}
}
}
论坛上看到用下列语句 :
复制代码代码如下:
pstmt = conn.preparestatement ("inserte en test1 (id, nombre, tarjeta, edad, dirección) valores (?,?,?,?,?)");
pstmt.setString (1, "10");
pstmt.setString (2, "liuwj2");
pstmt.setstring (3, "1234567890988777");
pstmt.setString (4, "22");
pstmt.setString (5, "123456");
pstmt.execute ();
才能打印出 SQL 语句。