代码:
复制代码代码如下:
包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语句。