`
sunshinevsboy
  • 浏览: 12865 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

 


 


                                   

分享到:
评论

相关推荐

    数据库打包SQL SERVER

    例如,可以创建一个名为`CreateDB`的方法,该方法接收数据库名称、SQL连接字符串作为参数,通过反射获取嵌入的SQL脚本内容,并根据用户输入的连接信息创建新的数据库,然后逐条执行SQL语句以构建数据库结构和数据。...

    SQL获取所有数据库名、表名、储存过程以及参数列表

    ### SQL获取所有数据库名、表名、存储过程...- **p.is_output**: 是否为输出参数。 通过上述方法,我们可以有效地管理SQL Server环境中的数据库、表、字段、存储过程等重要组件,这对于日常的数据库管理任务至关重要。

    使用SQLHelper类调用带输出、返回参数的存储过程

    在IT领域,尤其是在数据库操作与应用开发中,`SQLHelper`类扮演着极其重要的角色,它简化了数据库操作,提供了高效、便捷的方式来执行SQL命令,包括执行非查询语句、查询数据集、读取数据、获取单个值以及填充数据集...

    hibernate显示不带?的完整sql

    综上所述,通过正确配置Hibernate的`hibernate.show_sql`、`hibernate.format_sql`以及日志框架的设置,我们可以得到不带问号的完整SQL输出,以辅助开发和调试工作。在实际项目中,可以参考上述步骤进行设置,确保你...

    如何获得PreparedStatement最终执行的sql语句

    这篇博客可能是探讨如何在实际运行中获取`PreparedStatement`最终执行的SQL语句,这对于调试和分析数据库操作非常有帮助。 在Java中,`PreparedStatement`对象通常会接收参数占位符(如`?`),然后在执行前填充具体...

    解析SQL提取表名并输出文本文件

    如果作者计划进一步完善这个小工具,可能考虑的增强包括添加支持其他数据库系统(如MySQL、Oracle、PostgreSQL等,因为它们的SQL语法略有差异),处理SQL注释,支持多语句文件,以及增加参数选项,如输入和输出文件...

    sql数据库学习课件

    通过学习这个课件,你将能够熟练掌握SQL的基本操作,创建和管理索引,利用触发器和存储过程实现业务逻辑,通过视图简化数据访问,并能高效地检索和处理数据库中的数据。这将为你在数据库管理和开发的道路上打下坚实...

    delphi如何调用sql存储过程,并获取结果

    下面是一个完整的示例代码,展示了如何在Delphi中调用带有输出参数的存储过程,并显示结果: ```delphi procedure TForm1.Button1Click(Sender: TObject); var outCount: Integer; begin // 清除之前的参数 ...

    PHP操作数据库实现录入、输出数据

    在这个"PHP操作数据库实现录入、输出数据"的主题中,我们将探讨如何使用PHP与MySQL交互,实现数据的存取和展示,以及用户注册、登录验证功能。 首先,让我们看看如何在PHP中连接到MySQL数据库。通过`mysqli_connect...

    (C#)Oracle数据库操作类(操作sql语句)

    - 虽然在提供的内容中未列出,但通常还会包含执行查询(返回数据集)、执行存储过程(可能返回结果集和输出参数)等方法。这些方法会使用`ExecuteReader`或`ExecuteScalar`方法,并可能涉及填充`DataTable`或创建...

    sqlserver数据库说明书生成工具

    1. 数据库连接:工具支持连接到SQLServer数据库,用户只需提供相应的服务器地址、数据库名、用户名和密码,即可轻松建立连接,获取数据库中的所有表信息。 2. 表结构解析:该工具能够自动遍历并解析数据库中的每个...

    将SQL数据库表转换成XML文件输出(脚本)

    ### 将SQL数据库表转换成XML文件输出(脚本) #### 概述 在实际工作中,经常需要将数据库中的表数据导出为其他格式以便于传输或与其他系统进行交互。其中,XML作为一种广泛使用的数据交换格式,具备良好的跨平台性...

    DbHelperSQL_SQL_Server数据库操作类

    5. **存储过程调用**:如果应用中使用了存储过程,DbHelperSQL_SQL_Server会提供相应的方法来执行存储过程,并能够传递输入、输出或输入/输出参数。 6. **数据填充**:为了方便地将查询结果填充到数据集(DataSet)...

    Oracle 数据库SQL和PLSQL实例教程

    本文档标题为《Oracle 数据库SQL和PLSQL实例教程》,是一份面向新手的进阶教程,涵盖了大量可以直接使用的Oracle数据库操作实例。Oracle数据库是全球领先的企业级数据库管理系统之一,支持SQL(结构化查询语言)和...

    C#SqlParameter参数写法

    在进行数据库操作时,它能有效地防止SQL注入攻击,并提高应用程序的性能。`SqlParameter`对象可以包含多种类型的数据,如字符串、整数等,并且可以被设置为输入或输出参数。 #### 创建SqlParameter实例 在提供的...

    四、QT实现图形界面对数据库的操作

    而`SQL`可能包含源代码文件,特别是与数据库操作相关的C++源码,如数据库连接设置、SQL查询的实现等。 总的来说,QT5为开发者提供了便利的工具和类库来实现图形界面对数据库的操作,使得创建功能丰富的数据库应用变...

    原样输出mybatis的sql执行语句(mysql和oracle都可用).zip

    总结,通过启用MyBatis日志和利用Spring的AOP,我们可以轻松地在SpringBoot和SSM项目中获取并输出MyBatis执行的SQL语句。这个方法对于MySQL和Oracle数据库同样有效,有助于开发者更好地理解和优化数据库操作。在实际...

    sql数据库文档生成器

    存储过程则会展示其输入/输出参数和执行代码。 4. **自定义模板**:为了满足不同用户的需求,文档生成器可能支持自定义模板,允许用户根据项目需求调整输出的样式和布局。 5. **版本控制**:如果工具集成了版本...

    SQL SERVER数据库开发之存储过程应用.rar

    在SQL Server数据库开发中,存储过程是至关重要的一个部分,它是一种预编译的SQL语句集合,可以被多次调用,以提高数据库操作的效率和安全性。本教程旨在深入探讨存储过程在SQL Server中的应用,帮助开发者更好地...

Global site tag (gtag.js) - Google Analytics