得到PrepareStatement最终执行的sql语句的方法

Mybatis 获取最终可执行SQL语句 Mybatis 获取参数解析后,最终的可执行SQL 阅读详情

得到PrepareStatement最终执行的sql语句的方法  

在优快云的JAVA基础版,常常有人问及如何得到PreparedStatement最终执行的SQL语句;或者如何在控制台输出占位符的真实值.....

原因就是PreparedStatement执行的sql语句有大量的占位符?....

问题诸如JDBC中:

如何得到 conn.prepareStatement 最终执行的sql语句。

sql="update table1 set a=?,b=?"

stmt = con.prepareStatement(sql);

stmt.setObjec t(1,"a");

stmt.setObjec t(2,"b");

希望可以通过stmt或者conn 得到:

update table1 set a='a',b='b'

亦或Hibernate中

如我执行:find("select * from t_table where id = ?",new Integer(5));

在控制台显示SQL时只显示:select * from t_table where id = ?

如何才能做到将控制台显示的占位符用其真实的值来替换?

即控制台输出时显示:select * from t_table where id = 5

无它,无论JDBC还是Hiberante都不提供默认解决方案,但是参数是设置进去的,我们在设置的过程中可以有充分的理由来截取并获得自己想要的东西,类似于AOP理论。

共享我在工程中的使用方法:

插入操作:

/**

     * 执行插入数据库的语句

     * @param sql

     * @param params

     * @return 返回生成的主键

     */

    public int executeInsert(String sql, Object[] params) {

        Connection conn = null;

        PreparedStatement pstmt = null;

        ResultSet rs = null;

        try {

            //1 获得连接

            conn = MyDBConnection.getInstance().getConnection();

            //2 设置提交方式为程序控制

            conn.setAutoCommit(false);

            //3 获得语句对象

            pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

            //4 设置SQL语句的参数

            if (null != params && 0 < params.length) {

                setParams(pstmt, params);

            }

            //5 打印SQL语句

            if (MyDBConstants.showSQL) {

                getPreparedSQL(sql, params);

            }

            //6 执行语句

            pstmt.executeUpdate();

            //7 程序提交

            conn.commit();

            //8 返回生成的主键

            rs = pstmt.getGeneratedKeys();

            int generatedKey = 0;

            if (rs.next()) {

                generatedKey = rs.getInt(1);

            }

            if (0 < generatedKey)

                throw new MySQLException("插入记录时出错");

            return generatedKey;

        } catch (SQLException e) {

            //回滚

            MyDBUtil.rollBack(conn);

            throw new MySQLException(e);

        } finally {

            //关闭打开的操作

            MyDBUtil.close(conn, pstmt, rs);

        }

    }

更新查找操作:

/**

     * 执行更新或者删除数据库的语句

     * @param sql

     * @param params

     * @return 返回执行成功与否

     */

    public boolean executeUpdateDel(String sql, Object[] params) {

        boolean isSuccess = false;

        Connection conn = null;

        PreparedStatement pstmt = null;

        try {

            //1 获得连接

            conn = MyDBConnection.getInstance().getConnection();

            //2 设置提交方式为程序控制

            conn.setAutoCommit(false);

            //3 获得语句对象

            pstmt = conn.prepareStatement(sql);

            //4 设置SQL语句的参数

            if (null != params && 0 < params.length) {

                setParams(pstmt, params);

            }

            //5 打印SQL语句

            if (MyDBConstants.showSQL) {

                getPreparedSQL(sql, params);

            }

            //6 执行语句

            pstmt.executeUpdate();

            //7 程序提交

            conn.commit();

            //8 设置语句执行的标记

            isSuccess = true;

        } catch (SQLException e) {

            //回滚

            MyDBUtil.rollBack(conn);

            throw new MySQLException(e);

        } finally {

            //关闭打开的操作

            MyDBUtil.close(conn, pstmt);

        }

        return isSuccess;

    }

执行查询

 1 /**

 2      * 执行查询数据库的语句;

 9      *

10      * @return

11      */

12     public Object executeQuery(String sql, Object[] params) {

13         Connection conn = null;

14         PreparedStatement pstmt = null;

15         ResultSet rs = null;

16         try {

17             //1 获得连接

18             conn = MyDBConnection.getInstance().getConnection();

19             //2 设置提交方式为程序控制

20             conn.setAutoCommit(false);

21             //3 获得语句对象

22             pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

23             //4 设置SQL语句的参数

24             if (null != params && 0 < params.length) {

25                 setParams(pstmt, params);

26             }

27             //5 打印SQL语句

28             if (MyDBConstants.showSQL) {

29                 getPreparedSQL(sql, params);

30             }

31             //6 执行语句

32             rs = pstmt.executeQuery();

33 

34             //9 程序提交

35             conn.commit();

36 

37             //10 获得记录

38             Object vo = new Object();

39             if (null != rs && rs.next()) {

40                 vo = rs2vo(rs);

41             }

42 //            return results;

43             return vo;

44         } catch (SQLException e) {

45             //回滚

46             MyDBUtil.rollBack(conn);

47             throw new MySQLException(e);

48         } finally {

49             //关闭打开的操作

50             MyDBUtil.close(conn, pstmt, rs);

51         }

52     }

看到getPreparedSQL(sql, params)了么? 这个地方就是要实现我们预期效果的地方:

得到PrepareStatement最终执行的sql语句的方法 - shmily - 我的地盘我做主得到PrepareStatement最终执行的sql语句的方法 - shmily - 我的地盘我做主得到PrepareStatement最终执行的sql语句的方法

 1 /**

 2      * 获得PreparedStatement向数据库提交的SQL语句

 3      * @param sql

 4      * @param params

 5      * @return

 6      */

 7     private String getPreparedSQL(String sql, Object[] params) {

 8         //1 如果没有参数,说明是不是动态SQL语句

 9                 int paramNum = 0;

10                 if (null != params)  paramNum = params.length;

11         if (1 > paramNum) return sql;

12         //2 如果有参数,则是动态SQL语句

13         StringBuffer returnSQL = new StringBuffer();

14         String[] subSQL = sql.split("\\?");

15         for (int i = 0; i < paramNum; i++) {

16             if (params[i] instanceof Date) {

17                 returnSQL.append(subSQL[i]).append(" '").append(MyDateUtil.dateUtil2SQL((java.util.Date)params[i])).append("' ");

18             } else {

19                 returnSQL.append(subSQL[i]).append(" '").append(params[i]).append("' ");

20             }

21         }

22 

23         if (subSQL.length > params.length) {

24             returnSQL.append(subSQL[subSQL.length - 1]);

25         }

26         return returnSQL.toString();

27     }

28 

29     /**

30      * 为PreparedStatement预编译的SQL语句设置参数

31      * @param pstmt

32      * @param params

33      */

34     private void setParams(PreparedStatement pstmt, Object[] params) {

35             if (null != params) {

36                 for (int i = 0, paramNum = params.length; i < paramNum; i++) {

37                     try {

38                         if (null != params[i] &&

39                             params[i] instanceof java.util.Date) {

40                             pstmt.setDate(i + 1, MyDateUtil.dateUtil2SQL(

41                                     (java.util.Date) params[i]));

42                         } else {

43                             pstmt.setObject(i + 1, params[i]);

44                         }

45                     } catch (SQLException e) {

46                         throw new MySQLException(e);

47                     }

48                 }

49             }

50     }

然后轻松核实你的控制台或者日

JDBC基础--[JDBC概述,JDBC的搭建,PreparedStatement和Statement执行SQL语句,结果集处理] 目录JDBC概述JDBC搭建 JDBC概述 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。 由一组用Java语言编写的类和接口组成 对于数据库的操作无非就是增删改查的操作;java语言的开发者并不会直接进行数据库的操作;而是定义了一些接口,最终是由数据库的开发商去 阅读详情

相关推荐

数据中心光模块升级实录:从200G QSFP56到400G QSFP-DD的踩坑指南

本文记录了数据中心从200G QSFP56升级至400G QSFP-DD光模块的完整实战经验。文章深入剖析了升级过程中面临的兼容性、链路预算、布线、散热与功耗管理等核心挑战,并提供了具体的解决方案与排坑指南,为高速网络升级提供了宝贵的实践参考。

butter的博客 479

preparestatment获取sql_如何从Oracle, MySql, PostgreSQL的PreparedStatement获得所执行的sql语句?...

一、问题提出从且只从一个PreparedStatement中获取执行的sql语句(包括运行时绑定的参数值),是实际工作中经常遇到的一个问题。网上很多文章提到用自定义的增强类或中间件(p6spy, log4jdbc)来实现,但这需要对现有代码进行修改,工作量很大,能不能有更直接的办法?由于java.sql.PreparedStatement并没有提供相应接口,此功能是否实现及如何实现,不同数据库的J...

weixin_39630771的博客 1947

解决nfs挂载根文件系统报错:VFS: Unable to mount root fs via NFS, trying floppy.

解决nfs挂载根文件系统报错的问题:VFS: Unable to mount root fs via NFS, trying floppy.

汉尼拔勇闯天涯 4574

基于PreparedStatement抓取带参最终SQL(oracle,mysql,PostgreSQL等通用)

在日志中打印所有数据库通用的不带?的原生SQL,放在navicat就能直接执行

大吉的博客 3724

西门子Industrial Copilot实战:5个工业场景下的AI效率提升案例

本文通过五个工业场景实战案例,深入解析西门子Industrial Copilot如何将工业智能转化为实际生产力。从自动化配置、预测性维护到能源优化与人机交互,这位AI助手显著缩短工程周期、提升设备可用率并降低运营成本,展示了其在工业领域系统化、工程化的落地价值。

3c4x5z6v7b的博客 928

告别黑窗口:XShell+X11转发图形化界面的5分钟保姆级教程(附Xming配置)

本文详细介绍了如何使用XShell和X11转发技术快速实现Linux图形化界面的远程访问。通过5分钟快速配置指南,包括服务端设置、客户端工具选择及XShell+Xming的完美配置,帮助用户高效运行GUI应用程序,提升远程工作效率。特别适合需要图形化操作的开发者和运维人员。

weixin_29223603的博客 328

preparestatment获取sql_如何获取PreparedStatement的SQL?

它在JDBC API合同中没有任何定义,但是如果你很幸运,有问题的JDBC驱动程序可以通过调用返回完整的SQLPreparedStatement#toString()。即System.out.println(preparedStatement);至少MySQL 5.x和PostgreSQL 8.x JDBC驱动程序支持它。但是,大多数其他JDBC驱动程序不支持它。如果你有这样的,那么你最好的选择...

weixin_39603117的博客 2660

从选卡到验证:CST仿真GPU加速全流程实战指南

本文详细介绍了CST仿真中GPU加速的全流程实战指南,从硬件选型到软件配置,再到性能验证和常见问题排查。通过对比专业卡与游戏卡的性能差异,提供硬件选型建议,并分享驱动安装、关键设置及CST软件配置的黄金法则,帮助用户显著提升仿真效率。

weixin_30650039的博客 394

mybatis运用xml映射sql的源码思考

解决问题:首先我们需要理解Mybatis的主要用处,就是封装JDBC,避免繁杂的配置。将数据库的数据源封装起来,mybatis将sql语句通过网络协议发送给数据库进行执行,将结果集返回给java程序。然后调用select方法的时候中间一些源码做了发送sql给数据库执行,并不是在java程序里面执行的(后面涉及了网络通信就不深究了))->selectList->prepareStatement->exectue->sendCommand(发送sql给数据库进行执行sql语句)Mybatis映射问题。

lai_zhe的博客 261

TSMC40nmLP版图实战:从Design Rule解读到Cadence高效布局布线

本文详细解析了TSMC40nmLP工艺的版图设计实战,从Design Rule解读到Cadence高效布局布线技巧。重点介绍了40nm工艺中的关键设计规则,如最小线宽、间距规则和深N阱规则,并分享了Cadence Virtuoso中的高效工作流和射频模块设计技巧,帮助工程师提升版图设计效率和质量。

weixin_29250403的博客 378

芯片硅前验证技术与驱动工程师实战指南

硅前验证是芯片开发流程中的关键环节,通过pre-silicon simulation等技术手段在流片前验证设计正确性。其核心技术包括软件仿真、FPGA原型验证和硬件仿真器解决方案,涉及Linux驱动开发、芯片架构理解和波形分析等核心技能。作为连接芯片设计与系统集成的桥梁,硅前验证能早期发现设计缺陷,节省数百万美元流片成本。以Cadence Palladium为代表的硬件仿真器,通过专用服务器系统实现比纯软件方案快100-1000倍的仿真速度,为驱动工程师提供完整的外设模型验证环境。掌握硅前验证技术可显著提升

weixin_42522857的博客 323

关于prepareStatement可以防止SQL注入的理解

prepareStatement的两个作用: 1. 预处理功能,在多次执行相同的SQL语句的情况可以大幅提高执行效率; 2. 杜绝SQL注入的风险。

liuxiaoddd的专栏 6802

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go)

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go)

算法大师! 793

PrepareStatement概述

PrepareStatement概述 Statement安全问题 Statement执行 ,其实是拼接sql语句的。 先拼接sql语句,然后在一起执行。 String sql = "select * from t_user where username='"+ username +"' and password='"+ password +"'"; UserDao dao = ne...

云飞扬°的博客 9995

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

第十六节 JDBC PrepareStatement对象执行批量处理实例

JDBC PrepareStatement对象执行批量处理实例

weixin_43860634的博客 1687

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java用PrepareStatement实现多sql语句执行

在开发中,不可避免的会涉及到多sql语句共同执行的情况,成功则所有数据发生更改,失败则所有数据都不做更改。而老的Statement对象可以执行把sql语句addBatch(sql)进去,而后统一执行。但是PrepareStatement对象不一样,虽然它是继承了Statement,但是如果用addBatch(sql)的话没必要用PrepareStatement。自己对其使用稍作了整理,供各位朋友参考,不足之处朋友尽可指正,谢谢!

Iven.Yeung 6631

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

批量执行SQL语句

批量执行SQL语句 首选创建名为test的表 //sql create table test(id int,name,varchar(30)); 1、使用createStatement()方法 //java public static void main(String[] args) { try { //从连接池获得连接 Connection conn = DBUtil.getConnection(); //获得执行SQL语句的对象 Statement st = conn.cr

qq_37481306的博客 993

preparestatment获取sql_利用JDBC的PrepareStatement打印真实SQL的方法详解

前言本文主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:我们知道,JDBC 的 PrepareStatement 优点多多,通常都是推荐使用 PrepareStatement 而不是其基类 Statment。PrepareStatement 支持 ? 占位符,可以将参数按照类型转自动换为真实的值。既然这一...

weixin_39716971的博客 1174

PrepareStatement和Statement的区别

PrepareStatement:对SQL进行预编译,在数据库中形成“执行计划”,可以对SQL语句中的“变量参数“进行修改,这样可以减少数据库不必要的反复创建“执行计划”, package dbcpool; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; ...

weixin_42976232的博客 8537

SQL语句的执行:Statement、PrepareStatement、CallableStatement

 Connection 接口中的三个方法可用于创建这些类的实例。下面列出这些类及其创建方法:  (1) Statement ─ 由方法 createStatement 所创建。Statement 对象用于发送简单的SQL 语句。  (2) PreparedStatement ─ 由方法 prepareStatement 所创建。  (3) PreparedStatement 对象用于发送带有一个或

songgl的专栏 2380

MySQL 预处理语句prepare、execute、deallocate的使用,执行动态sql

MySQL官方将prepare、execute、deallocate统称为PREPARE STATEMENT。 我习惯称其为【预处理语句】。 其用法十分简单, PREPARE stmt_name FROM preparable_stmt EXECUTE stmt_name [USING @var_name [, @var_name] ...] - {DEALLOCATE | DROP} PREPARE stmt_name 举个栗子: mysql> PREPARE pr1 FROM '

RealRoman的博客 2094

JDBC常用接口PrepareStatement

在新手推荐JSP+JavaBean+Servlet MVC模式用户注册模块中,有关数据库的操作,我们用到了: String sql ="select * from tb_user WHERE username=?"; PreparedStatement ps = connection.prepareStatement(sql); ps.setString(1, username); R

王浴昊 7671

statement和prepareStatement的区别

一、语法 两者的语法区别 statement语法 Statement stmt = connect.createStatement(); String sql= "SELECT * FROM cg_user WHERE userId=10086 AND name LIKE 'xiaoming'"; ResultSet rs = stmt.executeUpdate(sql); prepar...

HaC 的博客 1万+

prepareStatement执行sql语句报错空指针异常

conn.prepareStatement执行sql语句报错空指针异常 发现是数据库jar包没有导入正确,修改为如图后,恢复正常,空指针异常消失了。

ciakkk的博客 1887

Java之MySQL中prepareStatement的基本使用

1.什么是prepareStatement prepareStatement是表示预编译的 SQL 语句的对象。 2.为什么使用prepareStatement 1.以前的statement的执行,是先拼接sql语句然后在一起执行。在这种情况下,如果sql语句中的变量带有了数据库的关键字,那么一并认为是是关键字,而不是普通的字符串。 2.使用prepareStatement时,预先处理给定的S...

qq_45920729的博客 3661

PrepareStatement用法(附源码解析)

PrepareStatement 基本用法 与 SQL注入分析

Sherlock1020的博客 6430
上一篇: Java Statement
下一篇: Java中什么是接口回调?
Hack_Bug
博客等级 码龄15年 34粉丝 25原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值