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

PreparedStatement 命名参数 查询

阅读更多

网上找到的都有错,我改良了其中一个,可以正常使用!!
如下:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class NamedParameterStatement {
private final PreparedStatement statement;

private final Map indexMap;

public NamedParameterStatement(Connection connection, String query)
  throws SQLException {
 indexMap = new HashMap();
 String parsedQuery = parse(query, indexMap);
 statement = connection.prepareStatement(parsedQuery);
}

static final String parse(String query, Map paramMap) {

 int length = query.length();
 StringBuffer parsedQuery = new StringBuffer(length);
 boolean inSingleQuote = false;
 boolean inDoubleQuote = false;
 int index = 1;
 
 for (int i = 0; i < length; i++) {
  char c = query.charAt(i);
  if (inSingleQuote) {
   if (c == '\'') {
    inSingleQuote = false;
   }
  } else if (inDoubleQuote) {
   if (c == '"') {
    inDoubleQuote = false;
   }
  } else {
   if (c == '\'') {
    inSingleQuote = true;
   } else if (c == '"') {
    inDoubleQuote = true;
   } else if (c == ':' && i + 1 < length
     && Character.isJavaIdentifierStart(query.charAt(i + 1))) {
    int j = i + 2;
    while (j < length
      && Character.isJavaIdentifierPart(query.charAt(j))) {
     j++;
    }
    String name = query.substring(i + 1, j);
    c = '?';
    i += name.length();

    List indexList = (List) paramMap.get(name);
    if (indexList == null) {
     indexList = new LinkedList();
     paramMap.put(name, indexList);
    }
    indexList.add(new Integer(index));

    index++;
   }
  }
  parsedQuery.append(c);
 }

 for (Iterator itr = paramMap.entrySet().iterator(); itr.hasNext();) {
  Map.Entry entry = (Map.Entry) itr.next();
  List list = (List) entry.getValue();
  int[] indexes = new int[list.size()];
  int i = 0;
  for (Iterator itr2 = list.iterator(); itr2.hasNext();) {
   Integer x = (Integer) itr2.next();
   indexes[i++] = x.intValue();
  }
  entry.setValue(indexes);
 }

 return parsedQuery.toString();
}

private int[] getIndexes(String name) {
 int[] indexes = (int[]) indexMap.get(name);
 if (indexes == null) {
  throw new IllegalArgumentException("Parameter not found: " + name);
 }
 return indexes;
}

public void setObject(String name, Object value) throws SQLException {
 int[] indexes = getIndexes(name);
 for (int i = 0; i < indexes.length; i++) {
  statement.setObject(indexes[i], value);
 }
}

public void setString(String name, String value) throws SQLException {
 int[] indexes = getIndexes(name);
 for (int i = 0; i < indexes.length; i++) {
  statement.setString(indexes[i], value);
 }
}

public void setInt(String name, int value) throws SQLException {
 int[] indexes = getIndexes(name);
 for (int i = 0; i < indexes.length; i++) {
  statement.setInt(indexes[i], value);
 }
}

public void setLong(String name, long value) throws SQLException {
 int[] indexes = getIndexes(name);
 for (int i = 0; i < indexes.length; i++) {
  statement.setLong(indexes[i], value);
 }
}

public void setTimestamp(String name, Timestamp value) throws SQLException {
 int[] indexes = getIndexes(name);
 for (int i = 0; i < indexes.length; i++) {
  statement.setTimestamp(indexes[i], value);
 }
}

public PreparedStatement getStatement() {
 return statement;
}

public boolean execute() throws SQLException {
 return statement.execute();
}

public ResultSet executeQuery() throws SQLException {
 return statement.executeQuery();
}

public int executeUpdate() throws SQLException {
 return statement.executeUpdate();
}

public void close() throws SQLException {
 statement.close();
}

public void addBatch() throws SQLException {
 statement.addBatch();
}

public int[] executeBatch() throws SQLException {
 return statement.executeBatch();
}
}




调用方法:
                       
String query = "select * from people where (first_name = :name or last_name
= :name) and address = :address");
NamedParameterStatement p = new NamedParameterStatement(con, query);
p.setString("name", name);
p.setString("address", address);
ResutlSet rs=p.executeQuery();
。。。。。。。。

 

 

 

 

 

附上100%完整的系统项目源码:

JSP图书馆管理系统:http://blog.sina.com.cn/s/blog_4b5bc0110101a97e.html

 

JSP酒店宾馆管理系统:http://blog.sina.com.cn/s/blog_4b5bc0110101a97m.html

 

JSP学生信息管理系统:http://blog.sina.com.cn/s/blog_4b5bc0110101a97r.html

 

 

JSP房屋出售租赁管理系统:http://blog.sina.com.cn/s/blog_4b5bc0110101a98c.html

 

J2EE酒店在线预订系统:http://blog.sina.com.cn/s/blog_4b5bc0110101a97v.html

 

SSH/J2EE人力资源管理系统:http://blog.sina.com.cn/s/blog_4b5bc01101019ztu.html

 

ssh2图书管理系统(图书馆管理系统): http://blog.sina.com.cn/s/blog_4b5bc0110101adf0.html

 

毕业设计-JSP图书馆管理系统:http://blog.sina.com.cn/s/blog_4b5bc0110101a979.html

 

毕业设计-JSP酒店宾馆管理系统:http://blog.sina.com.cn/s/blog_4b5bc0110101a97z.html

 

毕业设计-JSP学生信息管理系统:http://blog.sina.com.cn/s/blog_4b5bc0110101a987.html

 

毕业设计-JSP房屋出售租赁管理系统:http://blog.sina.com.cn/s/blog_4b5bc0110101a98a.html

 

毕业设计-s2sh/j2ee图书管理系统 :http://blog.sina.com.cn/s/blog_4b5bc0110101ain5.html

 

ssh2图书管理系统(图书馆管理系统):http://blog.sina.com.cn/s/blog_4b5bc0110101adf0.html

 

毕业设计-jsp信息发布系统(信息供求网站系统):http://blog.sina.com.cn/s/blog_4b5bc0110101aiou.html

 

struts2+servlet+jsp信息发布系统:http://blog.sina.com.cn/s/blog_4b5bc0110101aiop.html

 

毕业设计-jsp电子商城 网上商城系统:http://blog.sina.com.cn/s/blog_4b5bc0110101aiof.html

 

jsp电子商城 网上商城系统(struts+servlet+jsp):http://blog.sina.com.cn/s/blog_4b5bc0110101aio9.html

 

毕业设计-图书管理系统 jsp图书馆系统Struts2+Spring+Ibatis+extjs(ssi):

http://blog.sina.com.cn/s/blog_4b5bc0110101ainu.html

 

Struts2+Spring+Ibatis+extjs(ssi)图书管理系统 jsp图书馆系统:

http://blog.sina.com.cn/s/blog_4b5bc0110101ainh.html

 

ssh2图书管理系统(图书馆管理系统):http://blog.sina.com.cn/s/blog_4b5bc0110101adf0.html

 

毕业设计-s2sh/j2ee图书管理系统 struts2+spring+hibernate:

http://blog.sina.com.cn/s/blog_4b5bc0110101ain5.html

 

 jsp酒店在线预订系统 酒店客房预定系统:http://blog.sina.com.cn/s/blog_4b5bc0110101atb8.html

 

毕业设计 jsp酒店在线预订系统 酒店客房预定系统:http://blog.sina.com.cn/s/blog_4b5bc0110101atbb.html

 

人力资源管理系统 S2SH/J2EE/JAVA:http://blog.sina.com.cn/s/blog_4b5bc0110101azoz.html

 

毕业设计-人力资源管理系统 S2SH/J2EE/JSP:http://blog.sina.com.cn/s/blog_4b5bc0110101azp0.html

 

ssh网上商城 电子商城struts hibernate  :http://blog.sina.com.cn/s/blog_4b5bc0110101b5gr.html

 

毕业设计 ssh网上商城 电子商城struts hibernate:http://blog.sina.com.cn/s/blog_4b5bc0110101b5h2.html

 

毕业设计 ssh电子相册管理系统:http://blog.sina.com.cn/s/blog_4b5bc0110101bkbl.html

 

实用技术:

J2EE/JSP应用技术70实例(源码)(实用): http://blog.sina.com.cn/s/blog_4b5bc0110101acms.html

分享到:
评论

相关推荐

    人工智能-项目实践-数据预处理-SQL语句分析、内置变量预处理、命名参数支持以及关系数据库访问与写入

    例如,在Java中,使用PreparedStatement对象可以实现命名参数,这样不仅能防止SQL注入攻击,还可以提高代码的可复用性。 最后,关系数据库的访问与写入是数据预处理流程中的关键步骤。关系数据库如MySQL、Oracle或...

    NamedParameterPreparedStatement:使用参数名称而不是参数索引位置准备和执行 SQL 的库

    命名参数准备语句 使用参数名称而不是参数索引/位置准备和执行 SQL 的库 可 在处理包含大量用户传递参数的冗长 SQL 查询时很有用。 设想 假设,在 PreparedStatement 中,用户参数表示为“?” 并使用位置标识(给定...

    mybatis全局参数.docx

    9. `mapUnderscoreToCamelCase`:当开启(设置为 `true`)时,MyBatis 会自动将数据库中带有下划线的列名转换为对应的驼峰式命名的 Java 属性。例如,列名 `stu_no` 会被映射到 Java 类的属性 `stuNo`。默认值为 `...

    获取操作数据库的sql并输出带参数的

    `或命名参数`:param`)代替具体的值。在执行时,这些值会被安全地绑定到SQL语句中,避免了直接拼接字符串可能导致的注入风险。 例如,使用Java的JDBC,你可以创建一个PreparedStatement对象,如下所示: ```java ...

    java数据库连接PrepareStatement

    在 Java 的数据库编程中,`PreparedStatement` 是一个非常重要的类,它继承自 `Statement` 类,并提供了更高级的功能来处理 SQL 语句,尤其是在处理参数化查询时更为高效和安全。下面我们将详细介绍 `...

    C:\Users\farfalla\Desktop\vvv.txt

    它提供了参数化查询的能力,能够避免SQL注入攻击,并且通过预编译提高了执行效率。在给定的内容中,我们看到一个方法`setPreparedStatement`,该方法接收一个`PreparedStatement`对象和一个参数列表`List`,并设置...

    1、hibernate 简单语法1

    我们也可以使用命名参数,例如: ```java Query query = session.createQuery("select sname, saddress from Student where adept = :ad and sage &gt; :age"); query.setString("ad", "computer"); query.setString(...

    jndi数据库查询例子

    这样做的好处是,数据库连接参数可以在服务器端统一管理,无需在应用程序中硬编码,提高了代码的可维护性和可扩展性。 **3. MyEclipse中的JNDI配置** MyEclipse是一款集成开发环境,支持JNDI资源的配置和管理。在...

    利用java反射创建通用的数据库查询方法.pdf

    - `PreparedStatement` 是 `Statement` 的子接口,用于执行预编译的 SQL 语句,它可以提高性能,防止 SQL 注入,并允许参数化查询。 - `setObject()` 方法用于设置 SQL 语句中的参数,参数索引从 1 开始。 3. **...

    Mybatis高级映射查询

    使用 `@Param` 注解可以为传入的参数命名,便于在 SQL 中引用。对于 Map 参数,键作为参数名,值作为参数值。 4. resultMap:`&lt;resultMap&gt;` 是 Mybatis 的核心元素,用于定义复杂的对象与数据列之间的映射关系。它...

    Spring-JDBC,带一小例子

    例如,NamedParameterJdbcTemplate允许使用命名参数(如`:username`),而JdbcTemplate则支持问号(`?`)作为位置参数。 4. **Result Set Mapping**: Spring-JDBC可以自动将查询结果映射到Java对象,这通常通过...

    mysql-connector-c++-noinstall-1.1.7-win32.zip

    `PreparedStatement`类则允许预编译SQL语句,提高执行效率并支持参数化查询。 3. **结果集处理**:执行查询后,结果会返回一个`cppconn::ResultSet`对象,你可以通过迭代器或索引访问其中的数据。 4. **异常处理**...

    DBUtils文档+源码

    `QueryRunner`的`runQuery()`方法接受PreparedStatement的参数,这些参数可以是占位符(问号)并按顺序与参数列表匹配,或者使用命名参数(如`:name`)。 4. **更新操作**: 对于插入、更新、删除等操作,`Query...

    JdbcTemplate.rar

    JdbcTemplate可以结合`NamedParameterJdbcTemplate`使用,提供更强大的命名参数支持。另外,还有`SimpleJdbcInsert`和`SimpleJdbcCall`用于简化插入和存储过程的调用。 总结来说,JdbcTemplate是Spring为简化数据库...

    spring封装jdbc查询

    它允许我们使用命名参数,如`:username`,而不是传统的问号占位符`?`,提高了代码的可读性。 4. **事务管理**:Spring JDBC还提供了事务管理能力,可以方便地控制事务的边界,避免在手动管理事务时出现的资源泄露...

    MyBatis参数处理实现方法汇总

    3. **命名参数**: 使用`@Param`注解可以明确指定Map中的键。例如,`@Param("id") Integer id`,那么在SQL中通过`#{id}`获取该值。 4. **PoJO参数**: 当多个参数对应业务逻辑的数据模型时,可以直接传入一个PoJO...

    MyBatis面试专题1

    #{ }用于预编译处理,它会将参数转化为PreparedStatement的参数,能够防止SQL注入。而${ }则是简单的字符串替换,直接将参数替换到SQL字符串中,没有预编译过程,因此存在SQL注入的风险。 MyBatis被称为半自动ORM...

    spring-jdbc.rar_goldenw65_map25w_sellwof_spring-jdbc

    3. `NamedParameterJdbcTemplate`:支持使用命名参数的SQL查询,提高了代码可读性。 4. `TransactionTemplate`:提供了事务管理的模板,可以方便地进行编程式事务控制。 二、Spring JDBC的主要特性 1. **异常转换*...

    javabean查询

    - **属性(Properties)**: JavaBean的核心是属性,它通过公有get/set方法来访问私有成员变量,符合JavaBeans规范的属性应当遵循驼峰命名规则。 - **构造器(Constructor)**: JavaBean通常提供无参构造器以便于...

Global site tag (gtag.js) - Google Analytics