(1);
paramMap.put(StringUtil.strnull(namedParam), Arrays.asList(value));
return selectMapList(sql, paramMap);
}
/**
* 允许用户自己定义返回的行对象类型
*
* @param sql
* @param paramMap
* @param mapper
* @return
*/
public List selectList(String sql, Map paramMap, RowMapper mapper) {
getLogInfo(sql, paramMap);
if (mapper == null) {
mapper = new RowMapper() {
public Object mapRow(ResultSet rset, int rowNum)
throws SQLException {
return row2Map(rset);
}
};
}
Log.info(JdbcDAOImpl.class, sql);
return getNamedParameterJdbcTemplate().query(sql, paramMap, mapper);
}
/**
* 查询单列的情况
*
* @param sql
* @param paramMap
* @param elementType
* @return
*/
public List selectSingleColList(String sql, Map paramMap, Class elementType) {
getLogInfo(sql, paramMap);
// Log.info(JdbcDAOImpl.class, sql);
return getNamedParameterJdbcTemplate().queryForList(sql, paramMap,
elementType);
}
/**
* 根据动态条件查询返回一个断开连接的结果集,不占用数据库连接资源
*
* @param sql-原来的sql
* @param paramMap-原有的条件
* @param queryObject-动态拼装的查询条件对象
* @return ResultSetWrappingSqlRowSet
*/
public ResultSetWrappingSqlRowSet queryForRowSet(String sql, Map paramMap,
QueryObject queryObject) {
Assert.hasText(sql);
Assert.notNull(queryObject, "queryObject must not be null");
Map queryMap = queryObject.getParamsMap();
String querySql = queryObject.getQuerySql().toString();
// 构造新的sql语句
String newSql = QuerySqlParser.getQuerySql(sql, querySql);
MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
// 增加动态命名条件
sqlParam.addValues(queryMap);
// 日志打印
getLogInfo(newSql, sqlParam.getValues());
return (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
.queryForRowSet(sql, sqlParam);
}
/**
* 查询返回一个断开连接的结果集,不占用数据库连接资源
*
* @param sql
* @param paramMap
* @return ResultSetWrappingSqlRowSet
*
*
* 处理方式参看以下方法:
* getXmlPage(ResultSetWrappingSqlRowSet sqlRowSet, int startIndex, int pageSize){}
*
*
*/
public ResultSetWrappingSqlRowSet queryForRowSet(String sql, Map paramMap) {
Assert.hasText(sql);
// 日志打印
getLogInfo(sql, paramMap);
MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
return (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
.queryForRowSet(sql, sqlParam);
}
/**
* 只有一个参数的情况
*
* @param sql:查询的sql语句
* @param namedParam:命名参数
* @param value:参数值
* @return 返回一个断开连接的结果集,不占用数据库连接资源
* @see ResultSetWrappingSqlRowSet.java
*/
public ResultSetWrappingSqlRowSet queryForRowSet(String sql,
String namedParam, Object value) {
Assert.hasText(sql);
Map paramMap = new HashMap(1);
paramMap.put(StringUtil.strnull(namedParam), value);
return queryForRowSet(sql, paramMap);
}
/**
* 根据动态条件查询返回一个断开连接的结果集,不占用数据库连接资源
*
* @param sql-原来的sql
* @param namedParam:命名参数
* @param value:参数值
* @param queryObject-动态拼装的查询条件对象
* @return ResultSetWrappingSqlRowSet
*/
public ResultSetWrappingSqlRowSet queryForRowSet(String sql,
String namedParam, Object value, QueryObject queryObject) {
Assert.hasText(sql);
Map paramMap = new HashMap(1);
paramMap.put(StringUtil.strnull(namedParam), value);
return queryForRowSet(sql, paramMap, queryObject);
}
/**
* 只有一个参数的情况
*
* @param sql:查询的sql语句
* @param namedParam:命名参数
* @param values:参数数组,用在in的情况
* @return 返回一个断开连接的结果集,不占用数据库连接资源
* @see ResultSetWrappingSqlRowSet.java
*/
public ResultSetWrappingSqlRowSet queryForRowSet(String sql,
String namedParam, Object[] values) {
Assert.hasText(sql);
Map paramMap = new HashMap(1);
paramMap.put(StringUtil.strnull(namedParam), Arrays.asList(values));
return queryForRowSet(sql, paramMap);
}
/**
* 根据动态条件查询返回一个断开连接的结果集,不占用数据库连接资源
*
* @param sql-原来的sql
* @param namedParam:命名参数
* @param value:参数数组
* 用在in的情况
* @param queryObject-动态拼装的查询条件对象
* @return ResultSetWrappingSqlRowSet
*/
public ResultSetWrappingSqlRowSet queryForRowSet(String sql,
String namedParam, Object[] values, QueryObject queryObject) {
Assert.hasText(sql);
Map paramMap = new HashMap(1);
paramMap.put(StringUtil.strnull(namedParam), Arrays.asList(values));
return queryForRowSet(sql, paramMap, queryObject);
}
/**
* 没有参数的情况
*
* @param sql:查询的sql语句
* @param queryObject-动态拼装的查询条件对象
*
* @return 返回一个断开连接的结果集,不占用数据库连接资源
* @see ResultSetWrappingSqlRowSet.java
*/
public ResultSetWrappingSqlRowSet queryForRowSet(String sql,
QueryObject queryObject) {
Assert.hasText(sql);
Assert.notNull(queryObject, "queryObject must not be null");
Map queryMap = queryObject.getParamsMap();
String querySql = queryObject.getQuerySql().toString();
// 构造新的sql语句
String newSql = QuerySqlParser.getQuerySql(sql, querySql);
Assert.hasText(newSql);
MapSqlParameterSource sqlParam = new MapSqlParameterSource(queryMap);
// 日志打印
getLogInfo(newSql, queryMap);
return (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
.queryForRowSet(sql, sqlParam);
}
/**
* 没有参数的情况
*
* @param sql:查询的sql语句
* @return 返回一个断开连接的结果集,不占用数据库连接资源 see ResultSetWrappingSqlRowSet.java
*/
public ResultSetWrappingSqlRowSet queryForRowSet(String sql) {
Assert.hasText(sql);
return (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
.queryForRowSet(sql, new MapSqlParameterSource());
}
/**
* 分页查询
* 1、sql, pageNO, pageSize, mode, Map
* 2、总记录数totalCount的计算:()
* A)count(*)-- queryForInt
* B)滚动指针 --
* 3、返回结果集SqlRowSet
* A)分不同数据库的情况:转换sql分页语句
* B)
* 4、取结果集,封装成List(HashMap)
* 5、返回page
*
*/
public Page pagedQuery(String sql, int pageNo, int pageSize) {
return pagedQuery(sql, pageNo, pageSize, null, Constants.COUNT_MODE);
}
public Page pagedQuery(String sql, int pageNo, int pageSize,
String namedParam, Object value) {
HashMap paramMap = new HashMap(1);
paramMap.put(StringUtil.strnull(namedParam), value);
return pagedQuery(sql, pageNo, pageSize, paramMap, Constants.COUNT_MODE);
}
public Page pagedQuery(String sql, int pageNo, int pageSize, Map paramMap) {
return pagedQuery(sql, pageNo, pageSize, paramMap, Constants.COUNT_MODE);
}
/**
* 分页查询
*/
public Page pagedQuery(String sql, int pageNo, int pageSize, Map paramMap,
int mode) {
Assert.hasText(sql);
// 日志打印
getLogInfo(sql, paramMap);
MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
return getPage(sql, sqlParam, pageNo, pageSize, mode);
// NamedParameterJdbcTemplate jdbcTemplate =
// getNamedParameterJdbcTemplate();
// if (mode == Constants.COUNT_MODE) {
// // 这个计算支持 group
// String countQueryString = QuerySqlParser.getCountSql(sql);
//
// getLogInfo(countQueryString, paramMap);
// String tmpsql = countQueryString.toLowerCase().replaceAll("\\s+",
// " ");
// int totalCount = 0;
// // try {
// // 判断是否有group by
// if (QuerySqlParser.isFilterGroupBy(tmpsql)) {
// List ls = jdbcTemplate.queryForList(countQueryString, sqlParam);
// if (ls != null) {
// totalCount = ls.size();
// }
// } else {
// totalCount = jdbcTemplate.queryForInt(countQueryString,
// sqlParam);
// }
// return getPageInstanceByCount(sql, totalCount, pageNo, pageSize,
// sqlParam, jdbcTemplate);
// } else {
// return getPageInstanceByScroll(sql, pageNo, pageSize, sqlParam,
// jdbcTemplate);
// }
}
/**
* 动态拼装条件的分页查询
*
* @param sql
* @param paramMap
* @param webParam:查询条件,从HTTP
* Request中生成,请参照
* @see com.westsnow.base.jdbc.support.QueryWebUtils#generateQueryWebParameter
* @return 分页对象
*/
public Page pagedQuery(String sql, QueryWebParameter webParam) {
return pagedQuery(sql, null, webParam);
}
/**
* 约束条件
*
* @param sql
* @param webParam
* @param gridkey:查询列表命名常量
* @return
*/
public Page pagedQuery(String sql, QueryWebParameter webParam,
String gridkey) {
return pagedQuery(sql, null, webParam, gridkey);
}
public Page pagedQuery(String sql, Map paramMap, QueryWebParameter webParam) {
return pagedQuery(sql, paramMap, webParam, null);
}
/**
* 动态拼装条件的分页查询
*
* @param sql
* @param paramMap
* @param webParam:查询条件,从HTTP
* Request中生成,请参照
* @see com.westsnow.base.jdbc.support.QueryWebUtils#generateQueryWebParameter
* @return 分页对象
*/
public Page pagedQuery(String sql, Map paramMap,
QueryWebParameter webParam, String gridkey) {
Assert.notNull(webParam, "QueryWebParameter must not be null");
QueryParam queryParam = QueryWebUtils.generateQueryParam(webParam
.getName(), webParam.getOperator(), webParam.getActualValues());
QueryObject queryObject = queryParam.toQueryObject();
// 增加排序条件
queryObject.setOrderby(webParam.getSortfield(), webParam.getSorttype());
return pagedQuery(sql, webParam.getPageNo(), webParam.getPageSize(),
paramMap, queryObject, Constants.COUNT_MODE, gridkey);
}
/**
* 动态拼装条件的分页查询,默认采用先查询总数,再获取数据的方式
*
* @param sql
* @param pageNo
* @param pageSize
* @param paramMap
* @param queryObject
* @return
*/
public Page pagedQuery(String sql, int pageNo, int pageSize, Map paramMap,
QueryObject queryObject) {
Assert.notNull(queryObject, "queryObject must not be null");
return pagedQuery(sql, pageNo, pageSize, paramMap, queryObject,
Constants.COUNT_MODE);
}
public Page pagedQuery(String sql, int pageNo, int pageSize, Map paramMap,
QueryObject queryObject, int mode) {
return pagedQuery(sql, pageNo, pageSize, paramMap, queryObject, mode,
null);
}
/**
*
* 分页查询
* 1、sql, pageNO, pageSize, mode, Map
* 2、总记录数totalCount的计算:()
* A)count(*)-- queryForInt
* B)滚动指针 --
* 3、返回结果集SqlRowSet
* A)分不同数据库的情况:转换sql分页语句
* B)
* 4、取结果集,封装成List(HashMap)
* 5、返回page
*
* @param sql:select
* a.* ,b.name,c.nid from a,b,c where a.bid = b.nid and b.cid =
* c.nid
* @param pageNo
* @param pageSize
* @param paramMap
* @param queryObject
* 动态条件
* @param mode
*
1) Contants.COUNT_MODE:采用count(*)查询出总记录数,再分不同数据库查询分页数据
* 2) Contants.SCROLL_MODE:采用滚动指针,断开连接后处理结果集
* @return Page
*/
public Page pagedQuery(String sql, int pageNo, int pageSize, Map paramMap,
QueryObject queryObject, int mode, String gridkey) {
Assert.hasText(sql);
Assert.notNull(queryObject, "queryObject must not be null");
Map queryMap = queryObject.getParamsMap();
String orderSql = queryObject.getOrderbySql();
String querySql = queryObject.getQuerySql().append(" ")
.append(orderSql).toString();
// 构造新的sql语句
String newSql = QuerySqlParser.getQuerySql(sql, querySql);
// 增加约束条件
if (StringUtil.isNotEmpty(gridkey)) {
String limitconf = RecordPermissionChecker.getRecordLimit(gridkey);
if (logger.isInfoEnabled()) {
logger.info("列表[" + gridkey + "]的约束条件=" + limitconf);
}
if (StringUtil.isNotEmpty(limitconf)) {
newSql = QuerySqlParser.getQuerySql(newSql, limitconf);
}
}
MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
// 增加动态命名条件
if (null != queryMap && queryMap.size() > 0) {
sqlParam.addValues(queryMap);
}
// 日志打印
getLogInfo(newSql, sqlParam.getValues());
return getPage(newSql, sqlParam, pageNo, pageSize, mode);
}
/**
*
* @param pageNo
* @param pageSize
* @param mode
* @param newSql
* @param sqlParam
* @return
*/
private Page getPage(String newSql, MapSqlParameterSource sqlParam,
int pageNo, int pageSize, int mode) {
NamedParameterJdbcTemplate jdbcTemplate = getNamedParameterJdbcTemplate();
if (mode == Constants.COUNT_MODE) {
// 这个计算支持 group
String countQueryString = QuerySqlParser.getCountSql(newSql);
getLogInfo(countQueryString, sqlParam.getValues());
int totalCount = 0;
// try {
// 判断是否有group by
String tmpsql = countQueryString.toLowerCase().replaceAll("\\s+",
" ");
if (QuerySqlParser.isFilterGroupBy(tmpsql)) {
List ls = jdbcTemplate.queryForList(countQueryString, sqlParam);
if (ls != null) {
totalCount = ls.size();
}
} else {
totalCount = jdbcTemplate.queryForInt(countQueryString,
sqlParam);
}
// } catch (Exception ex) {
//
// }
return getPageInstanceByCount(newSql, totalCount, pageNo, pageSize,
sqlParam, jdbcTemplate);
} else {
return getPageInstanceByScroll(newSql, pageNo, pageSize, sqlParam,
jdbcTemplate);
}
}
/**
* 分页查询
*
* @param sql:查询的sql语句
*
* @param pageNo:页号
*
* @param pageSize:每页显示的数目
*
* @param namedParam:命名参数
*
* @param value:参数值
*
* @param mode
*
1) Contants.COUNT_MODE:采用count(*)查询出总记录数,再分不同数据库查询分页数据
* 2) Contants.SCROLL_MODE:采用滚动指针,断开连接后处理结果集
*
* @return 分页对象Page
*/
public Page pagedQuery(String sql, int pageNo, int pageSize,
String namedParam, Object value, int mode) {
Assert.hasText(sql);
Map paramMap = new HashMap(1);
paramMap.put(StringUtil.strnull(namedParam), value);
getLogInfo(sql, paramMap);
return pagedQuery(sql, pageNo, pageSize, paramMap, mode);
}
/**
* 分页查询--滚动分页
*
* @param sql:查询的sql语句
*
* @param pageNo:页号
*
* @param pageSize:每页显示的数目
*
* @param namedParam:命名参数
*
* @param value:参数值
*
* @param mode
*
1) Contants.COUNT_MODE:采用count(*)查询出总记录数,再分不同数据库查询分页数据
* 2) Contants.SCROLL_MODE:采用滚动指针,断开连接后处理结果集
* @return 分页对象Page
*/
public Page pagedQuery(String sql, int pageNo, int pageSize, int mode) {
Assert.hasText(sql);
getLogInfo(sql, null);
return pagedQuery(sql, pageNo, pageSize, null, mode);
}
/**
* 内部方法,不建议外部调用;返回分页数据
*
* @param sql
* 查询sql语句
* @param totalSize
* 总记录数
* @param pageNo
* 第几页
* @param pageSize
* 每页显示记录数
* @param MapSqlParameterSource
* 参数Map
* @param jdbcTemplate
* 命名参数模版
* @return 返回分页数据
*/
protected static Page getPageInstanceByCount(String sql, int totalSize,
int pageNo, int pageSize, MapSqlParameterSource sqlParam,
NamedParameterJdbcTemplate jdbcTemplate) {
if (totalSize < 1)
return new Page();
pageSize = pageSize <= 0 ? Constants.DEFAULT_PAGE_SIZE : pageSize;// 20
pageNo = pageNo <= 0 ? 1 : pageNo;// 1
int startIndex = (pageNo - 1) * pageSize;
int endIndex = startIndex + pageSize;
String pagingSql = SqlUtil.getLimitString(sql, startIndex, endIndex);
List results = jdbcTemplate.queryForList(pagingSql, sqlParam);
return new Page(startIndex, totalSize, pageSize, results);
}
/**
* 内部方法,不建议外部调用;返回分页数据 采用滚动指针方式查询
*
* @param sql
* 查询sql语句
* @param totalSize
* 总记录数
* @param pageNo
* 第几页
* @param pageSize
* 每页显示记录数
* @param MapSqlParameterSource
* 参数Map
* @param jdbcTemplate
* 命名参数模版
* @return 返回分页数据
*/
protected static Page getPageInstanceByScroll(String sql, int pageNo,
int pageSize, MapSqlParameterSource sqlParam,
NamedParameterJdbcTemplate jdbcTemplate) {
pageSize = pageSize <= 0 ? Constants.DEFAULT_PAGE_SIZE : pageSize;// 20
pageNo = pageNo <= 0 ? 1 : pageNo;// 1
int startIndex = (pageNo - 1) * pageSize;
ResultSetWrappingSqlRowSet sqlRowSet = (ResultSetWrappingSqlRowSet) jdbcTemplate
.queryForRowSet(sql, sqlParam);
return getPageInstance(sqlRowSet, startIndex, pageSize);
}
/**
* 内部方法,不建议外部调用;返回分页数据 采用滚动指针方式查询
*
* @param sqlRowSet
* 结果集
* @param startIndex
* 起始行
* @param pageSize
* 每页显示记录数
* @return 返回分页数据
*/
private static Page getPageInstance(ResultSetWrappingSqlRowSet sqlRowSet,
int startIndex, int pageSize) {
int count = 0;
sqlRowSet.last();
int totalSize = sqlRowSet.getRow();
if (totalSize < 1) {
return new Page();
}
if (startIndex > totalSize) {
return new Page(startIndex, totalSize, pageSize, new ArrayList());
}
sqlRowSet.first();
sqlRowSet.relative(startIndex - 1);
List