PreparedStatement 命名参数 查询

12 篇文章 0 订阅
11 篇文章 0 订阅

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值