读书人

Mybatis 在dao中获取分页的总记要数

发布时间: 2012-08-09 15:59:21 作者: rapoo

Mybatis 在dao中获取分页的总记录数

/** * 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;}}}

读书人网 >开源软件

热点推荐