/**
* 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;
}
}
}
分享到:
相关推荐
- **Page对象**:PageHelper返回的分页结果,包含总记录数、总页数以及当前页的数据列表。 - **参数传递**:在Controller中接收请求参数,如页码和每页数量,然后传递给Service进行分页查询。 4. **Maven工程**:...
在 MyBatis 的通用 DAO 设计中,常常需要支持按不同字段进行升序或降序排序的需求。为此,我们可以定义一个 `Order` 枚举类型,用于表示排序规则。 ```java public enum Order { ASC, DESC } ``` 该枚举类型提供...
2. **创建参数对象**:在Java代码中,创建一个包含分页参数的对象,如`PageParam`,包含当前页数和每页显示的记录数。 3. **调用Mapper接口**:在Service或DAO层,通过MyBatis的Mapper接口调用上述SQL语句,传入...
而逻辑分页通常是在应用层面完成的,它先获取所有查询结果,然后在内存中对这些结果进行切片,这在数据量大时可能会导致内存溢出。 `mybatis-paginator`插件的使用步骤如下: 1. **添加依赖**:在项目的pom.xml...
MyBatis拦截器分页是实现...通过这样的方式,我们就可以利用MyBatis拦截器实现动态的分页查询,而无需在每个Mapper接口或DAO层的实现中手动添加分页语句。这种解耦的设计使得代码更加简洁,同时也便于维护和扩展。
查询结果自动被包装在PageInfo对象中,包含了总页数、总记录数等信息。 6. **自定义分页参数** 分页插件还支持自定义分页参数,如`params`属性可以传递其他查询条件,以适应复杂的查询需求。 7. **性能优化** ...
它通过计算总记录数和当前页的记录来实现分页效果,使得在大型数据集的应用场景下能有效提高性能。 接下来,`lib.rar` 文件很可能包含了SSM整合所需的依赖库。在Java项目中,尤其是Maven项目,依赖管理是非常重要的...
在具体实现中,通常会有一个PageBean类来封装分页参数,如当前页数(`pageNo`)、每页显示记录数(`pageSize`)以及总记录数(`totalRecord`)等。PageBean还可能包含其他辅助信息,如URL参数(`actionUrl`)和请求...
接下来,我们需要在Service或DAO层的方法中使用PageHelper的startPage()方法来开启分页,并传入当前页码和每页大小。例如: ```java PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper....
3. **PageHelper的使用**:在Service层或DAO层的代码中,使用PageHelper.startPage()方法初始化分页参数,然后执行查询方法,最后通过PageHelper的Page对象获取分页结果。 通过以上介绍,我们可以看到Mybatis通用...
5. **使用 PageHelper**:在 Service 层或者 Dao 层的方法中,通过 PageHelper.startPage() 开启分页,然后执行查询方法,最后通过 PageInfo 获取分页结果。 总的来说,MyBatis 分页插件 PageHelper 是一个强大且...
5. 页面展示:在前端页面,根据Page对象返回的总记录数、当前页码、每页记录数等信息,渲染出分页导航。 PageHelper还提供了其他高级特性,例如: - 参数自动处理:可以自动识别参数类型,处理Order By、Group By...
在实际应用中,DAO模式与分页显示相结合,通常是这样的:首先,通过DAO对象从数据库中查询出需要的数据集合,然后根据分页参数(如每页记录数、当前页码)计算出显示的数据范围,最后在前端使用DisplayTag或Pager-...
总的来说,MyBatis的通用DAO简化了数据库操作,但并不能完全替代特定业务的DAO实现。对于复杂的业务逻辑和查询,仍然需要自定义DAO来满足需求。在开发过程中,结合通用DAO和特定DAO的使用,可以达到高效且灵活的持久...
在本项目"SpringMVC+MyBatis+EasyUI简单分页Demo"中,我们将探讨如何结合这三种技术实现一个具备基本分页功能的Web应用。SpringMVC是Spring框架的一部分,负责处理HTTP请求和响应;MyBatis是一个轻量级的持久层框架...
总的来说,MyBatis_Dao是MyBatis框架中实现数据访问的重要组成部分,它使得数据库操作更加简洁、高效,降低了开发难度,同时提高了代码的可维护性。通过合理设计和使用,MyBatis_Dao能够帮助开发者构建出高质量的...
本项目“mybatis分页(struts2+spring+mybatis)”演示了如何在Java Web应用中实现基于MyBatis的分页功能,结合Struts2和Spring框架,提供了一个完整的解决方案。下面将详细解释这个项目涉及的知识点。 1. **...
4. **结果集处理**:在查询后,PageHelper会返回一个Page对象,除了包含查询结果外,还包含了总记录数、总页数等分页信息。我们可以利用这些信息进行前端展示。 ```java PageInfo<User> pageInfo = new PageInfo...
"Spring_MyBatis物理分页"是指在Spring和MyBatis集成环境中实现的数据库物理分页功能。本文将深入探讨这个主题,包括其实现原理、优点以及如何在项目中进行配置。 首先,让我们了解什么是物理分页。物理分页是...
这里的`PageInfo`类是PageHelper提供的,用于封装分页结果,包括总记录数、当前页数据以及分页参数等。 **分页参数传递** 在Controller层,我们可以将分页参数(如:页码、每页大小)通过方法参数传递给Service层...