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

PreparedStatement字符串拼接

    博客分类:
  • j2ee
阅读更多
这在里求JDBC中PreparedStatement的实现,我想不会是这样来拼接。
package com.dicmo.test;

import java.util.ArrayList;
import java.util.List;


public class PreparedStatement{
	private String sql;
	
	public String getSql() {
		return sql;
	}
	public void setSql(String sql) {
		this.sql = sql;
	}
	PreparedStatement(String sql){
		this.sql = sql;
	}
	public void setInt(int index,int value){
		List <Integer> indexList = new ArrayList<Integer>();
			char [] sqlArray = sql.toCharArray();
			for (int i=0;i<sqlArray.length;i++){
				if('?'==sqlArray[i]){
					indexList.add(i);
				}
			}
			sql = sql.substring(0,Integer.parseInt(indexList.get(index-1).toString()))
			+"?"+value+sql.substring(Integer.parseInt(indexList.get(index-1).toString())+1);
			System.out.println(sql);
	}
	
	public void setString(int index,String value){
		List <Integer> indexList = new ArrayList<Integer>();
		char [] sqlArray = sql.toCharArray();
		for (int i=0;i<sqlArray.length;i++){
			if('?'==sqlArray[i]){
				indexList.add(i);
			}
		}
//这里使用?继续做占位符,保持参数的位置不变
//在最后面把?全替换掉
			sql = sql.substring(0,Integer.parseInt(indexList.get(index-1).toString()))
			+"?\'"+value+"\'"+sql.substring(Integer.parseInt(indexList.get(index-1).toString())+1);
	}
	
	public String makeNewSql(String sql){
		char [] a = sql.toCharArray();
		for(int i=0;i<a.length;i++){
			if('?'==a[i]){
				a[i]=' ';
			}
		}
		String newSQL = new String(a).replaceAll("  "," ");
		return  newSQL;
	}
	public static void main(String [] args){
		String sql ="SELECT * FROM user WHERE id = ? AND name = ? AND sex = ? And age = ? AND title = ?";
		PreparedStatement ps = new PreparedStatement(sql);
//这里的setXXX可以是任意顺序。前面的?占位符起了作用。
//如:ps.SetXXX(2,xxx);
//   ps.SetXXX(1,xxx);

		ps.setInt( 1, 2);
		ps.setString( 2, "dicmo");
		ps.setString( 3, "男");
		ps.setInt(4, 10);
		ps.setString(5, "JAVA fan");
		System.out.println(ps.makeNewSql(ps.getSql()));
	}
	
}

?替换处理前:
SELECT * FROM user WHERE id = ?2 AND name = ?'dicmo' AND sex = ?'男' AND age = ?10 AND title = ?'JAVA fan'

?替换处理后:
SELECT * FROM user WHERE id = 2 AND name = 'dicmo' AND sex = '男' AND age = 10 AND title = 'JAVA fan'


1
0
分享到:
评论

相关推荐

    ibatis拼接字符串

    在本篇文章中,我们将深入探讨如何使用 Java 编程语言结合 iBatis 框架进行 SQL 字符串的动态拼接。通过分析提供的代码片段,我们可以了解到在实际开发过程中,这种动态 SQL 的构建方式非常常见,尤其是在处理复杂的...

    sql的封装,不需要使用StringBuffer进行字符串拼接

    总的来说,避免使用`StringBuffer`进行SQL字符串拼接,转而采用PreparedStatement或者ORM框架,是现代SQL编程的最佳实践。它不仅能提高程序性能,减少内存消耗,还能显著增强系统的安全性,降低SQL注入的风险。在...

    PreparedStatement详细用法

    这种方式避免了每次执行SQL语句时都要重新解析和构建SQL字符串,减少了字符串拼接操作,进一步提高了性能。 **2. 安全性增强** - **防止SQL注入**:`PreparedStatement`通过参数化查询,确保了用户输入的数据不会...

    JDBC基础教程之PreparedStatement.doc

    通过以上介绍可以看出,`PreparedStatement`不仅可以提高执行SQL语句的效率,还能有效防止SQL注入攻击,因为它使用参数化查询而非字符串拼接的方式构建SQL语句。因此,在开发涉及数据库操作的应用程序时,推荐优先...

    SQL转拼接代码

    而“SQL转拼接代码”通常指的是将SQL语句转换为编程语言中的字符串拼接代码,以便于在应用程序中执行这些SQL语句。在Java和C#这样的编程语言中,我们经常需要将SQL语句构建为字符串,然后通过数据库连接执行这些语句...

    Java常用工具类,字符串、日期、jdbc、xml解析等等

    此外,`StringBuilder`和`StringBuffer`类在进行字符串拼接时能提供更高的性能,因为它们是线程安全的。 - `Pattern`和`Matcher`:用于正则表达式的匹配和查找。 - `StringUtils`(Apache Commons Lang):提供了...

    06丨数据库原理:为什么PrepareStatement性能更好更安全?.pdf

    - **参数绑定**:PreparedStatement允许设置参数,数据库只需处理参数值,而非整个SQL字符串,减少了字符串拼接的开销。 - **缓存执行计划**:预编译后的执行计划会被数据库缓存,下次执行相同SQL时可直接复用,...

    易语言源码易语言动态拼接sql语句源码.rar

    在易语言中,这通常通过字符串拼接实现,即将SQL语句的各个部分组合成一个完整的命令字符串。这种方式的优点在于可以增加代码的灵活性,但同时也需要注意SQL注入等安全问题。 在学习易语言动态拼接SQL语句的过程中...

    string与blob的写入与读出

    在处理字符串时,我们通常会用到`StringBuilder`或`StringBuffer`类来构建和操作字符串,尤其是涉及到大量字符串拼接时,以避免不必要的性能开销。 而`Blob`(Binary Large Object)是Java数据库连接(JDBC)中的一...

    数据库连接

    - 易于维护:当需要改变SQL逻辑时,只需要修改PreparedStatement的构造字符串,无需担心字符串拼接错误。 总结来说,Statement适用于简单的、不涉及动态参数的SQL操作,而PreparedStatement更适合复杂和需要动态...

    JSP中的PreparedStatement对象操作数据库的使用教程

    因为预编译的SQL语句可以防止SQL注入攻击,同时通过setXXX方法的参数绑定机制避免了拼接SQL字符串的风险。因此,在涉及到频繁执行的数据库操作,或者需要执行的SQL语句中包含有用户输入数据时,推荐使用...

    Java之JDBC连接MySQL数据库实现增删改查(2018 使用Dao层实现 完美封装解决硬编码问题 使用预编译对象PreparedStatement)

    实现类 UserDaoImpl.java(实现增删改查功能 使用预编译对象PreparedStatement 安全、便捷不需要我们去拼接字符串,特别是字段很多的时候 同时效率比Statement更高 ) 测试类 UserDaoTest.java(做测试增删改查功能...

    java高效编程.pdf

    - 使用`StringBuffer`或`StringBuilder`进行字符串拼接,它们在内存管理上更高效。 9. **对象创建与内存管理**: - 避免一次性创建大量对象,特别是大对象,这可能导致垃圾收集器(GC)频繁工作。 - 显示声明...

    java拼SQL语句时为了排版而使用str+str对性能的影响

    4. **使用PreparedStatement**:除了字符串连接之外,更推荐使用`PreparedStatement`来构建SQL语句。这种方式不仅有助于防止SQL注入攻击,还能提高性能,因为数据库可以预先编译并缓存SQL语句。 5. **合理拆分SQL**...

    sql语句中用问号代替参数

    它不仅可以防范SQL注入,还能优化性能,同时减少因字符串拼接导致的潜在错误。在Java等编程语言中,通过`PreparedStatement`接口,我们可以轻松实现这一功能。了解并熟练掌握这种技术对于任何进行数据库操作的开发者...

    【IT十八掌徐培成】Java基础第23天-02.sql注入-preparedstatement-批量插入 - 副本.zip

    例如,一个简单的用户登录界面,如果直接使用用户输入的数据拼接SQL查询,如"SELECT * FROM users WHERE username = '" + userInput + "' AND password = '" + userPassword + "'",那么当用户输入特定的字符串,如...

    auth-web-app:其他字符串安全示例

    6. **防止命令注入**:如果程序需要执行系统命令,避免直接拼接字符串,应使用ProcessBuilder类的command()方法来指定命令列表,以防止恶意用户通过构造特殊字符串执行任意系统命令。 7. **字符串比较的安全性**:...

    SQL转Java代码小工具

    通过这个工具,开发者可以避免手动编写繁琐的SQL字符串拼接,提高代码的可读性和维护性。 描述中提到“可以将多行SQL转换为程序可用的字符串”,意味着该工具处理的不仅是单行的SQL语句,还能处理复杂的多行查询,...

    4、SQL注入漏洞pdf资料

    要防御SQL注入,需要对用户输入数据进行严格的检查和过滤,使用参数化查询语句来代替字符串拼接的方式,并且对数据库进行权限控制,限制用户的访问权限。 五、SQL注入的实例 例如,一个Web应用程序使用SQL语句来...

    JSP环境下的SQL注入防范.pdf

    - 即使使用PreparedStatement也不能完全保证安全,如果SQL语句中使用了字符串拼接的方式构造查询语句,依然可能会发生SQL注入。因此,应避免在代码中拼接SQL语句。 - 在某些情况下,如果确实需要使用Statement执行...

Global site tag (gtag.js) - Google Analytics