#分页概述:
(1) 为什么需要分页:
① /*提高查询速度*/:100万条【8G】 提高效率 减少服务器压力 /*提高用户体验*/
INSERT INTO tableName (value1,value2) SELECT value1,value2 FROM tableName
(2) 分页分类:
① /*假分页(List的subList方法)*/:先把所有的数据的查询到内存中:展示从内存中提取一部分数据
1) 300 查询完毕300到内存
2) 网页显示:10条:再次显示再从内存中查询10条
3) 第一次的时候:效率特别慢..:数据库压力也大
② /*真分页(mysql的limit)*/:一次就从数据库中查询10条数据,在查询,再查另外十条数据 //常用真分页
1) 每次向数据库提取10条分页数据
2) 每次的性能都是均等的:对数据库的压力也不是很大
3) NoSql 缓存:redis ....
(3) 分页sql
① select * from jobs LIMIT startCount,pageSize
1页:select * from jobs LIMIT 0,3
2页:select * from jobs LIMIT 3,3
limit startCount ,pageSize 每页pageSize条数据
//起始页:startCount=(page-1)*pageSize
② 1页:0,3
③ 2页:3,3
④ 3页:6,3
#分页设计分析
简述:
将每一页数据封装成一个PageList对象
public class PageList<T> {
private List<T> result = new ArrayList<T>(); //数据列表
private Integer currentPage; //当前页
private Integer pageSize = 5; //每页条数
private Integer prePage; //上一页
private Integer nextPage; //下一页
private Integer lastPage; //尾页
private Integer totalPage; //总页数
private Long totalCount=0L; //总数据
public PageList() {} //无参构造
/**
*
* @param result 列表数据
* @param currentPage 当前页
* @param totalCount 总条数
*/
public PageList(Integer currentPage, Long totalCount) {
//当前页-1 <= 0 ? 1 : 当前页
this.currentPage = currentPage - 1 <=0 ? 1 : currentPage;
this.totalCount = totalCount; //总条数
Long totalPage = this.totalCount%this.pageSize == 0 ? this.totalCount/this.pageSize : this.totalCount/this.pageSize+1; //总页数: 奇数页+1
this.totalPage = Integer.valueOf(String.valueOf(totalPage));
//当前页>总页数 ? 总页数 : 当前页
this.currentPage = this.currentPage > this.totalPage ? this.totalPage : this.currentPage;
//上一页
this.prePage = this.currentPage - 1 <=0 ? 1 : this.currentPage - 1;
//下一页
this.nextPage = (this.currentPage+1)>this.totalPage?this.totalPage:this.currentPage + 1;
//尾页
this.lastPage = this.totalPage;
}
public PageList(List<T> result, Integer currentPage, Integer pageSize, Integer prePage, Integer nextPage,Integer lastPage, Integer totalPage, Long totalCount) {
this.result = result;
this.currentPage = currentPage;
this.pageSize = pageSize;
this.prePage = prePage;
this.nextPage = nextPage;
this.lastPage = lastPage;
this.totalPage = totalPage;
this.totalCount = totalCount;
}
/*省略seter/geter 方法*/
分页测试
public static void main(String[] args) {
PageList<Jobs> pageList = new PageList<Jobs>(2,21L);
System.out.println(pageList);
}
//测试结果:PageList [result=[], currentPage=2, pageSize=5, prePage=1, nextPage=3, lastPage=5, totalPage=5, totalCount=21]
#分页代码分析
分析如下:
*通过iframe src="映射路径:/cms/jobs"----> Constroller层---调用-->Service层: findPageByQuery--调用- -->Dao层 (总条数+每页列表数据)
*目的: 获取初始化后PageList对象并通过Model将其封装至Request对象中, 数据+视图 返回浏览器展示数据
controller 层
/**
* 显示jobs数据页面
* JobsQuery---->默认pageSize 每页数据10, currentPage 当前页 1
* findPageByQuery---->返回PageList对象
* @param model
* @return
*/
@RequestMapping("/jobs")
public String jobs(JobsQuery jobsQuery,Model model){
PageList<Jobs> list = jobsService.findPageByQuery(jobsQuery);
model.addAttribute("pageList", list);
return "jobs/jobs";
}
Service层
@Override
public PageList<Jobs> findPageByQuery(JobsQuery jobsQuery) {
Long count = jobsDao.findCountByQuery(jobsQuery); //sql查询总条数
if(count == 0L) {
return new PageList<Jobs>(); //未查到满足条件的数据返回空
}
//jobsQuery.getCurrentPage() 前台传过来的当前页, count 总条数
PageList<Jobs> pageList = new PageList<Jobs>(jobsQuery.getCurrentPage(), count);
//重新设置当前页数,避免页数非法
jobsQuery.setCurrentPage(pageList.getCurrentPage());
//通过开始页和每页pageSize条数据查询当前页的数据列表
pageList.setResult(jobsDao.findListByQuery(jobsQuery));
//返回封装后的PageList对象
return pageList;
}
Dao 层
/**
* 动态sql拼接 查询总条数
*/
@Override
public Long findCountByQuery(JobsQuery jobsQuery) {
String sql = "select count(*) from view_jobs"+jobsQuery.getWhere();
return jdbcTemplate.queryForObject(sql, Long.class);
}
/**
* 动态sql拼接 查询当前页列表数据
*/
@Override
public List<Jobs> findListByQuery(JobsQuery jobsQuery) {
String sql ="select * from view_jobs "+jobsQuery.getWhere()+" order by inputdate desc limit ?,?";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<Jobs>(Jobs.class),
jobsQuery.begin(),jobsQuery.getPageSize());
}
高级查询
动态sql拼接 ____前端__高级查询才会进行拼接
#高级查询页面
public class BasicQuery {
//当前页
private Integer currentPage=1;
//每页多少条数据
private Integer pageSize=5;
//从哪一条数据开始
public Integer begin(){
return (currentPage-1)*pageSize;
}
/**省略了seter/geter*/
}
动态拼接
public class JobsQuery extends BasicQuery{
private Integer enabled; //启用
private String title; //职位
private String jobtype; //职位类型
public String getWhere() { //动态拼接sql
StringBuilder sb = new StringBuilder();
//前端页面启用: 效果_只查询启用状态的数据
if(enabled !=null && enabled == 1) {
sb.append(" and isenabled=1");
}
//判断字符串是否为空,不为空动态拼接sql
if(StringUtils.hasLength(title)){
sb.append(" and title like '%"+title+"%'");
}
if("1".equals(jobtype)) {
sb.append(" and jobtype = 1");
}else if("2".equals(jobtype)) {
sb.append(" and jobtype = 2");
}else{
sb.append(" ");
}
return sb.toString().replaceFirst("and", "where");
}
/**省略seter/getter*/
}
Json
*json 对象的创建:
var person = {"name":"小猪猪","age":4,"dept":{"id":1,"name":"技术部"}}
*json 对象的取值:
console.debug(person.name); //小猪猪
console.debug(pserson.dept.name);//技术部
*json 数组:
var person = [
{"name":"张三","age":4,"dept":{"id":1,"name":"技术部"}},
{"name":"李四","age":5,"dept":{"id":2,"name":"公关部"}}
];
*json数组的取值:
console.debug(person[0].name); //李四
console.debug(person[1].dept.name); //公关部
*Json 标准格式字符串转Json对象
var jsonStr = '{"name":"小李子","age":23,"dept":{"id":1,"name":"外联部"}}';
console.debug(JSON.parse(jsonStr));