public Page<Map<String, Object>> queryForPage( String sqlId, Map<String, Object> args, int startRow, int fetchSize) { Map<String, Object> params = new HashMap<String, Object>(); params.put(CapJdbcContants.SQLPaging_SourceSQL, getSourceSql(sqlId, args, startRow, fetchSize)); StringBuffer sql = new StringBuffer() .append( CapDbUtil.spelParser( (String) sqltemp.getValue(CapJdbcContants.SQLPaging_TotalPage), params, sqlp.getParserContext())); sql.append(' ').append(sqltemp.getValue(CapJdbcContants.SQLQuery_Suffix, "")); if (logger.isTraceEnabled()) { logger.trace( new StringBuffer("\n\t") .append(CapDbUtil.convertToSQLCommand(sql.toString(), args)) .toString()); } // find list List<Map<String, Object>> list = this.queryPaging(sqlId, args, startRow, fetchSize); long cur = System.currentTimeMillis(); try { return new Page<Map<String, Object>>( list, super.queryForInt(sql.toString(), args), fetchSize, startRow); } catch (Exception e) { throw new CapDBException(e, causeClass); } finally { logger.info("CapNamedJdbcTemplate spend {} ms", (System.currentTimeMillis() - cur)); } } // ;
public Page<Map<String, Object>> queryForPage(String sqlId, ISearch search) { CapSqlSearchQueryProvider provider = new CapSqlSearchQueryProvider(search); String _sql = sqlp.getValue(sqlId, sqlId); StringBuffer sourceSql = new StringBuffer(_sql) .append(_sql.toUpperCase().lastIndexOf("WHERE") > 0 ? " AND " : " WHERE ") .append(provider.generateWhereCause()); Map<String, Object> params = new HashMap<String, Object>(); params.put(CapJdbcContants.SQLPaging_SourceSQL, sourceSql.toString()); // 準備查詢筆數sql StringBuffer sql = new StringBuffer() .append( CapDbUtil.spelParser( (String) sqltemp.getValue(CapJdbcContants.SQLPaging_TotalPage), params, sqlp.getParserContext())); sql.append(' ').append(sqltemp.getValue(CapJdbcContants.SQLQuery_Suffix, "")); if (logger.isTraceEnabled()) { logger.trace( new StringBuffer("\n\t") .append(CapDbUtil.convertToSQLCommand(sql.toString(), provider.getParams())) .toString()); } String sqlRow = sql.toString(); // 準備查詢list sql sourceSql.append(provider.generateOrderCause()); params.put(CapJdbcContants.SQLPaging_SourceSQL, sourceSql.toString()); sql = new StringBuffer() .append( CapDbUtil.spelParser( (String) sqltemp.getValue(CapJdbcContants.SQLPaging_Query), params, sqlp.getParserContext())); sql.append(' ').append(sqltemp.getValue(CapJdbcContants.SQLQuery_Suffix, "")); if (logger.isTraceEnabled()) { logger.trace( new StringBuffer("\n\t") .append(CapDbUtil.convertToSQLCommand(sql.toString(), provider.getParams())) .toString()); } long cur = System.currentTimeMillis(); try { int totalRows = super.queryForInt(sqlRow, provider.getParams()); List<Map<String, Object>> list = super.queryForList(sql.toString(), provider.getParams()); return new Page<Map<String, Object>>( list, totalRows, search.getMaxResults(), search.getFirstResult()); } catch (Exception e) { throw new CapDBException(e, causeClass); } finally { logger.info("CapNamedJdbcTemplate spend {} ms", (System.currentTimeMillis() - cur)); } } // ;
/** * 查詢,查詢結果為List<Map<key, value>> * * @param <T> bean * @param sqlId sqlId * @param appendDynamicSql append sql * @param args 傳入參數 * @param rm RowMapper * @return List<T> */ public <T> List<T> query( String sqlId, String appendDynamicSql, Map<String, ?> args, RowMapper<T> rm) { StringBuffer sql = new StringBuffer((String) sqlp.getValue(sqlId, sqlId)); if (appendDynamicSql != null) { sql.append(' ').append(appendDynamicSql); } if (!sql.toString().trim().toUpperCase().startsWith("CALL")) { sql.append(' ').append(sqltemp.getValue(CapJdbcContants.SQLQuery_Suffix, "")); } if (logger.isTraceEnabled()) { logger.trace( new StringBuffer("SqlId=") .append(sqlp.containsKey(sqlId) ? sqlId : "") .append("\n\t") .append(CapDbUtil.convertToSQLCommand(sql.toString(), args)) .toString()); } long cur = System.currentTimeMillis(); try { return super.query( sql.toString(), (Map<String, ?>) args, new RowMapperResultSetExtractor<T>(rm)); } catch (Exception e) { throw new CapDBException(e, causeClass); } finally { logger.info("CapNamedJdbcTemplate spend {} ms", (System.currentTimeMillis() - cur)); } } // ;
private String getSourceSql(String sqlId, Map<String, Object> args, int startRow, int fetchSize) { // Rewrite sql map. (ex: SQL Server => top n) String countAllSqlId = sqlId + ".countAll()"; if (sqltemp.containsKey(sqlId)) { Map<String, Object> preParams = new HashMap<String, Object>(); if (sqltemp.containsKey(countAllSqlId)) { preParams.put("countAll", sqltemp.getValue(countAllSqlId, countAllSqlId)); } return CapDbUtil.spelParser( sqltemp.getValue(sqlId, sqlId), preParams, sqltemp.getParserContext()); } else { return sqlp.getValue(sqlId, sqlId); } }
/** * wrapper SqlRowSet queryForRowSet(String sql, Object[] args) from * org.springframework.jdbc.core.JdbcTemplate * * @param sqlId sqlId * @param args 參數 * @return SqlRowSet */ public SqlRowSet queryForRowSet(String sqlId, Map<String, ?> args) { StringBuffer sql = new StringBuffer((String) sqlp.getValue(sqlId, sqlId)); sql.append(' ').append(sqltemp.getValue(CapJdbcContants.SQLQuery_Suffix, "")); if (logger.isTraceEnabled()) { logger.trace( new StringBuffer("SqlId=") .append(sqlp.containsKey(sqlId) ? sqlId : "") .append("\n\t") .append(CapDbUtil.convertToSQLCommand(sql.toString(), args)) .toString()); } long cur = System.currentTimeMillis(); try { return super.queryForRowSet(sql.toString(), args); } catch (Exception e) { throw new CapDBException(e, causeClass); } finally { logger.info("CapNamedJdbcTemplate spend {} ms", (System.currentTimeMillis() - cur)); } } // ;
/** * 新增、修改、刪除 * * @param sqlId sqlId * @param args Map<String, ?> * @return int * @throws GWException */ @SuppressWarnings({"unchecked", "rawtypes"}) public int update(String sqlId, Map<String, ?> args) { String sql = sqlp.getValue(sqlId, sqlId); if (logger.isTraceEnabled()) { logger.trace( new StringBuffer("SqlId=") .append(sqlp.containsKey(sqlId) ? sqlId : "") .append("\n\t") .append(CapDbUtil.convertToSQLCommand(sql, args)) .toString()); } long cur = System.currentTimeMillis(); try { return super.update(sql, (Map) args); } catch (Exception e) { throw new CapDBException(e, causeClass); } finally { logger.info("CapNamedJdbcTemplate spend {} ms", (System.currentTimeMillis() - cur)); } } // ;
public void query(String sqlId, Map<String, ?> args, RowCallbackHandler rch) { StringBuffer sql = new StringBuffer((String) sqlp.getValue(sqlId, sqlId)); if (!sql.toString().trim().toUpperCase().startsWith("CALL")) { sql.append(' ').append(sqltemp.getValue(CapJdbcContants.SQLQuery_Suffix, "")); } if (logger.isTraceEnabled()) { logger.trace( new StringBuffer("SqlId=") .append(sqlp.containsKey(sqlId) ? sqlId : "") .append("\n\t") .append(CapDbUtil.convertToSQLCommand(sql.toString(), args)) .toString()); } long cur = System.currentTimeMillis(); try { super.query(sql.toString(), args, rch); } catch (Exception e) { throw new CapDBException(e, causeClass); } finally { logger.info("CapNamedJdbcTemplate spend {} ms", (System.currentTimeMillis() - cur)); } } // ;
public int batchUpdate( String sqlId, Map<String, Integer> sqlTypes, final List<Map<String, Object>> batchValues) { long cur = System.currentTimeMillis(); try { int[] batchCount = null; String sql = sqlp.getValue(sqlId, sqlId); ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql); if (sqlTypes != null && !sqlTypes.isEmpty()) { MapSqlParameterSource[] batch = new MapSqlParameterSource[batchValues.size()]; for (int i = 0; i < batchValues.size(); i++) { Map<String, Object> valueMap = batchValues.get(i); batch[i] = new MapSqlParameterSource(); for (Entry<String, Integer> entry : sqlTypes.entrySet()) { if (!valueMap.containsKey(entry.getKey())) { valueMap.put(entry.getKey(), null); } batch[i].addValue(entry.getKey(), valueMap.get(entry.getKey()), entry.getValue()); } if (logger.isTraceEnabled()) { logger.trace( new StringBuffer("SqlId=") .append(sqlp.containsKey(sqlId) ? sqlId : "") .append("\n#") .append((i + 1)) .append("\t") .append(CapDbUtil.convertToSQLCommand(sql, valueMap)) .toString()); } } cur = System.currentTimeMillis(); batchCount = NamedParameterBatchUpdateUtils.executeBatchUpdateWithNamedParameters( parsedSql, batch, super.getJdbcOperations()); } else { SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch( batchValues.toArray(new HashMap[batchValues.size()])); cur = System.currentTimeMillis(); batchCount = NamedParameterBatchUpdateUtils.executeBatchUpdateWithNamedParameters( parsedSql, batch, super.getJdbcOperations()); } int rows = 0; for (int i : batchCount) { rows += i; } return rows; } catch (Exception e) { Throwable cause = (Throwable) e; String msg = cause.getMessage(); while ((cause = cause.getCause()) != null) { if (cause instanceof BatchUpdateException) { cause = ((BatchUpdateException) cause).getNextException(); } msg = cause.getMessage(); } throw new CapDBException(msg, e, causeClass); } finally { logger.info("CapNamedJdbcTemplate spend {} ms", (System.currentTimeMillis() - cur)); } } // ;