ResultSet 特点
Java JDBC 标准ResultSet
JDBC标准的ResultSet,其查询结果数据是保存在数据库服务器的内存中,在执行getXXX方法时候才从数据库传输到JDBC客户端。
- ####也就是“轻量“的JDBC客户端“重量”级的服务器端。
- ####“轻量”是指资源耗用少
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分页查询
分页查询的流程:
- 浏览器客户端提交Ajax请求,提交页号和每页显示的数据数量。
- 控制器将接受Ajax请求参数,调用业务层方法进行处理。
- 业务层收到页号和页面数量,计算出查询范围参数调用数据层进行查询。
- 数据层根据查询范围动态拼接查询SQL,并且查询数据库
- 最终结果以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;
}