java 分页&高级查询&Json

#分页概述:

(1)	为什么需要分页:
	①	/*提高查询速度*/100万条【8G】 提高效率 减少服务器压力   /*提高用户体验*/
		INSERT INTO  tableName (value1,value2) SELECT value1,value2  FROM tableName
(2)	分页分类:/*假分页(List的subList方法)*/:先把所有的数据的查询到内存中:展示从内存中提取一部分数据
			1)	300  查询完毕300到内存
			2)	网页显示:10条:再次显示再从内存中查询103)	第一次的时候:效率特别慢..:数据库压力也大
	②	/*真分页(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)*pageSize1页:0,32页:3,33页: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));
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值