如何使PreparedStatement支持命名参数

 我来答
笑喘是病得抽
2017-07-09 · TA获得超过925个赞
知道大有可为答主
回答量:2140
采纳率:98%
帮助的人:2227万
展开全部
所谓命名参数,使用.net的人应该比较熟,很方便,参数多的时候不容易出错,搞不懂java为什么就不支持。如果没有使用过,或者对于命名参数不知所云,请看下面的说明。
PreparedStatement中参数都是使用下标传值,如:
PreparedStatement p = con.prepareStatement("select * from people where
(first_name = ? or last_name = ?) and address = ?");
p.setString(1, name);
p.setString(2, name);
p.setString(3, address);
但是如果查询语句复杂,或者修改了sql,要跟踪每个参数的下标将变得非常麻烦并且容易出错,如果使用名称来命名参数就可以解决这个问题,如:
PreparedStatement p = con.prepareStatement("select * from people where
(first_name =:name or last_name =:name) and address =:address");
p.setString("name", name);
p.setString("address", address);
正文
最近认真学习了一下正则表达式,发现使用正则表达式可以很好的解决这个问题。
思路如下:
以命名参数的形式写好SQL语句,然后使用正则表达式提取出所有参数,使用Map记录,然后将参数替换成?(也就是java要求的标准形式),使用标准的SQL语句来创建PreparedStatement,最后根据Map来设置PreparedStatement的参数。
好了,废话少说。贴一下代码,我个人觉得实现的比较得比较简单、优雅。没有仔细测试,如发现问题,欢迎交流(wallimn@sohu.com)。
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 用来模拟实现命名参数功能
* <br/>
* 编码:wallimn 时间:2009-1-8 下午12:11:34<br/>
* 版本:V1.0<br/>
*/
public class NamedParamSqlUtil {
static final Log log = LogFactory.getLog(NamedParamSqlUtil.class);
private Map<Integer,String> paramsMap=new HashMap<Integer,String>();

public Map<Integer,String> getParamsMap(){
return paramsMap;
}
public void emptyMap(){
paramsMap.clear();
}
/**
* 分析处理带命名参数的SQL语句。使用Map存储参数,然后将参数替换成?
* <br/>
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式