网上找到的都有错,我改良了其中一个,可以正常使用!!
如下:
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 的库 可 在处理包含大量用户传递参数的冗长 SQL 查询时很有用。 设想 假设,在 PreparedStatement 中,用户参数表示为“?” 并使用位置标识(给定...
1、JDBC(Java Database Connection):...创建PreparedStatement时指定参数 PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs.absolute(9000);
预编译语句(PreparedStatement) 340 使用事务 341 事务的级别控制 343 使用存储过程 345 操作元数据 347 ResultSetMetaData(结果集元数据) 349 可滚动的和可更新的结果集 350 批处理更新 354 二进制大对象BLOB ...
在User.xml 的配置文件中,mapper namespace="com.yihaomen.mybatis.inter.IUserOperation" ,命名空间非常重要,不能有错,必须与我们定义的package 和 接口一致。 运行这个测试程序,就可以看到结果了。 除非...
7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...
7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...
18.2.3 PreparedStatement接口467 18.2.4 ResultSet接口467 18.3 JDBC操作SQL469 18.4 JDBC基本示例473 18.5 JDBC应用示例479 18.6 本章习题492 第19章 19.1 网络编程的基本概念494 19.1.1 网络基础知识494 19.1.2 ...
具体的SQL 需要程序员编写,然后通过映 射配置文件,将SQL 所需的参数,以及返回的结果字段映射到指定POJO 。 使用ibatis 提供的ORM 机制,对业务逻辑实现人员而言,面对的是纯粹的Java 对象, 这一层与...
1.6.2 Java源文件的命名规则 17 1.6.3 初学者容易犯的错误 18 1.7 垃圾回收机制 20 1.8 何时开始使用IDE工具 21 学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本...