ibatis 分页如何获取 总记录数 ibatis分页selectcount 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我所理解的好像没有更快的办法了...毕竟你是获取总记录数, 这个要么就是直接sql查询count,要么就是你查询的list.size().. 用count关键字,不用重新再写一句sql,直接用原有的sql只要在select *这个地方用ibatis的isEquals标签用个标识来标记是select *还是select count(1),后面的sql都可以不用改变 代码如下 怎么用自己处理下不用多些一个count sqlList<Coupons> data = activityDao.commonQueryList( "Activity.getCouponsList", coupons); Integer count = activityDao.listCount("Activity.getCouponsList", coupons);@SuppressWarnings("unchecked") public Integer listCount(String statement, Object parameter) { return getTotalCount(getSqlSessionTemplate(), statement, parameter); } /** * get total count * * @param sqlSession * @param statementName * @param values * @return */ private Integer getTotalCount(SqlSessionTemplate sqlSession, String statementName, Object values) { Map parameterMap = toParameterMap(values); Integer count = 0; try { MappedStatement mst = sqlSession.getSqlSessionFactory() .getConfiguration().getMappedStatement(statementName); BoundSql boundSql = mst.getBoundSql(parameterMap); String sql = " select count(*) total_count from (" + boundSql.getSql() + ") "; Connection con = sqlSession.getDataSource().getConnection(); PreparedStatement pstmt = con.prepareStatement(sql); // BoundSql countBS = new // BoundSql(mst.getConfiguration(),sql,boundSql.getParameterMappings(),parameterMap); setParameters(pstmt, mst, boundSql, parameterMap); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { count = rs.getInt("total_count"); } rs.close(); con.close(); pstmt.close(); } catch (Exception e) { count = 0; e.printStackTrace(); throw new RuntimeException(e); } return count; } /** * 对SQL参数(?)设值,参考org.apache.ibatis.executor.parameter. * DefaultParameterHandler * * @param ps * @param mappedStatement * @param boundSql * @param parameterObject * @throws SQLException */ private void setParameters(PreparedStatement ps, MappedStatement mappedStatement, BoundSql boundSql, Object parameterObject) throws SQLException { ErrorContext.instance().activity("setting parameters") .object(mappedStatement.getParameterMap().getId()); List<ParameterMapping> parameterMappings = boundSql .getParameterMappings(); if (parameterMappings != null) { Configuration configuration = mappedStatement.getConfiguration(); TypeHandlerRegistry typeHandlerRegistry = configuration .getTypeHandlerRegistry(); MetaObject metaObject = parameterObject == null ? null : configuration.newMetaObject(parameterObject); for (int i = 0; i < parameterMappings.size(); i++) { ParameterMapping parameterMapping = parameterMappings.get(i); if (parameterMapping.getMode() != ParameterMode.OUT) { Object value; String propertyName = parameterMapping.getProperty(); PropertyTokenizer prop = new PropertyTokenizer(propertyName); if (parameterObject == null) { value = null; } else if (typeHandlerRegistry .hasTypeHandler(parameterObject.getClass())) { value = parameterObject; } else if (boundSql.hasAdditionalParameter(propertyName)) { value = boundSql.getAdditionalParameter(propertyName); } else if (propertyName .startsWith(ForEachSqlNode.ITEM_PREFIX) && boundSql.hasAdditionalParameter(prop.getName())) { value = boundSql.getAdditionalParameter(prop.getName()); if (value != null) { value = configuration.newMetaObject(value) .getValue( propertyName.substring(prop .getName().length())); } } else { value = metaObject == null ? null : metaObject .getValue(propertyName); } TypeHandler typeHandler = parameterMapping.getTypeHandler(); if (typeHandler == null) { throw new ExecutorException( "There was no TypeHandler found for parameter " + propertyName + " of statement " + mappedStatement.getId()); } typeHandler.setParameter(ps, i + 1, value, parameterMapping.getJdbcType()); } } } } protected Map toParameterMap(Object parameter) { if (parameter == null) { return new HashMap(); } if (parameter instanceof Map) { return (Map<?, ?>) parameter; } else { try { return PropertyUtils.describe(parameter); } catch (Exception e) { e.printStackTrace(); return null; } } } 在xml里面写好count方法吧 这样简单省事 这样每个查询语句都要增加COUNT的SELECT,个人感觉不是很好 关于导入jar包 批处理文件 如何在Action里嵌入js Dynamin Web Project与Web Project有何区别 结合数据库,实现树形下拉列表? 怎么更改Weblogic中的默认WEB目录? 十分菜鸟问题,请大家来帮忙 高手助我!Hibernate 问题 有谁用过JBuilder5和JBuilder8,我想从5升到8,能否建议一下之间的差异? springboot整合jpa+shiro登录时报错,请教各路大神怎么解决? java问题 eclipse project explorer 下面的字体怎么更改大小
不用多些一个count sql
List<Coupons> data = activityDao.commonQueryList(
"Activity.getCouponsList", coupons);
Integer count = activityDao.listCount("Activity.getCouponsList",
coupons);@SuppressWarnings("unchecked")
public Integer listCount(String statement, Object parameter) {
return getTotalCount(getSqlSessionTemplate(), statement, parameter);
} /**
* get total count
*
* @param sqlSession
* @param statementName
* @param values
* @return
*/
private Integer getTotalCount(SqlSessionTemplate sqlSession,
String statementName, Object values) {
Map parameterMap = toParameterMap(values);
Integer count = 0;
try {
MappedStatement mst = sqlSession.getSqlSessionFactory()
.getConfiguration().getMappedStatement(statementName);
BoundSql boundSql = mst.getBoundSql(parameterMap);
String sql = " select count(*) total_count from ("
+ boundSql.getSql() + ") ";
Connection con = sqlSession.getDataSource().getConnection();
PreparedStatement pstmt = con.prepareStatement(sql);
// BoundSql countBS = new
// BoundSql(mst.getConfiguration(),sql,boundSql.getParameterMappings(),parameterMap);
setParameters(pstmt, mst, boundSql, parameterMap);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
count = rs.getInt("total_count");
}
rs.close();
con.close();
pstmt.close();
} catch (Exception e) {
count = 0;
e.printStackTrace();
throw new RuntimeException(e);
}
return count;
} /**
* 对SQL参数(?)设值,参考org.apache.ibatis.executor.parameter.
* DefaultParameterHandler
*
* @param ps
* @param mappedStatement
* @param boundSql
* @param parameterObject
* @throws SQLException
*/
private void setParameters(PreparedStatement ps,
MappedStatement mappedStatement, BoundSql boundSql,
Object parameterObject) throws SQLException {
ErrorContext.instance().activity("setting parameters")
.object(mappedStatement.getParameterMap().getId());
List<ParameterMapping> parameterMappings = boundSql
.getParameterMappings();
if (parameterMappings != null) {
Configuration configuration = mappedStatement.getConfiguration();
TypeHandlerRegistry typeHandlerRegistry = configuration
.getTypeHandlerRegistry();
MetaObject metaObject = parameterObject == null ? null
: configuration.newMetaObject(parameterObject);
for (int i = 0; i < parameterMappings.size(); i++) {
ParameterMapping parameterMapping = parameterMappings.get(i);
if (parameterMapping.getMode() != ParameterMode.OUT) {
Object value;
String propertyName = parameterMapping.getProperty();
PropertyTokenizer prop = new PropertyTokenizer(propertyName);
if (parameterObject == null) {
value = null;
} else if (typeHandlerRegistry
.hasTypeHandler(parameterObject.getClass())) {
value = parameterObject;
} else if (boundSql.hasAdditionalParameter(propertyName)) {
value = boundSql.getAdditionalParameter(propertyName);
} else if (propertyName
.startsWith(ForEachSqlNode.ITEM_PREFIX)
&& boundSql.hasAdditionalParameter(prop.getName())) {
value = boundSql.getAdditionalParameter(prop.getName());
if (value != null) {
value = configuration.newMetaObject(value)
.getValue(
propertyName.substring(prop
.getName().length()));
}
} else {
value = metaObject == null ? null : metaObject
.getValue(propertyName);
}
TypeHandler typeHandler = parameterMapping.getTypeHandler();
if (typeHandler == null) {
throw new ExecutorException(
"There was no TypeHandler found for parameter "
+ propertyName + " of statement "
+ mappedStatement.getId());
}
typeHandler.setParameter(ps, i + 1, value,
parameterMapping.getJdbcType());
}
}
}
} protected Map toParameterMap(Object parameter) {
if (parameter == null) {
return new HashMap();
}
if (parameter instanceof Map) {
return (Map<?, ?>) parameter;
} else {
try {
return PropertyUtils.describe(parameter);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
这样每个查询语句都要增加COUNT的SELECT,个人感觉不是很好