Java动态SQL添加参数_java动态拼接sql语句并且执行时给sql语句的参数赋值

问题

在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题。

20200215150812529997.png

解决方法

1.就拿我上面的那个多条件模糊查询为例,第一步是拼接sql语句,先定义一个通用的sql语句,String sql = "select * from user where 1 = 1 ";这里添加where 1= 1是一个小技巧,方便后面sql语句的拼接。

String sql = "select * from user where 1 = 1 ";

StringBuilder sb = new StringBuilder(sql);//创建一个StringBuilder并先把定义的通用sql放进去

2.在这里我用一个map集合将条件查询的三个参数在servlet中获取了,接下来遍历map集合判断对应的属性是否有值,如果有值可以拼接到刚才定义的通用sql语句后面

//遍历map看是否有属性,condition是一个把jsp页面传递过来输入数据封装的map集合

Set keySet = condition.keySet();

//定义参数集合

List params = new ArrayList();

for (String key : keySet) {

//排除分页条件参数

if ("currentPage".equals(key)||"rows".equals(key)){

continue;//结束当前循环

}

String value = condition.get(key)[0];

//判断value是否有值

if (value != null && !"".equals(value)){

//动态拼接sql

sb.append(" and "+key+" like ? ");

params.add("%"+value+"%");//加?的值

}

}

3.执行sql,执行时需要参数,这又是一个问题,我得解决方法时定义了一个list集合,用于存储参数的值value,到最后执行写进去,由于是个list集合,可以直接用list.toArray转化为参数数组写进去

return template.query(sb.toString(),new BeanPropertyRowMapper(User.class),params.toArray());

非常重要的注意事项

拼接sql的时候一定要注意空格,尽量多留几个空格,否则sql拼接后报错了

拼接好的sql需要使用toString将StringBuilder转化为String类型,参数直接使用toArray()将list集合转化为参数数组

整体

public List findByPage(Map condition) {

String sql = "select * from user where 1 = 1 ";

StringBuilder sb = new StringBuilder(sql);

//遍历map看是否有属性

Set keySet = condition.keySet();

//定义参数集合

List params = new ArrayList();

for (String key : keySet) {

//排除分页条件参数

if ("currentPage".equals(key)||"rows".equals(key)){

continue;//结束当前循环

}

String value = condition.get(key)[0];

//判断value是否有值

if (value != null && !"".equals(value)){

//动态拼接sql

sb.append(" and "+key+" like ? ");

params.add("%"+value+"%");//加?的值

}

}

return template.query(sb.toString(),new BeanPropertyRowMapper(User.class),params.toArray());

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值