对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 放到文件中然后再执行删除(可以实现传说中的数据闪回)。