获取操作数据库的sql并输出带参数的

   对p6spy源码分析;自己写了段代码实现了把hibernate 输出的?映射到了具体的参数值:(本代码可能会有性能上的问题;敬请谅解 以后改进)

 

基本思想 在hibernate 和数据库之间的连接层中间加入自己定义的datasource:

 

spring 中的文件配置如下

 

 <bean id="dataSource1"  class="com.yineng.datasource.C1DataSource">
            <property name="datasource" ref="dataSource"></property>
    </bean>
   
  
    <bean id="jdbcTemplet"
  class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource1"></property>
 </bean>

 

自定义的C1DataSource类如下:

 

 /**
 
*@see 把前台所有操作的原生SQL记录到指定的文件中
 *
 */
public class C1DataSource implements DataSource{
   
    private DataSource  datasource;
    private Connection  injectConnect;
 
 @Override
 public Connection getConnection() throws SQLException {
  // TODO Auto-generated method stub
  Connection connection = null;
  
  if(datasource!=null){
      connection = this.datasource.getConnection();
  }else if(injectConnect!=null) {
   connection = injectConnect;
  }else{
   throw new SQLException("connection or datasource is required inject!");
  }
  
  C1CoreFactory  coreFactory = new C1CoreFactory();
  C1WriteLog.setConnection(connection);//为写日志时做准备
  
  return coreFactory.getConnection(connection);//
返回了自定义的Connection
 }

 @Override
 public Connection getConnection(String username, String password)
   throws SQLException {
  // TODO Auto-generated method stub
  return this.datasource.getConnection(username, password);
 }

 

自定义的C1Connection implements Connection 代码如下:

主要重写了其中的两个方法(还有其它的 不贴了)

@Override
 public Statement createStatement(int resultSetType, int resultSetConcurrency)
   throws SQLException {
  // TODO Auto-generated method stub
  return this.passthru.createStatement(resultSetType, resultSetConcurrency);
 }

 @Override
 public Statement createStatement(int resultSetType,
   int resultSetConcurrency, int resultSetHoldability)
   throws SQLException {
  // TODO Auto-generated method stub
  return this.passthru.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
 }

 

还重写了部分类 重写类如下

C1Array.java 

C1CallableStatement.java 

C1PreparedStatement.java

C1ResultSet.java

C1Statement.java

我们可以在这些代码中加入自己想要的代码(代码提供下载)

 

我们还可以做些备份工作比如 在删除或更新一条数据之前我们可以把数据先select 放到文件中然后再执行删除(可以实现传说中的数据闪回)。

 


 


                                   

你可能感兴趣的:(spring,sql,bean,Hibernate,jdbc)