`
bjtdeyx
  • 浏览: 167301 次
  • 性别: 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

分享到:
评论

相关推荐

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

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

    JDBC详解HTML-JDBC.pp

    1、JDBC(Java Database Connection):...创建PreparedStatement时指定参数 PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs.absolute(9000);

    Java语言基础下载

    预编译语句(PreparedStatement) 340 使用事务 341 事务的级别控制 343 使用存储过程 345 操作元数据 347 ResultSetMetaData(结果集元数据) 349 可滚动的和可更新的结果集 350 批处理更新 354 二进制大对象BLOB ...

    springmybatis

    在User.xml 的配置文件中,mapper namespace="com.yihaomen.mybatis.inter.IUserOperation" ,命名空间非常重要,不能有错,必须与我们定义的package 和 接口一致。 运行这个测试程序,就可以看到结果了。 除非...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...

    java基础案例与开发详解案例源码全

    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 ...

    ibatis 开发指南(pdf)

    具体的SQL 需要程序员编写,然后通过映 射配置文件,将SQL 所需的参数,以及返回的结果字段映射到指定POJO 。 使用ibatis 提供的ORM 机制,对业务逻辑实现人员而言,面对的是纯粹的Java 对象, 这一层与...

    疯狂JAVA讲义

    1.6.2 Java源文件的命名规则 17 1.6.3 初学者容易犯的错误 18 1.7 垃圾回收机制 20 1.8 何时开始使用IDE工具 21 学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本...

Global site tag (gtag.js) - Google Analytics