使用JdbcTemplate做随机数量的in查询时,拼sql有一种较简单的写法。
利用google的CharMatcher和Strings工具类。
public List<TypePriceInfo> listTypePriceByProductIds(List<Long> productIds) {
String sqlInParam = CharMatcher.is(',').trimFrom(Strings.repeat("?,", productIds.size()));
String sql = BASE_TYPE_PRICE_INFO_SQL + "where p.product_id in(" + sqlInParam + ")";
List<TypePriceInfo> priceInfos = jdbcTemplate.query(sql, productIds.toArray(), typePriceInfoRowMapper);
if (priceInfos == null) {
return Collections.emptyList();
} else {
return priceInfos;
}
}
画面多条件选择查询,做了个condition类,生成条件和参数
package com.qunar.hotel.qhotel.sight.dto.input;
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* User: zhen.ma
* Date: 14-3-6
* Time: 下午5:56
*/
public class TicketTypesCondition {
private Long sightId;
private String sightName;
private Integer ticketTypeId;
private String ticketTypeName;
private Integer pageNo;
private Integer pageSize;
private String errMessage;
private List<Long> sightIdsSelectedBySightName;
public static final Integer maxPageSize = 100;
public Long getSightId() {
return sightId;
}
public void setSightId(Long sightId) {
this.sightId = sightId;
}
public String getSightName() {
return sightName;
}
public void setSightName(String sightName) {
this.sightName = sightName;
}
public Integer getTicketTypeId() {
return ticketTypeId;
}
public void setTicketTypeId(Integer ticketTypeId) {
this.ticketTypeId = ticketTypeId;
}
public String getTicketTypeName() {
return ticketTypeName;
}
public void setTicketTypeName(String ticketTypeName) {
this.ticketTypeName = ticketTypeName;
}
public Integer getOffset() {
if (pageNo.compareTo(0) > 0) {
return (pageNo - 1) * pageSize;
}
return 0;
}
public void setPageNo(Integer pageNo) {
this.pageNo = pageNo;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public String getErrMessage() {
return errMessage;
}
public void addSightIdsSelectedBySightName(Long sightId) {
if (sightIdsSelectedBySightName == null) {
sightIdsSelectedBySightName = Lists.newArrayList();
}
sightIdsSelectedBySightName.add(sightId);
}
public boolean checkCondition() {
if (sightId == null && StringUtils.isEmpty(sightName)
&& ticketTypeId == null && StringUtils.isEmpty(ticketTypeName)) {
errMessage = "未指定查询条件";
return false;
}
if (pageNo == null || pageSize == null
|| pageNo.compareTo(0) < 1 || pageSize.compareTo(0) < 1) {
errMessage = "页码或记录条数错误";
return false;
}
if (pageSize != null && pageSize.compareTo(maxPageSize) > 0) {
errMessage = String.format("单次查询限制%s条", maxPageSize);
return false;
}
return true;
}
public String packageSql() {
StringBuilder ticketTypeSql = new StringBuilder(16);
ticketTypeSql.append(" WHERE origin_id > 0");
List<Long> sightIds = Lists.newArrayList();
if (sightId != null) {
sightIds.add(sightId);
}
if (!CollectionUtils.isEmpty(sightIdsSelectedBySightName)) {
sightIds.addAll(sightIdsSelectedBySightName);
}
if (!CollectionUtils.isEmpty(sightIds)) {
String sightParam = CharMatcher.is(',').trimFrom(Strings.repeat("?,", sightIds.size()));
ticketTypeSql.append(" AND sight_id IN (");
ticketTypeSql.append(sightParam);
ticketTypeSql.append(")");
}
if (ticketTypeId != null) {
ticketTypeSql.append(" AND origin_id=?");
}
if (!StringUtils.isEmpty(ticketTypeName)) {
ticketTypeSql.append(" AND type_name like ?");
}
return ticketTypeSql.toString();
}
public Object[] packageParams() {
List<Object> params = Lists.newArrayList();
if (sightId != null) {
params.add(sightId);
}
if (!CollectionUtils.isEmpty(sightIdsSelectedBySightName)) {
params.addAll(sightIdsSelectedBySightName);
}
if (ticketTypeId != null) {
params.add(ticketTypeId);
}
if (!StringUtils.isEmpty(ticketTypeName)) {
params.add("%" + ticketTypeName + "%");
}
return params.toArray();
}
}
分享到:
相关推荐
NULL 博文链接:https://yunzhongxia.iteye.com/blog/611591
使用Spring的JdbcTemplate实现分页功能
jdbcTemplate分页彻底解决,使用游标滚动,看了Spring源码才解决了问题
JdbcTemplate是一个框架,是用来操作数据库的,有些羡慕就是用JdbcTemplate开发的所有我们有必要去了解
简单的jdbcTemplate预编译、回调等
1.针对SpringMVC注解的配置...2.Spring+JdbcTemplate事物管理 3.Spring+Hibernate事物管理 4.Spring实现DWR注解方式的应用配置 5.Spring配置拦截器 6.Spring通过拦截器实现防止重复提交实例 对学习,会起到非常好的效果
Spring框架JdbcTemplate类中查询方法介绍
当hql等查询方式不能满足性能或灵活性的要求,必须使用SQL时,大家有三种选择: 第一、使用Hibernate 的sql 查询函数,将查询结果对象转为Entity对象。 第二、使用Hibernate Session的getConnection 获得JDBC ...
最近项目中的工作流需要查询多个数据源的数据,数据源可能是不同种类的:如sql server,oracl等等,一开始是用的配置实现,后来发现在项目运行中,可能需要动态的添加更多不同类型的数据源,所以最终的逻辑是将数据源...
本篇文章主要介绍了Spring 中jdbcTemplate 实现执行多条sql语句示例,可以对多个表执行多个sql语句,有兴趣的可以了解一下。
使用Spring的JdbcTemplate调用Oracle的存储过程
JdbcTemplate是spring-jdbc提供的数据库核心操作类,那对JdbcTemplate进行事务控制呢?
strut2+spring+springjdbctemplate做的简易登录系统
JdbcTemplate 调用存储过程
JavaEE JdbcTemplate的简单示例
JDBC已经能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库资源如:获取PreparedStatement,设置SQL语句参数,关闭连接等步骤。 JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加...
jdbcTemplate常用的查询方法集锦
JdbcTemplate的jar包 内含: commons-logging-1.2.jar spring-beans-5.0.0.RELEASE.jar spring-core-5.0.0.RELEASE.jar spring-jdbc-5.0.0.RELEASE.jar spring-tx-5.0.0.RELEASE.jar 查询一行的内容,封装为...
spring mvc框架 jdbcTemplate 里面有查询,删除,修改,增加操作。 jdbcTemplate dataSOURCE