分页查询

ResultSet 特点
Java JDBC 标准ResultSet
JDBC标准的ResultSet,其查询结果数据是保存在数据库服务器的内存中,在执行getXXX方法时候才从数据库传输到JDBC客户端。

  1. ####也就是“轻量“的JDBC客户端“重量”级的服务器端。
  2. ####“轻量”是指资源耗用少

Oracle JDBC ResultSet
Oracle JDBC驱动查询数据库返回的ResultSet就是与标准JDBC ResultSet一致。数据是缓存到Oracle服务器端的。
MySql JDBC ResultSet
MySql JDBC驱动没有按照标准的JDBC约定实现,在查询数据库时候ResultSet结果直接传送到JDBC客户端,也就是ResultSet是“重量级”结果。

正因为如此,使用MySQL JDBC查询大量结果时候就必须进行分页返回,否则就会出现 内存溢出的错误!!

MySQL jdbc 很容易出现堆溢出!

分页查询
MySQL查询对分页做了非常友好的支持,只需要使用limit字句即可

select * from table
limit 起始行,行数量

在MyBatis中可以利用动态SQL参数支持MySQL分页查询
分页查询原理
分页查询的流程:

  1. 浏览器客户端提交Ajax请求,提交页号和每页显示的数据数量。
  2. 控制器将接受Ajax请求参数,调用业务层方法进行处理。
  3. 业务层收到页号和页面数量,计算出查询范围参数调用数据层进行查询。
  4. 数据层根据查询范围动态拼接查询SQL,并且查询数据库
  5. 最终结果以JSON形式发送的浏览器页面,浏览器页面将数据渲染为显示结果。

1. 构建查询业务层

定义数据层方法,与map作为参数,调用时候参数中增加 start 和 length作为分页查询参数 NoteDao.java:

List<Map<Stirng,Object>> findAllByKeys(Map<String,Object> keys);

定义动态SQL语句处理分页参数NoteMapper.xml;

<select id = "findAllByKeys"
        parameterType="map"
        resultType="map">
        select
            cn_note_id as id,
            cn_note_title as title
        from
            cn_note
        <where>
            <if test="typeId!=null">
        cn_note_type_id=#{typeId} and
            </if>
        <trim suffixOverrides="or">
            <if test="title!=null">
                    ( 
        cn_note_title like #{title} or
                </if>
            <if test="body!=null">
            cn_note_body like #{body}
            </if>
            </trim>
        </where>
        order by cn_note_last_modify_time desc
        <if test="start!=null">
            limit ${start},#{length}
        </if>
</select>

测试数据库分页查询

@Test
public void testFindAllByKeysPage(){
    Map<String, Object> map = 
        new HashMap<String, Object>();
    //map.put("typeId", "1");
    //map.put("title", "%你好%");
    //map.put("body", "%你好%");
    map.put("start", 10);
    map.put("length", 10);

    NoteDao dao = ctx.getBean(
        "noteDao", NoteDao.class);

    List<Map<String, Object>> list=
        dao.findAllByKeys(map);
    for (Map<String, Object> note : list) {
        System.out.println(note); 
    }
}

2.分页查询业务层
定义分页查询业务层方法 NotebookService.java:

/**
 * 分页查询
 * @param key 查找关键字
 * @param pageNum 页号: 0 1 2 3 4 。。
 * @param pageSize 页面大小: 10
 * @return 
 */
List<Map<String, Object>> searchNotes(String key, 
    int pageNum, int pageSize);

实现分页查询方法 NotebookServiceImpl.java:

@Transactional(readOnly=true)
public List<Map<String, Object>> searchNotes(String key, 
    int pageNum, int pageSize) {
    int start = pageSize*pageNum;
    Map<String, Object> paramter=
        new HashMap<String, Object>();
    paramter.put("start", start);
    paramter.put("length", pageSize);
    if(key!=null){
        key = key.trim();
        if(! key.isEmpty()){
            key = "%"+key+"%";
            paramter.put("title", key);
            paramter.put("body", key);
        }
    }
    List<Map<String, Object>> list=
        noteDao.findAllByKeys(paramter);
    return list;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值