使用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();
}
}
分享到:
相关推荐
2. **JdbcTemplate的使用**:在使用`JdbcTemplate`执行SQL时,其内部会自动创建SQL执行的Logger对象,如果日志级别设置为`DEBUG`,则会打印出SQL语句及其参数。例如,对于一个简单的查询操作: ```java ...
在使用`jdbcTemplate`进行预编译查询时,我们通常会使用`query()`或`queryForList()`方法。例如: ```java String sql = "SELECT * FROM table WHERE id = ?"; Object[] params = {1}; List<MyObject> result = ...
### JdbcTemplate查询详解 #### 一、概述 `JdbcTemplate`是Spring框架中提供的一个用于简化JDBC编程的工具类,它提供了丰富的API来帮助开发者更便捷地进行数据库操作。相较于传统的JDBC编程方式,使用`...
使用Spring的JdbcTemplate实现分页功能
在使用 JdbcTemplate 时,需要将 SQL 语句和参数传递给相应的方法,然后 JdbcTemplate 会将参数绑定到 SQL 语句中,并执行查询或更新操作。 在查询结果为空或查询结果大于 1 行时,JdbcTemplate 会抛出异常。这些...
在Java的Spring框架中,`JdbcTemplate`是一个非常重要的组件,它提供了数据库操作的简单抽象,使得开发者可以方便地执行SQL语句而无需编写复杂的DAO(数据访问对象)层。在处理大量数据时,传统的分页方法可能会导致...
本文将详细解释如何使用JdbcTemplate来执行多条SQL语句,以及其在事务管理中的作用。 首先,JdbcTemplate的`batchUpdate`方法是用于批量执行SQL语句的,如示例所示。在上述代码中,`batchUpdate`接收一个SQL语句的...
**JdbcTemplate简单实例** 在Java开发中,数据库操作是一个非常重要的环节。Spring框架提供了一个强大的工具类——JdbcTemplate,它简化了与数据库交互的过程,帮助开发者避免了手动处理JDBC的繁琐工作,如连接管理...
JdbcTemplate使用PreparedStatement来执行SQL,自动防止SQL注入攻击,因为它会正确地转义参数值。 7. 错误处理 如果数据库操作失败,JdbcTemplate会抛出异常,如`DataAccessException`,使得我们可以快速定位并处理...
- 参数绑定:支持预编译的PreparedStatement,防止SQL注入攻击。 - 事务管理:通过AOP(面向切面编程)实现声明式事务管理,简化事务控制。 3. **JdbcTemplate常用方法**: - `update(String sql, Object... ...
本文将深入探讨如何利用Spring的JdbcTemplate进行MySQL数据库的分页查询,并对其进行封装,提高代码的复用性和可维护性。 首先,了解Spring JdbcTemplate的基本用法。JdbcTemplate是Spring提供的一个模板类,用于...
Spring JdbcTemplate支持参数化的SQL查询,这可以避免SQL注入的风险。例如,使用`query`方法进行参数化查询: ```java String id = "1"; List<User> users = jdbcTemplate.query( "SELECT * FROM users WHERE ...
- **执行SQL**:调用JdbcTemplate的execute()方法执行SQL,对于查询操作,可以使用query()方法,传入SQL、RowMapper或者ResultSetExtractor。 - **参数化查询**:使用问号?作为占位符,通过addBatch()添加参数,...
1. **参数绑定**:`JdbcTemplate`支持预编译的SQL语句,可以安全地处理SQL注入问题。它能将Java对象的值绑定到SQL查询中的占位符,例如`?`或`:${param}`。 2. **事务管理**:`JdbcTemplate`提供了自动的事务管理...
本示例将深入探讨`JdbcTemplate`的使用,包括其核心功能以及如何进行CRUD(创建、读取、更新和删除)操作。 `JdbcTemplate`是Spring为简化数据库访问而设计的一个抽象层,它消除了手动管理数据库连接、预编译SQL...
当hql等查询方式不能满足性能或灵活性的要求,必须使用SQL时,大家有三种选择: 第一、使用Hibernate 的sql 查询函数,将查询结果对象转为Entity对象。 第二、使用Hibernate Session的getConnection 获得JDBC ...
JdbcTemplate支持参数化查询,通过占位符和参数数组来防止SQL注入。如上例所示,使用`?`作为占位符,并传递参数数组,JdbcTemplate会自动处理参数绑定,避免了SQL注入的风险。 **6. 代码测试** 由于JdbcTemplate不...
1. 执行批量添加操作:通过遍历List集合,将每个数组作为参数执行SQL语句进行添加。 2. 执行批量删除和修改操作:也是遍历List集合,对每个元素执行相应的SQL语句。 3. 执行分页查询:通过分页信息调用JdbcTemplate...
JdbcTemplate是Spring对Java的JDBC API进行封装后的产物,它的主要目标是消除手动处理结果集、连接关闭等繁琐工作,减少SQL注入的风险,并提高代码的可读性和可维护性。通过使用JdbcTemplate,我们可以将关注点集中...