`
guohf
  • 浏览: 416966 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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;
			}
		}
	}
分享到:
评论
1 楼 qiankun 2012-10-27  
比较实用,好好学习了一下

相关推荐

    springmvc+mybatis+分页查询

    - **Page对象**:PageHelper返回的分页结果,包含总记录数、总页数以及当前页的数据列表。 - **参数传递**:在Controller中接收请求参数,如页码和每页数量,然后传递给Service进行分页查询。 4. **Maven工程**:...

    MyBatis 通用 Dao.pdf

    在 MyBatis 的通用 DAO 设计中,常常需要支持按不同字段进行升序或降序排序的需求。为此,我们可以定义一个 `Order` 枚举类型,用于表示排序规则。 ```java public enum Order { ASC, DESC } ``` 该枚举类型提供...

    MyBatis 最简单的分页

    2. **创建参数对象**:在Java代码中,创建一个包含分页参数的对象,如`PageParam`,包含当前页数和每页显示的记录数。 3. **调用Mapper接口**:在Service或DAO层,通过MyBatis的Mapper接口调用上述SQL语句,传入...

    mybatis 物理分页,借助于mybatis-paginator插件

    而逻辑分页通常是在应用层面完成的,它先获取所有查询结果,然后在内存中对这些结果进行切片,这在数据量大时可能会导致内存溢出。 `mybatis-paginator`插件的使用步骤如下: 1. **添加依赖**:在项目的pom.xml...

    MyBatis拦截器分页

    MyBatis拦截器分页是实现...通过这样的方式,我们就可以利用MyBatis拦截器实现动态的分页查询,而无需在每个Mapper接口或DAO层的实现中手动添加分页语句。这种解耦的设计使得代码更加简洁,同时也便于维护和扩展。

    mybatis分页插件源码

    查询结果自动被包装在PageInfo对象中,包含了总页数、总记录数等信息。 6. **自定义分页参数** 分页插件还支持自定义分页参数,如`params`属性可以传递其他查询条件,以适应复杂的查询需求。 7. **性能优化** ...

    ssm整合的jar和mybatis分页代码,mybatis生成工具类

    它通过计算总记录数和当前页的记录来实现分页效果,使得在大型数据集的应用场景下能有效提高性能。 接下来,`lib.rar` 文件很可能包含了SSM整合所需的依赖库。在Java项目中,尤其是Maven项目,依赖管理是非常重要的...

    mybatis分页拦截器(自动封装版)剖析.pdf

    在具体实现中,通常会有一个PageBean类来封装分页参数,如当前页数(`pageNo`)、每页显示记录数(`pageSize`)以及总记录数(`totalRecord`)等。PageBean还可能包含其他辅助信息,如URL参数(`actionUrl`)和请求...

    SSM中使用Mybatis的PageHelper插件实现分页

    接下来,我们需要在Service或DAO层的方法中使用PageHelper的startPage()方法来开启分页,并传入当前页码和每页大小。例如: ```java PageHelper.startPage(pageNum, pageSize); List&lt;User&gt; users = userMapper....

    Mybatis通用分页插件

    3. **PageHelper的使用**:在Service层或DAO层的代码中,使用PageHelper.startPage()方法初始化分页参数,然后执行查询方法,最后通过PageHelper的Page对象获取分页结果。 通过以上介绍,我们可以看到Mybatis通用...

    mybatis的分页插件

    5. **使用 PageHelper**:在 Service 层或者 Dao 层的方法中,通过 PageHelper.startPage() 开启分页,然后执行查询方法,最后通过 PageInfo 获取分页结果。 总的来说,MyBatis 分页插件 PageHelper 是一个强大且...

    mybatis 分页插件jar包

    5. 页面展示:在前端页面,根据Page对象返回的总记录数、当前页码、每页记录数等信息,渲染出分页导航。 PageHelper还提供了其他高级特性,例如: - 参数自动处理:可以自动识别参数类型,处理Order By、Group By...

    DAO模式与分页显示

    在实际应用中,DAO模式与分页显示相结合,通常是这样的:首先,通过DAO对象从数据库中查询出需要的数据集合,然后根据分页参数(如每页记录数、当前页码)计算出显示的数据范围,最后在前端使用DisplayTag或Pager-...

    mybatis 通用DAO 简单实现

    总的来说,MyBatis的通用DAO简化了数据库操作,但并不能完全替代特定业务的DAO实现。对于复杂的业务逻辑和查询,仍然需要自定义DAO来满足需求。在开发过程中,结合通用DAO和特定DAO的使用,可以达到高效且灵活的持久...

    SpringMVC+MyBatis+EasyUI简单分页Demo

    在本项目"SpringMVC+MyBatis+EasyUI简单分页Demo"中,我们将探讨如何结合这三种技术实现一个具备基本分页功能的Web应用。SpringMVC是Spring框架的一部分,负责处理HTTP请求和响应;MyBatis是一个轻量级的持久层框架...

    MyBatis_Dao

    总的来说,MyBatis_Dao是MyBatis框架中实现数据访问的重要组成部分,它使得数据库操作更加简洁、高效,降低了开发难度,同时提高了代码的可维护性。通过合理设计和使用,MyBatis_Dao能够帮助开发者构建出高质量的...

    mybatis分页(struts2+spring+mybatis)

    本项目“mybatis分页(struts2+spring+mybatis)”演示了如何在Java Web应用中实现基于MyBatis的分页功能,结合Struts2和Spring框架,提供了一个完整的解决方案。下面将详细解释这个项目涉及的知识点。 1. **...

    mybatis插件分页测试

    4. **结果集处理**:在查询后,PageHelper会返回一个Page对象,除了包含查询结果外,还包含了总记录数、总页数等分页信息。我们可以利用这些信息进行前端展示。 ```java PageInfo&lt;User&gt; pageInfo = new PageInfo...

    pring_mybatis物理分页

    "Spring_MyBatis物理分页"是指在Spring和MyBatis集成环境中实现的数据库物理分页功能。本文将深入探讨这个主题,包括其实现原理、优点以及如何在项目中进行配置。 首先,让我们了解什么是物理分页。物理分页是...

    MyBatis 分页插件PageHelper Demo

    这里的`PageInfo`类是PageHelper提供的,用于封装分页结果,包括总记录数、当前页数据以及分页参数等。 **分页参数传递** 在Controller层,我们可以将分页参数(如:页码、每页大小)通过方法参数传递给Service层...

Global site tag (gtag.js) - Google Analytics