网上找到的都有错,我改良了其中一个,可以正常使用!!
如下:
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
相关推荐
例如,在Java中,使用PreparedStatement对象可以实现命名参数,这样不仅能防止SQL注入攻击,还可以提高代码的可复用性。 最后,关系数据库的访问与写入是数据预处理流程中的关键步骤。关系数据库如MySQL、Oracle或...
命名参数准备语句 使用参数名称而不是参数索引/位置准备和执行 SQL 的库 可 在处理包含大量用户传递参数的冗长 SQL 查询时很有用。 设想 假设,在 PreparedStatement 中,用户参数表示为“?” 并使用位置标识(给定...
9. `mapUnderscoreToCamelCase`:当开启(设置为 `true`)时,MyBatis 会自动将数据库中带有下划线的列名转换为对应的驼峰式命名的 Java 属性。例如,列名 `stu_no` 会被映射到 Java 类的属性 `stuNo`。默认值为 `...
`或命名参数`:param`)代替具体的值。在执行时,这些值会被安全地绑定到SQL语句中,避免了直接拼接字符串可能导致的注入风险。 例如,使用Java的JDBC,你可以创建一个PreparedStatement对象,如下所示: ```java ...
在 Java 的数据库编程中,`PreparedStatement` 是一个非常重要的类,它继承自 `Statement` 类,并提供了更高级的功能来处理 SQL 语句,尤其是在处理参数化查询时更为高效和安全。下面我们将详细介绍 `...
它提供了参数化查询的能力,能够避免SQL注入攻击,并且通过预编译提高了执行效率。在给定的内容中,我们看到一个方法`setPreparedStatement`,该方法接收一个`PreparedStatement`对象和一个参数列表`List`,并设置...
我们也可以使用命名参数,例如: ```java Query query = session.createQuery("select sname, saddress from Student where adept = :ad and sage > :age"); query.setString("ad", "computer"); query.setString(...
这样做的好处是,数据库连接参数可以在服务器端统一管理,无需在应用程序中硬编码,提高了代码的可维护性和可扩展性。 **3. MyEclipse中的JNDI配置** MyEclipse是一款集成开发环境,支持JNDI资源的配置和管理。在...
- `PreparedStatement` 是 `Statement` 的子接口,用于执行预编译的 SQL 语句,它可以提高性能,防止 SQL 注入,并允许参数化查询。 - `setObject()` 方法用于设置 SQL 语句中的参数,参数索引从 1 开始。 3. **...
使用 `@Param` 注解可以为传入的参数命名,便于在 SQL 中引用。对于 Map 参数,键作为参数名,值作为参数值。 4. resultMap:`<resultMap>` 是 Mybatis 的核心元素,用于定义复杂的对象与数据列之间的映射关系。它...
例如,NamedParameterJdbcTemplate允许使用命名参数(如`:username`),而JdbcTemplate则支持问号(`?`)作为位置参数。 4. **Result Set Mapping**: Spring-JDBC可以自动将查询结果映射到Java对象,这通常通过...
`PreparedStatement`类则允许预编译SQL语句,提高执行效率并支持参数化查询。 3. **结果集处理**:执行查询后,结果会返回一个`cppconn::ResultSet`对象,你可以通过迭代器或索引访问其中的数据。 4. **异常处理**...
`QueryRunner`的`runQuery()`方法接受PreparedStatement的参数,这些参数可以是占位符(问号)并按顺序与参数列表匹配,或者使用命名参数(如`:name`)。 4. **更新操作**: 对于插入、更新、删除等操作,`Query...
JdbcTemplate可以结合`NamedParameterJdbcTemplate`使用,提供更强大的命名参数支持。另外,还有`SimpleJdbcInsert`和`SimpleJdbcCall`用于简化插入和存储过程的调用。 总结来说,JdbcTemplate是Spring为简化数据库...
它允许我们使用命名参数,如`:username`,而不是传统的问号占位符`?`,提高了代码的可读性。 4. **事务管理**:Spring JDBC还提供了事务管理能力,可以方便地控制事务的边界,避免在手动管理事务时出现的资源泄露...
3. **命名参数**: 使用`@Param`注解可以明确指定Map中的键。例如,`@Param("id") Integer id`,那么在SQL中通过`#{id}`获取该值。 4. **PoJO参数**: 当多个参数对应业务逻辑的数据模型时,可以直接传入一个PoJO...
#{ }用于预编译处理,它会将参数转化为PreparedStatement的参数,能够防止SQL注入。而${ }则是简单的字符串替换,直接将参数替换到SQL字符串中,没有预编译过程,因此存在SQL注入的风险。 MyBatis被称为半自动ORM...
3. `NamedParameterJdbcTemplate`:支持使用命名参数的SQL查询,提高了代码可读性。 4. `TransactionTemplate`:提供了事务管理的模板,可以方便地进行编程式事务控制。 二、Spring JDBC的主要特性 1. **异常转换*...
- **属性(Properties)**: JavaBean的核心是属性,它通过公有get/set方法来访问私有成员变量,符合JavaBeans规范的属性应当遵循驼峰命名规则。 - **构造器(Constructor)**: JavaBean通常提供无参构造器以便于...