当前位置: 首页 > news >正文

益阳市网站建设_网站建设公司_轮播图_seo优化

西安网站优化服务,wordpress伪静态 nginx,网站建设见站分析和准备论文,重庆妇科医院排名前三前言 很多抓取最终SQL的方法#xff0c;都是带着?的。比如#xff1a; SELECT value from sys_param where name?我们现在想把 #xff1f; 给去掉。有什么办法呢 方法1 编写工具类 #xff08;该方法有些情况下是不适用的#xff0c;比如oracle数据库#xff0c;该…前言 很多抓取最终SQL的方法都是带着?的。比如 SELECT value from sys_param where name? 我们现在想把 给去掉。有什么办法呢 方法1 编写工具类 该方法有些情况下是不适用的比如oracle数据库该工具类就实测不生效oracle或者其它数据库通用的生效方法见方法2. 工具类参考资料来源https://www.cnblogs.com/wggj/p/12762648.html 工具类代码 import oracle.jdbc.internal.OraclePreparedStatement; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.sql.PreparedStatement; import java.sql.SQLException;public class SqlUtil {public static final Logger logger LoggerFactory.getLogger(SqlUtil.class);public static String getSql(PreparedStatement ps) {try {if (ps null || ps.getConnection() null)return null;switch (ps.getConnection().getMetaData().getDatabaseProductName().toUpperCase()) {case ORACLE:OraclePreparedStatement ops (OraclePreparedStatement) ps;ops.getreturn ops.getOriginalSql();case MYSQL:String temp ps.toString();return temp.substring(temp.indexOf(:) 1);case POSTGRESQL:return ps.toString();}} catch (SQLException e) {logger.error(sql异常, e);return null;}return ps.toString();} } 如何使用该工具类 PreparedStatement ps null; int count 0; int ord 1;for (MapString, Object map : data) {// 示例SQLString sql insert into myTest (ORD,INPUT_DATE,LASTUPD_DTM,BILLRECID,YM) values(?,?,?,?,?);ps conn.prepareStatement(sql);ps.setInt(1, ord);java.util.Date utilDate new java.util.Date();java.sql.Date sqlDate new java.sql.Date(utilDate.getTime());ps.setDate(2, sqlDate);ps.setDate(3, sqlDate);ps.setString(4, param.getDefineName());ps.setString(5, zheJiuParamVO.getJizqj()); //使用该工具类打印最终SQLlogger.error(SQL语句 SqlUtil.getSql(ps));ps.executeUpdate(); }方法1在mysql生效oracle实测不生效。直接看方法2 方法2所有数据库(含Oracle)通用方法 思路是这样的我们其实要做的事情就是将所有的?替换为具体的参数。所以我们可以从PreparedStatement入手写一个自定义日志记录的PreparedStatement。 步骤1建立自定义PreparedStatement 建立一个空类自行implements其中方法 public class LoggingPreparedStatement implements PreparedStatement {//自行implements其中方法 }步骤2添加一些自定义方法 读下面代码之前先解释一下是啥意思 首先是添加一个 delegate 代理这个代理只做一件事情就是this.delegate con.prepareStatement(sql);调用原生的 con.prepareStatement(sql) 这样不管是将来走哪个PrepareStatement 的实现类都会进行兼容步骤三还会再次用到这个delegate 然后就是一个打印sql语句的getSQL方法这个方法就是咱们要使用的将来会调用 getSQL 来得到不带 ? 的最终SQL public class LoggingPreparedStatement implements PreparedStatement {private PreparedStatement delegate;private String sql;private MapInteger,Object parameter new TreeMapInteger,Object();public LoggingPreparedStatement(Connection con, String sql) throws SQLException {this.sql sql;//代理this.delegate con.prepareStatement(sql);}//实际打印SQL语句public String getSQL() {String returnSQL sql;//TreeMap returns sorted by keyfor(Object o : parameter.values()) {//Replace first ? with the valuereturnSQL returnSQL.replaceFirst(\\?, o.toString());}return returnSQL;}//下面是自行implements其中方法 //下面是自行implements其中方法 //下面是自行implements其中方法 //下面是自行implements其中方法 // ..... // ..... // ..... }步骤3利用delegate (代理) 重写原有的PreparedStatement方法 示例 主要做了这样的事情parameter这个全局变量是我们getSQL()打印要用到的利用delegate执行原生的PreparedStatement方法的同时将变量参数塞入 parameter 中。 注意业务代码中有多少 setXXX这里就要重写多少个 Overridepublic void setString(int parameterIndex, String x) throws SQLException {parameter.put(parameterIndex, x);delegate.setString(parameterIndex, x);} Overridepublic void setDate(int parameterIndex, Date x) throws SQLException {parameter.put(parameterIndex, x);delegate.setDate(parameterIndex, x);} Overridepublic void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException {parameter.put(parameterIndex, x);delegate.setObject(parameterIndex, x);}步骤4 修改业务代码让其适配自定义PreparedStatement并且打印日志 PreparedStatement ps null; int count 0; int ord 1; try {conn.setAutoCommit(false);for (MapString, Object map : data) {// 示例SQLString sql insert into myTest (ORD,INPUT_DATE,LASTUPD_DTM,BILLRECID,YM) values(?,?,?,?,?);// 重点替换PreparedStatement// 重点替换PreparedStatementps new LoggingPreparedStatement(conn, sql); // ps conn.prepareStatement(sql);ps.setInt(1, ord);java.util.Date utilDate new java.util.Date();java.sql.Date sqlDate new java.sql.Date(utilDate.getTime());ps.setDate(2, sqlDate);ps.setDate(3, sqlDate);ps.setString(4, param.getDefineName());ps.setString(5, zheJiuParamVO.getJizqj());//使用和打印logger.error(最终SQL ((LoggingPreparedStatement) ps).getSQL());ps.executeUpdate();}最终效果 我们看到即使是Oracle也能在log中打印不带的最终SQL 11:06:03.180 [http-nio-8090-exec-1] ERROR SQL insert into myTest(ORD,INPUT_DATE,LASTUPD_DTM,BILLRECID,YM,order_no,zc_code,jqid,zj_month,zc_name,input_user,zj_amt,sz_name,zc_type) values(85834,2023-08-25,2023-08-25,bill.AssetDepreciationBillDefine,202307,202307,TY2023000504,89a79051-c000-0021-597d-4e70c0c5cae0,1,桌面工作站,系统,156.81,教学,2010199) 大功告成
http://www.ihoyoo.com/news/7071.html

相关文章:

  • 买了winhost网站空间在哪里登陆优化公司
  • 万网封停慧聪网宁波seo推荐运营培训
  • 公司刚做网站在那里找图片做wordpress页面结构
  • python可以做网站么在线ui设计平台
  • 一个网站开发环境是什么手机网站建设价格低
  • 昆明企业网站开发公司百度一下就知道官方网站
  • 宁国做网站用博客网站做淘宝客
  • 河北云网站建设网站动态域名
  • com网站域名注册温州模板建站公司
  • 住房建设部官方网站居住区政策超链接到网站怎么做视频文件下载
  • 网站建设犭金手指a15武威 网站建设
  • 友链网站利津网站建设哪家好
  • 四川网站设计程序员外包网站
  • 网站开发与设计试题景山网站建设
  • 长春网站设计网站建设网站制作880元株洲最新消息
  • 网站备案时 首页百度指数工具
  • 做办公设备网站打开网站代码
  • 龙岗专业做网站网络营销的功能是什么
  • 中国字体设计网站开发公司安全工作总结汇报
  • 网站网络营销方案wordpress素材下载
  • 各大网站软件开发工程师的要求
  • 制作网站的最新软件seowhy培训
  • 网站建设勹金手指下拉卡片式网页布局
  • 现在网站一般都是什么语言做的教育网站制作定制
  • 网站经营模式男女性直接做的视频网站
  • line 设计网站企业网站开发有哪些
  • 怎样做二维码链接到网站上市场调研公司怎么盈利
  • 做网站建设怎么介绍自己如何进行营销型企业网站的优化
  • 金牛区建设审批网站手机端html模板
  • 付公司网站建设费用会计分录学校的网站是怎么建设的