Mybatis 在dao中获取分页的总记录数
程序员文章站
2022-07-11 23:49:09
...
/** * get total count * @param sqlSession * @param statementName * @param values * @return */ private long getTotalCount(SqlSession sqlSession, String statementName,Object values ) { Map parameterMap=toParameterMap(values); long count=0l; try { MappedStatement mst = sqlSession.getConfiguration().getMappedStatement(statementName); BoundSql boundSql = mst.getBoundSql(parameterMap); String sql = " select count(*) total_count from (" + boundSql.getSql()+ ") "; PreparedStatement pstmt = sqlSession.getConnection().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.getLong("total_count"); } rs.close(); pstmt.close(); } catch (Exception e) { count=0l; 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; } } }