jdbc preparedstatement 自动转义问题

问题描述

目前正在做一套框架,需求如下,prepaerdstatement.setString 里面可以是一段sql语句代码如下: 这一段代码是由框架自动完成好的,然后目的是将这个注入到sql中,但是 prepaerdstatement 自动在整个外围添加2个单引号,所以就不能执行,因为该框架式在mybtis3的基础上进行封装的,就是需要pstmt.setString(' and 1=1 and 2=2 and 3=3 ') 这种需求;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;public class test {public static void main(String[] args){ try{ Class.forName("com.mysql.jdbc.Driver"); }catch(ClassNotFoundException e1){ e1.printStackTrace(); } String url="jdbc:mysql://localhost:3306/test"; Connection conn; try { conn = DriverManager.getConnection(url, "root","123456"); PreparedStatement st = conn.prepareStatement("select count(1) from (select * from test where 1=1 ?) tmp_count "); st.setString(1, " and 1=1 and 2=2 and 3=3 "); st.execute(); st.close(); conn.close(); } catch (SQLException e){ e.printStackTrace(); } }}

解决方案

说要这样需求的人,基本是不懂JDBC绑定变量的原理啊。基于mybatis的话,可以这样做,写一个实现自mybatis自定义的拦截器,拦截StatementHandler的prepare方法,获取RowBounds中的sql,把需要拼接的sql动态拼接上去,再置回RowBounds,然后执行。

时间: 2024-07-29 05:19:41

jdbc preparedstatement 自动转义问题的相关文章

SQL jdbc解决自动自动增长列统一处理问题纪实

sql|解决|问题 sql server2005 jdbc解决自动自动增长列统一处理问题纪实 作者fbysssmsn:jameslastchina@hotmail.com  blog:blog.csdn.net/fbysss声明:本文由fbysss原创,转载请注明出处 关键字:自动增长列,jdbc,sqlserver2005 背景:系统要支持多种数据库,统一insert的时候获取自动增长列的处理方式问题1:insert+select方案sqlserver2000可以使用insertSql  +

ThinkPHP提交表单时默认自动转义的解决方法_php实例

本文实例讲述了ThinkPHP提交表单时默认自动转义的解决方法.分享给大家供大家参考.具体方法如下: 一.问题: 在ThinkPHP中提交表单插入数据的时候,单引号和双引号是会被自动转义的,就是会自动的加上反斜线,但是我不想给单引号和双引号加上反斜线. 在ThinkPHP中提交表单插入数据的时候,单引号和双引号是会被自动转义的,就是会自动的加上反斜线,但是我不想给单引号和双引号加上反斜线,在ThinkPHP中提交表单插入数据的时候,单引号和双引号是会被自动转义的,就是会自动的加上反斜线,但是我不

jdbc preparedstatement允许输入的查询字符有哪些?

问题描述 现在做的这个查询时模糊查询,在前端页面查询输入框中输入"%",查询出所有数据,输入"'"后台就报错了,以前没有这样试过,谁知道jdbc preparedstatement允许输入的查询字符有哪些?有点纠结-- 解决方案 典型的SQL注入问题,不要用+去拼SQL的条件,用查询变量?去做查询条件解决方案二:这个应该与preparedstatement没多大关系吧,应该跟具体的数据库实现有关系.另外对于前段传给后台的特殊字符最好encode下

ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法_php技巧

ThinkPHP的conf文件中的Convention.php有一个配置选项 'DEFAULT_FILTER'        =>  'htmlspecialchars', // 默认参数过滤方法 用于I函数... 默认这个方法是开启的.也就是说,我们往数据库里面存储的数据中都会经过htmlspecialchars这个函数的转义处理. 我在我的项目中使用了Kindeditor富文本编辑器(或许你使用的是Ueditor\ckeditor),通过富文本编辑器编辑文章的内容然后存储到数据库中,再从数据

ThinkPHP出现自动转义解决办法总结

这种情况是在 php.ini中的magic_quotes_gpc 开启的情况下发生的.原因是thinkphp在入库的时候没有判断 magic_quotes_gpc 是否开启,直接进行了转义处理. 我的解决办法:在baseAction中自动执行  代码如下 复制代码 public function _initialize()       {           //去除转义 不用系统的自动转义           if (get_magic_quotes_gpc()) {            

PHP如何自动转义和还原字符串

实例1 <head> <metahttp-equiv="Content-Type"content="text/html; charset=gb2312"> <title>自动对字符串进行转义和还原</title> <styletype="text/css"> <!-- body { background-color: #FFCCFF; } --> </style>

sql server2005 jdbc解决自动增长列统一处理问题纪实

背景:系统要支持多种数据库,统一insert的时候获取自动增长列的处理方式 问题1:insert+select方案 sqlserver2000可以使用insertSql + SELECT @@IDENTITY AS 'Identity'的方式来获得,但是mysql则只能使用executeUpdate(insertSql); executeQuery('SELECT last_insert_id() ')这样的方式,否则会抛出异常:java.sql.SQLException: Can not is

JDBC PreparedStatement 批量查询 in 的实现 方案

    我们经常会有这种业务需求,根据一个条件集合去查询一张表的数据,比如: select * from all_element t where t.task_id in (List <taskids>);     在java语言中,我们需要用到JDBC来和数据库打交道,那么在JDBC中该如何处理这种需求呢?我们可以有如下几种处理方式 方案一:写一个函数把参数集合转换成一个or 条件 或 in 条件的字符串,最后拼成一个sql select * from all_element t where

详解Java的JDBC API的存储过程与SQL转义语法的使用_java

正如一个Connection对象创建Statement和PreparedStatement对象,它也创造了CallableStatement对象这将被用来执行调用数据库存储过程. 创建CallableStatement对象:假设,需要执行以下Oracle存储过程: CREATE OR REPLACE PROCEDURE getEmpName (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS BEGIN SELECT first INTO EMP_FIRST