1.Spring NamedParameterJdbcTemplate 详解 解决jdbcTemplate中 in 参数的问题
1.1 封装一个分页的工具类JdbcTemplatePage
PageVo
1 package utils.sql; 2 3 import java.io.Serializable; 4 import java.util.List; 5 6 /** 7 * Created by oracle on 2016/10/26. 8 */ 9 public class PageVo<T> implements Serializable { 10 //分页查询结果 11 List<T> Result; 12 //页总数 13 Integer pageNum; 14 //一页记录数 15 Integer pageSize; 16 //总记录数 17 Integer totalCount; 18 19 20 public PageVo() { 21 22 } 23 24 public PageVo(Integer pageNum, Integer pageSize) { 25 this.pageNum = pageNum; 26 this.pageSize = pageSize; 27 } 28 29 public Integer getTotalCount() { 30 return totalCount; 31 } 32 33 public void setTotalCount(Integer totalCount) { 34 this.totalCount = totalCount; 35 } 36 37 public List<T> getResult() { 38 return Result; 39 } 40 41 public void setResult(List<T> result) { 42 Result = result; 43 } 44 45 public Integer getPageNum() { 46 return pageNum; 47 } 48 49 public void setPageNum(Integer pageNum) { 50 this.pageNum = pageNum; 51 } 52 53 public Integer getPageSize() { 54 return pageSize; 55 } 56 57 public void setPageSize(Integer pageSize) { 58 this.pageSize = pageSize; 59 } 60 }
JdbcTemplatePage
1 package utils.sql; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.jdbc.core.BeanPropertyRowMapper; 5 import org.springframework.jdbc.core.JdbcTemplate; 6 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; 7 import org.springframework.stereotype.Component; 8 import utils.log.Log; 9 import utils.log.Logs; 10 import java.util.List; 11 import java.util.Map; 12 13 /** 14 * parent 15 * 16 * @date 2018/7/25 17 * 分页查询 18 */ 19 @Component 20 public class JdbcTemplatePage { 21 private static final Log log = Logs.getLog(JdbcTemplatePage.class.getName()); 22 23 @Autowired 24 JdbcTemplate jdbcTemplate; 25 26 /** 27 * @param sql 28 * @param elementType 返回需要封装的pageVo 29 * @param page 30 * @param pageSize 31 * @param args 32 * @return PageVo 33 */ 34 public <T> PageVo<T> query(String sql, Class<T> elementType, Integer page, Integer pageSize, Map<String,Object> args) throws Exception { 35 NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource()); 36 sql = sql.toLowerCase(); 37 log.info("query sql:"+sql); 38 SqlReCreateFactory sqlReCreateFactory = new SqlReCreateFactory<Object>(sql, page, pageSize, args).invoke(); 39 sql = sqlReCreateFactory.getSql(); 40 PageVo<T> pageVo = sqlReCreateFactory.getPageVo(); 41 List<T> result = namedParameterJdbcTemplate.query(sql, args, new BeanPropertyRowMapper<>(elementType)); 42 pageVo.setResult(result); 43 return pageVo; 44 } 45 46 private class SqlReCreateFactory<T> { // 47 private String sql; 48 private Integer page; 49 private Integer pageSize; 50 private Map<String,Object> args; 51 private PageVo<T> pageVo; 52 53 public SqlReCreateFactory(String sql, Integer page, Integer pageSize, Map<String, Object> args) { 54 this.sql = sql; 55 this.page = page; 56 this.pageSize = pageSize; 57 this.args = args; 58 } 59 60 public String getSql() { 61 return sql; 62 } 63 64 public PageVo<T> getPageVo() { 65 return pageVo; 66 } 67 68 public SqlReCreateFactory invoke() { 69 NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource()); 70 pageVo = new PageVo<>(0, pageSize); 71 String sqlCount = "select count(*) from (" + sql + ") "; 72 Integer count = namedParameterJdbcTemplate.queryForObject(sqlCount, args, Integer.class); //查询页数 73 pageVo.setTotalCount(count); 74 int pageNum = 0; 75 if (count != null && count > 0) { 76 if (count % pageSize == 0) { 77 pageNum = count / pageSize; 78 } else { 79 pageNum = count / pageSize + 1; 80 } 81 pageVo.setPageNum(pageNum); 82 } 83 int pageMin = (page - 1) * pageSize; 84 int pageMax = pageMin + pageSize; 85 args.put("pagemin",pageMin); 86 args.put("pagemax",pageMax); 87 sql = "select p.* from (select t.* ,rownum rownumber from (" +sql+ ") t) p where p.rownumber>:pagemin and p.rownumber<=:pagemax "; 88 return this; 89 } 90 } 91 }
1.2 使用JdbcTemplatePage进行分页
1 package finance.service.service; 2 3 import finance.api.dto.FinanceToAccountDto; 4 import finance.api.vo.FundReconciliationQueryVo; 5 import lombok.extern.slf4j.Slf4j; 6 import org.apache.commons.collections.map.HashedMap; 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.stereotype.Component; 9 import utils.Lang; 10 import utils.sql.JdbcTemplatePage; 11 import utils.sql.PageVo; 12 13 import java.util.ArrayList; 14 import java.util.HashMap; 15 import java.util.List; 16 import java.util.Map; 17 18 /** 19 * @date 2018/5/7 20 */ 21 @Component 22 @Slf4j 23 public class FundReconciliationService { 24 25 @Autowired 26 private JdbcTemplatePage jdbcTemplatePage; 27 28 /** 29 * 查询 30 * 31 * @param fundReconciliationQueryVo 32 * @param size 33 * @param number 34 * @return 35 */ 36 public PageVo<FinanceToAccountDto> findfinancialInfo(FundReconciliationQueryVo fundReconciliationQueryVo, int size, int number) { 37 PageVo<FinanceToAccountDto> pageVo = null; 38 Map<String, Object> sqlListMap = financialInfoSql(fundReconciliationQueryVo); 39 try { 40 pageVo = jdbcTemplatePage.query(String.valueOf(sqlListMap.get("sql")), FinanceToAccountDto.class, number, size, (Map<String, Object>) sqlListMap.get("params")); 41 } catch (Exception e) { 42 e.printStackTrace(); 43 } 44 return pageVo; 45 } 46 47 48 /** 49 * sql 50 * 51 * @param fundReconciliationQueryVo 52 * @return 53 */ 54 public Map<String, Object> financialInfoSql(FundReconciliationQueryVo fundReconciliationQueryVo) { 55 StringBuffer sql = new StringBuffer(); 56 sql.append(" select rownum as indexNum,c.capital_number as capitalNumber, "); 57 sql.append(" c.customer_reference_name as customerReferenceName, "); 58 sql.append(" c.source_note_code as sourceNoteCode, "); 59 sql.append(" c.amount as amount, "); 60 sql.append(" c.post_date_time as postDateTime, "); 61 sql.append(" c.direction as direction, "); 62 sql.append(" fba.account_status as accountStatus "); 63 sql.append(" from CAPITAL c, fn_bills_account fba "); 64 sql.append(" where c.capital_number = fba.capital_number(+) "); 65 66 Map<String, Object> params = new HashMap<String, Object>(); 67 List<Object> list = new ArrayList<Object>(); 68 String[] accountStatusArry = fundReconciliationQueryVo.getAccountStatus().split(","); 69 for (String accountStatus : accountStatusArry) { 70 list.add(accountStatus); 71 } 72 if (!Lang.isEmpty(fundReconciliationQueryVo.getAccountStatus())) { 73 if (fundReconciliationQueryVo.getAccountStatus().indexOf("0") >= 0) { 74 sql.append(" and (fba.account_status is null or fba.account_status in(:accountstatus)) "); 75 } else { 76 sql.append(" and fba.account_status in(:accountstatus) "); 77 } 78 params.put("accountstatus", list); 79 } 80 if (!Lang.isEmpty(fundReconciliationQueryVo.getPostDateStartTime())) { 81 sql.append(" and c.post_date_time >= to_date(:postdatestarttime, 'yyyy-mm-dd hh24:mi:ss') "); 82 params.put("postdatestarttime", fundReconciliationQueryVo.getPostDateStartTime()); 83 } 84 if (!Lang.isEmpty(fundReconciliationQueryVo.getPostDateEndTime())) { 85 sql.append(" and c.post_date_time <= to_date(:postdateendtime, 'yyyy-mm-dd hh24:mi:ss') "); 86 params.put("postdateendtime", fundReconciliationQueryVo.getPostDateEndTime()); 87 } 88 if (!Lang.isEmpty(fundReconciliationQueryVo.getSourceNoteCode())) { 89 sql.append(" and c.source_note_code = :sourcenotecode "); 90 params.put("sourcenotecode", fundReconciliationQueryVo.getSourceNoteCode()); 91 } 92 log.info("财务到账信息列表查询sql===》:{}", sql.toString()); 93 Map<String, Object> map = new HashedMap(); 94 map.put("sql", sql.toString()); 95 map.put("params", params); 96 return map; 97 } 98 }