`
yuhen78
  • 浏览: 14695 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Spring JdbcTemplate 实现自定义分页

阅读更多

下面是我用到Spring jdbctemplate 方式实现自定义分页的详细步骤:

步骤一创建SplitPageResultSetExtractor 类:   
package com.utils; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 
import org.springframework.dao.DataAccessException; 
import org.springframework.jdbc.core.ResultSetExtractor; 
import org.springframework.jdbc.core.RowMapper; 
import org.springframework.util.Assert; 
public class SplitPageResultSetExtractor implements ResultSetExtractor { 
private final int startIndex;// 起始行号 
private final int pageSize;// 每页记录数 
private final RowMapper rowMapper;// 行包装器 
public SplitPageResultSetExtractor(RowMapper rowMapper, int startIndex, int pageSize) { 
  Assert.notNull(rowMapper, "RowMapper is required"); 
  this.rowMapper = rowMapper; 
  this.startIndex = startIndex; 
  this.pageSize = pageSize; 
} 
/** 
  * 处理结果集合,被接口自动调用,该类外边不应该调用 
  */ 
public Object extractData(ResultSet rs) throws SQLException, 
   DataAccessException { 
  List result = new ArrayList(); 
  rs.first(); 
  rs.relative(startIndex-1); 
  int count=0; 
   while (rs.next()) {   
             count++;   
             result.add(this.rowMapper.mapRow(rs, startIndex+count));   
             System.out.println(rs.getBoolean(1)); 
             if (count == pageSize) {   
                 break;   
             }   
         }   
  return result; 
} 
/** 
  * 没有使用该方法 如果数据量较大 就无法查询出数据 
  */ 
public Object extractDatas(ResultSet rs) throws SQLException, 
   DataAccessException { 
  List result = new ArrayList(); 
  int rowNum = 0; 
  int end = startIndex + pageSize;  
  point: while (rs.next()) { 
   ++rowNum; 
   if (rowNum < startIndex) { 
    continue point; 
   } else if (rowNum >= end) { 
    break point; 
   } else { 
    result.add(this.rowMapper.mapRow(rs, rowNum)); 
   } 
  } 
  return result; 
} 
} 
步骤二创建JdbcTemplateExtend 类: 
package com.utils; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.util.List; 
import java.util.Map; 
import java.sql.Types; 
import javax.sql.DataSource; 
import org.springframework.dao.DataAccessException; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.jdbc.core.PreparedStatementCreator; 
import org.springframework.jdbc.core.PreparedStatementCreatorFactory; 
import org.springframework.jdbc.core.RowMapper; 
public class JdbcTemplateExtend extends JdbcTemplate { 
@Override 
public List queryForList(String arg0, Object[] arg1) 
   throws DataAccessException { 
  return super.queryForList(arg0, arg1); 
} 
private DataSource dataSource; 
/** 
  * 默认构造器,调用此方法初始化,需要调用setDataSource设置数据源 
  */ 
public JdbcTemplateExtend() { 
} 
/** 
  * 初始构造器 
  * 
  * @param dataSource 
  *            数据源 
  */ 
public JdbcTemplateExtend(DataSource dataSource) { 
  this.dataSource = dataSource; 
  super.setDataSource(dataSource); 
} 
/** 
  * 普通分页查询<br> 
  * <b>如果结果结合比较大应该调用setFetchsize() 和setMaxRow两个方法来控制一下,否则会内存溢出</b> 
  */ 
@SuppressWarnings("unchecked") 
public List<Map> querySP(String sql, int startRow, int rowsCount) 
   throws DataAccessException { 
  return querySP(sql, startRow, rowsCount, getColumnMapRowMapper()); 
} 
/** 
  * 自定义行包装器查询<br> 
  * <b>如果结果结合比较大应该调用setFetchsize() 和setMaxRow两个方法来控制一下,否则会内存溢出</b> 
  *   */ 
@SuppressWarnings("unchecked") 
public List<Map> querySP(String sql, int startRow, int rowsCount, 
   RowMapper rowMapper) throws DataAccessException { 
  return (List) query(sql, new SplitPageResultSetExtractor(rowMapper, 
    startRow, rowsCount)); 
} 
/** 
  * 普通分页查询<br> 
  * <b>如果结果结合比较大应该调用setFetchsize() 和setMaxRow两个方法来控制一下,否则会内存溢出</b> 
  * 
  * @see #setFetchSize(int) 
  * @see #setMaxRows(int) 
  * @param sql 
  *            查询的sql语句 
  * @param startRow 
  *            起始行 
  * @param rowsCount 
  *            获取的行数 
  * @return 
  * @throws DataAccessException 
  */ 
@SuppressWarnings("unchecked") 
public List<Map> queryForListPagination(String sql, Object[] arg1, 
   int startRow, int rowsCount) throws DataAccessException { 
  return queryPagination(sql, arg1, startRow, rowsCount, 
    getColumnMapRowMapper()); 
} 
/** 
  * 普通分页查询<br> 
  * <b>如果结果结合比较大应该调用setFetchsize() 和setMaxRow两个方法来控制一下,否则会内存溢出</b> 
  * 
  * @see #setFetchSize(int) 
  * @see #setMaxRows(int) 
  * @param types[] 
  *           传递参数的类型值 java.sql.Types.VARCHAR 
  * @param sql 
  *            查询的sql语句 
  * @param startRow 
  *            起始行 
  * @param rowsCount 
  *            获取的行数 
  * @return 
  * @throws DataAccessException 
  */ 
@SuppressWarnings("unchecked") 
public List<Map> queryForListPagination(String sql, Object[] arg1,int [] types, 
   int startRow, int rowsCount) throws DataAccessException { 
  return queryPagination(sql, arg1,types, startRow, rowsCount, 
    getColumnMapRowMapper()); 
} 

private List<Map> queryPagination(String sql, final Object[] arg1,int [] types, 
   int startRow, int rowsCount, RowMapper columnMapRowMapper) { 
  PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory( 
    sql, types); 
  factory.setResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE); 
  PreparedStatementCreator psc = factory 
    .newPreparedStatementCreator(arg1); 
  return (List) query(psc, new SplitPageResultSetExtractor( 
    columnMapRowMapper, startRow, rowsCount)); 
} 
private List<Map> queryPagination(String sql, final Object[] arg1, 
   int startRow, int rowsCount, RowMapper columnMapRowMapper) { 
  int[] types = new int[arg1.length]; 
  for (int i = 0; i < arg1.length; i++) { 
   types[i] = Types.VARCHAR; 
  } 
  PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory( 
    sql, types); 
  factory.setResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE); 
  // factory.setResultSetType(ResultSet.TYPE_SCROLL_SENSITIVE); 
  PreparedStatementCreator psc = factory 
    .newPreparedStatementCreator(arg1); 
  return (List) query(psc, new SplitPageResultSetExtractor( 
    columnMapRowMapper, startRow, rowsCount)); 
} 
public DataSource getDataSource() { 
  return dataSource; 
} 
public void setDataSource(DataSource dataSource) { 
  this.dataSource = dataSource; 
  super.setDataSource(dataSource); 
} 
} 
步骤三Dao层中调用: 
public List getInto(String plateauClientname ,int noteCount,int start,int pagesize) 
  { 
   JdbcTemplateExtend jdbcextend = new JdbcTemplateExtend(); 
   jdbcextend.setDataSource(jdbcTemplate.getDataSource());//设置数据连接源 
   String sql = "select * from UserPhoneDC where plateauClientname = '  "+plateauClientname+"' and notecount          = "+noteCount; 
   List list = jdbcextend.querySP(sql, start, pagesize); 
       //参数解释: 
        sql: sql操作语句。 
        start: 起始记录行 
        pagesize:每页显示记录数 
      return list; 
  } 

 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/YUHEN78/archive/2010/09/27/5910317.aspx

 

分享到:
评论

相关推荐

    Spring jdbctemplate + mysql 分页封装

    综上所述,Spring JdbcTemplate结合MySQL的分页查询封装涉及到的主要知识点有:Spring的JdbcTemplate用法、MySQL的分页查询(LIMIT和OFFSET)、结果集映射、分页结果对象的构建、以及代码封装与复用。通过这些技术,...

    jdbcTemplate分页彻底解决,使用游标滚动

    在Java的Spring框架中,`JdbcTemplate`是一个非常重要的组件,它提供了数据库操作的简单抽象,使得开发者可以方便地执行SQL语句而无需编写复杂的DAO(数据访问对象)层。在处理大量数据时,传统的分页方法可能会导致...

    spring jdbctemplate实例

    此外,JdbcTemplate还提供了其他高级功能,如批量操作、分页查询、存储过程调用等。同时,它也支持PreparedStatement,可以防止SQL注入攻击。对于性能要求较高的互联网应用,JdbcTemplate的这些特性使其成为理想的...

    Oracle + jdbcTemplate + Spring + Java + Flex 实现分页

    ### Oracle + jdbcTemplate + Spring + Java + Flex 实现分页 #### 一、Oracle存储过程分页 在Oracle数据库中,为了实现高效的分页查询,通常会采用存储过程的方式来完成。这种方式能够有效地减少网络传输的数据量...

    Hibernate+spring+struts2分页

    Spring JDBC模块中的`JdbcTemplate`或`NamedParameterJdbcTemplate`可以方便地实现分页查询,通过设置页码和每页大小来获取所需数据。 **Struts2** Struts2作为MVC框架,负责处理用户的请求并展示结果。它提供了...

    JDBCTemplate+JavaPOJO实现通用DAO

    6. **定制化操作**:虽然JDBCTemplate提供了很多通用功能,但有时仍需编写自定义SQL,这时可以使用`NamedParameterJdbcTemplate`,它支持参数化的SQL,使代码更加清晰。 7. **异常处理**:JDBCTemplate会自动处理...

    easyframework-data:基于 Spring JdbcTemplate 的数据访问框架

    EasyFramework-Data 是一个基于 Spring JdbcTemplate 的轻量级数据访问框架,它简化了数据库操作,提供了更加简洁、安全的API,旨在提高开发效率,降低项目中的数据库访问复杂性。这个框架适用于使用Java语言进行...

    ssh2分页查询

    我们可以使用`SimpleJdbcDaoSupport`或自定义的Dao类,通过`JdbcTemplate`的`queryForList`方法配合RowCallbackHandler实现分页。关键在于构造合适的SQL语句,通常包括`LIMIT`和`OFFSET`子句,以及计算出的偏移量。 ...

    SSH分页组件

    4. **自定义分页组件**: 由于SSH框架本身的分页功能可能不能满足所有需求,开发者通常会创建自己的分页组件,封装通用的分页逻辑,包括计算总页数、生成分页链接、处理排序条件等。这样的组件可以提高代码复用性...

    SpringMVC+JDBC:分页示例

    在这里,我们将深入探讨如何结合SpringMVC和JDBC实现一个分页示例。 首先,让我们了解SpringMVC中的核心概念。SpringMVC通过DispatcherServlet接收HTTP请求,然后根据配置的映射规则转发到相应的控制器(Controller...

    使用分页控件(page_targetlib)实现分页

    这里,`jdbcTemplate`是Spring的JDBC模板,`UserRowMapper`是自定义的结果映射器,将数据库查询结果转换为`User`对象。 前端展示分页信息时,可以使用`PageResult`中的总页数和当前页数,配合HTML和JavaScript,...

    spring_JDBC整合包

    在分布式环境下,Spring JDBC配合Spring的事务管理功能,可以实现跨数据库操作的事务一致性。 这个"spring_JDBC基本包"可能包含的文件有Spring框架的基础库,如spring-jdbc.jar,数据库驱动如mysql-connector-java....

    简单分页的实现!!!

    在这个例子中,`jdbcTemplate`是Spring框架提供的用于执行SQL的工具,`UserRowMapper`是自定义的映射器,用于将查询结果转换为`User`对象。 3. **前端展示**:在前端,你可以使用模板引擎或者JavaScript库(如...

    sqlserver 实现分页的前台代码 以及后台的sqlserver语句

    一、前端分页实现 1. JSP页面设计: 在`Test.jsp`中,我们需要创建一个表格来显示数据,并添加页码导航。通常,会有一个表单来接收用户输入的页码,然后通过Ajax异步请求发送到服务器。 ```jsp ;charset=UTF-8" ...

    spring boot query查询

    在Template模式下,`@Query`注解不能直接使用,但我们可以创建一个方法,利用`SimpleJdbcInsert`或`JdbcTemplate`来实现自定义查询。例如: ```java import org.springframework.beans.factory.annotation....

    SpringMVC3 + SpringJDBC整合 源码。

    分页查询是大型Web应用中常见的需求,SpringMVC结合SpringJDBC可以通过编写自定义的SQL语句或者使用存储过程来实现。例如,可以传递页码和每页大小作为参数,然后在SQL查询中使用LIMIT和OFFSET关键字进行分页。在...

    跟我学Spring3(7.5)对JDBC的支持之集成Spr

    5. 分页查询:使用LIMIT和OFFSET或窗口函数实现高效的分页,避免一次性加载大量数据导致性能下降。 6. 批量操作:利用JdbcTemplate的batchUpdate方法进行批量插入、更新操作,提高效率。 总之,Spring 3对JDBC的...

    PageBean分页查询

    例如,在Spring框架中,可以使用JdbcTemplate或者MyBatis等持久层工具,通过传递PageBean对象的当前页和每页大小来定制SQL查询: ```java public PageBean&lt;User&gt; getUserByPage(int currentPage, int pageSize) { ...

    比百度更强大的多种样式经典分页

    在这样的技术栈下实现分页,我们可以利用Spring的JdbcTemplate或者MyBatis等持久层工具来执行SQL查询,获取每页的数据。同时,Struts或Spring MVC负责处理用户的请求,根据用户的选择(如当前页码、每页数量等)动态...

    Spring.3.x企业应用开发实战(完整版).part2

    经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...

Global site tag (gtag.js) - Google Analytics