代码
复制代码代码如下:
pacote com.lwj.test.proxy;
importar java.lang.reflect.invocationHandler;
importar java.lang.reflect.invocationTargeTexception;
importar java.lang.reflect.method;
importar java.lang.reflect.proxy;
importar java.sql.connection;
importar java.sql.sqLexception;
classe pública dbmanager {
Final estático privado Threadlocal <neconne> Conns = new Threadlocal <neconnect> ();
privado booleano estático show_sql = true;
Public Final Static Connection getConnection () lança sqlexception {
Conexão conn = (conexão) Conn.get ();
if (conn == null || conn.iscLosed ()) {
// 这里使用我定义的一个简单的 ConnectionProvider 替代 DataSource 获取 Conexão
Conn = ConnectionProvider.getConnection ();
Conn.set (Conn);
}
return (show_sql &&! proxy.isproxyclass (conn.getclass ()))?
novo _debugConnection (Conn) .getConnection (): Conn;
}
/**
* 关闭连接
*/
public final estático void CloseConnection () {
Conexão conn = (conexão) Conn.get ();
tentar {
if (Conn! = NULL &&! Conn.Iclosed ()) {
Conn.SetAutocomit (true);
Conn.Close ();
}
} catch (sqlexception e) {
}
Conn.set (NULL);
}
/**
* 用于跟踪执行的 SQL 语句
*/
classe estática _debugConnection implementa InvocationHandler {
conexão privada Conn = null;
public _debugConnection (conexão conn) {
this.conn = Conn;
}
Public Connection getConnection () {
return (conexão) proxy.newProxyInstance (Conn.getClass (). getClassLoader (), nova classe [] {Connection.class}, este);
}
Public Object Invoke (proxy do objeto, método m, objeto [] args) lança arremesso
{
tentar
{
Método da String = M.GetName ();
if ("PreparEstatement" .Equals (Method) || "CreateStatement" .Equals (Method))
{
System.out.println (método);
System.out.println (args [0]);
}
retornar M.Invoke (Conn, Args);
} catch (InvocationTargeTexception e) {
arremesso e.gettargetexception ();
}
}
}
}
pacote com.lwj.test.proxy;
importar java.sql.connection;
importar java.SQL.DriverManager;
classe pública ConnectionProvider {
conexão estática pública getConnection ()
{
Conexão de conexão = null;
tentar{
Class.ForName ("oracle.jdbc.oracledriver"). NewInstance ();
conexão = DriverManager.getConnection ("JDBC: Oracle: Thin:@192.168.1.101: 1521: orcl", "Scott", "Tiger");
} catch (Exceção e) {
}
retornar conexão;
}
}
pacote com.lwj.test.proxy;
importar java.sql.connection;
importar java.SQL.PreparedStatement;
importar java.sql.resultset;
importar java.sql.sqLexception;
importar java.sql.statement;
classe pública Testmain {
public static void main (string [] args)
{
Conexão conn = null;
Instrução stmt = null;
Preparado PSTMT de estatuto preparado = null;
tentar
{
Conn = dbManager.getConnection ();
stmt = Conn.Createstatement (ResultSet.Type_Scroll_sensitive, ResultSet.Concur_UpDatable);
stmt.executeUpdate ("Inserir no teste1 (id, nome, cartão, idade, endereço) valores (9, 'liuwj', '1234567890988777, 24,' hubeitianmen ')");
/*pstmt = Conn.Preparestatement ("Inserir no teste1 (id, nome, cartão, idade, endereço) 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{
tentar{
if (pstmt! = null) {
pstmt.close ();
pstmt = null;
}
} catch (sqlexception e) {
}
DbManager.ClosEConnection ();
}
}
}
论坛上看到用下列语句
复制代码代码如下:
pstmt = Conn.Preparestatement ("Inserir no teste1 (id, nome, cartão, idade, endereço) valores (?,?,?,? ,?)");
Pstmt.SetString (1, "10");
Pstmt.SetString (2, "Liuwj2");
Pstmt.SetString (3, "1234567890988777");
Pstmt.SetString (4, "22");
Pstmt.SetString (5, "123456");
pstmt.execute ();
才能打印出 SQL 语句。