`

JdbcTemplate进行in查询随机数量参数的SQL简单拼写

 
阅读更多
使用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();
    }
}

分享到:
评论

相关推荐

    打印JdbcTemplate执行sql

    2. **JdbcTemplate的使用**:在使用`JdbcTemplate`执行SQL时,其内部会自动创建SQL执行的Logger对象,如果日志级别设置为`DEBUG`,则会打印出SQL语句及其参数。例如,对于一个简单的查询操作: ```java ...

    spring自带的jdbcTemplate查询、插入预编译使用

    在使用`jdbcTemplate`进行预编译查询时,我们通常会使用`query()`或`queryForList()`方法。例如: ```java String sql = "SELECT * FROM table WHERE id = ?"; Object[] params = {1}; List&lt;MyObject&gt; result = ...

    JdbcTemplate查询

    ### JdbcTemplate查询详解 #### 一、概述 `JdbcTemplate`是Spring框架中提供的一个用于简化JDBC编程的工具类,它提供了丰富的API来帮助开发者更便捷地进行数据库操作。相较于传统的JDBC编程方式,使用`...

    使用Spring的JdbcTemplate实现分页功能

    使用Spring的JdbcTemplate实现分页功能

    Spring框架JdbcTemplate类中查询方法介绍

    在使用 JdbcTemplate 时,需要将 SQL 语句和参数传递给相应的方法,然后 JdbcTemplate 会将参数绑定到 SQL 语句中,并执行查询或更新操作。 在查询结果为空或查询结果大于 1 行时,JdbcTemplate 会抛出异常。这些...

    jdbcTemplate分页彻底解决,使用游标滚动

    在Java的Spring框架中,`JdbcTemplate`是一个非常重要的组件,它提供了数据库操作的简单抽象,使得开发者可以方便地执行SQL语句而无需编写复杂的DAO(数据访问对象)层。在处理大量数据时,传统的分页方法可能会导致...

    Spring 中jdbcTemplate 实现执行多条sql语句示例

    本文将详细解释如何使用JdbcTemplate来执行多条SQL语句,以及其在事务管理中的作用。 首先,JdbcTemplate的`batchUpdate`方法是用于批量执行SQL语句的,如示例所示。在上述代码中,`batchUpdate`接收一个SQL语句的...

    JdbcTemplate简单实例

    **JdbcTemplate简单实例** 在Java开发中,数据库操作是一个非常重要的环节。Spring框架提供了一个强大的工具类——JdbcTemplate,它简化了与数据库交互的过程,帮助开发者避免了手动处理JDBC的繁琐工作,如连接管理...

    使用Spring JDBCTemplate进行增删改查curd操作

    JdbcTemplate使用PreparedStatement来执行SQL,自动防止SQL注入攻击,因为它会正确地转义参数值。 7. 错误处理 如果数据库操作失败,JdbcTemplate会抛出异常,如`DataAccessException`,使得我们可以快速定位并处理...

    java基于jdbctemplate数据持久层操作封装

    - 参数绑定:支持预编译的PreparedStatement,防止SQL注入攻击。 - 事务管理:通过AOP(面向切面编程)实现声明式事务管理,简化事务控制。 3. **JdbcTemplate常用方法**: - `update(String sql, Object... ...

    Spring jdbctemplate + mysql 分页封装

    本文将深入探讨如何利用Spring的JdbcTemplate进行MySQL数据库的分页查询,并对其进行封装,提高代码的复用性和可维护性。 首先,了解Spring JdbcTemplate的基本用法。JdbcTemplate是Spring提供的一个模板类,用于...

    Spring JdbcTemplate查询实例

    Spring JdbcTemplate支持参数化的SQL查询,这可以避免SQL注入的风险。例如,使用`query`方法进行参数化查询: ```java String id = "1"; List&lt;User&gt; users = jdbcTemplate.query( "SELECT * FROM users WHERE ...

    spring-jdbcTemplate实例工程

    - **执行SQL**:调用JdbcTemplate的execute()方法执行SQL,对于查询操作,可以使用query()方法,传入SQL、RowMapper或者ResultSetExtractor。 - **参数化查询**:使用问号?作为占位符,通过addBatch()添加参数,...

    jdbcTemplate

    1. **参数绑定**:`JdbcTemplate`支持预编译的SQL语句,可以安全地处理SQL注入问题。它能将Java对象的值绑定到SQL查询中的占位符,例如`?`或`:${param}`。 2. **事务管理**:`JdbcTemplate`提供了自动的事务管理...

    JdbcTemplate示例

    本示例将深入探讨`JdbcTemplate`的使用,包括其核心功能以及如何进行CRUD(创建、读取、更新和删除)操作。 `JdbcTemplate`是Spring为简化数据库访问而设计的一个抽象层,它消除了手动管理数据库连接、预编译SQL...

    Spring的JDBCTemplate

    当hql等查询方式不能满足性能或灵活性的要求,必须使用SQL时,大家有三种选择: 第一、使用Hibernate 的sql 查询函数,将查询结果对象转为Entity对象。 第二、使用Hibernate Session的getConnection 获得JDBC ...

    JdbcTemplate

    JdbcTemplate支持参数化查询,通过占位符和参数数组来防止SQL注入。如上例所示,使用`?`作为占位符,并传递参数数组,JdbcTemplate会自动处理参数绑定,避免了SQL注入的风险。 **6. 代码测试** 由于JdbcTemplate不...

    Spring--JdbcTemplate.pdf

    1. 执行批量添加操作:通过遍历List集合,将每个数组作为参数执行SQL语句进行添加。 2. 执行批量删除和修改操作:也是遍历List集合,对每个元素执行相应的SQL语句。 3. 执行分页查询:通过分页信息调用JdbcTemplate...

    JavaEE JdbcTemplate的简单示例

    JdbcTemplate是Spring对Java的JDBC API进行封装后的产物,它的主要目标是消除手动处理结果集、连接关闭等繁琐工作,减少SQL注入的风险,并提高代码的可读性和可维护性。通过使用JdbcTemplate,我们可以将关注点集中...

Global site tag (gtag.js) - Google Analytics