1. 说明
- 上接[hibernate的dao层封装-基础功能]
2.设计思路
- 查询操作基本都要经过三步
1.调用者发起请求
2.sql查出指定的数据
3.将数据封装,响应给调用者
- 针对分页查询去考虑这三步,
1.调用者需要指定那页数据,每页有几条数据
2.sql要根据页码和指定条数设置要执行的sql语句
3.进行数据封装时,还需要包含当前数据是那页的数据,这页数据有几条,总共有多少条数据,总共有多少页
3.设计实体类
/**
* 发起查询请求时,进行分页需要的基本参数
* 2019年4月5日11:36:41
* authstr
*/
public class QueryCommonPage implements QueryPage {
//要查那页数据
private Integer page;
//每页有几条数据
private Integer rows;
//搜索值
private String search;
public Integer getRows() {
return rows;
}
public void setRows(Integer rows) {
this.rows = rows;
}
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public String getSearch() {
return search;
}
public void setSearch(String search) {
this.search = search;
}
}
/**
* 记录查询出的一页数据
* @time 2018年10月15日 上午9:57:50
* @author authstr
*/
public class AbstractReturnPage implements ReturnPage {
//数据总数
private Integer total;
//总页数
private Integer pageTotal;
//每页条数
private Integer rows;
//查询的页
private Integer page;
//该页数据
private List record;
public AbstractReturnPage(){}
/**
* 通过查询参数对象创建返回页
* @param queryPage
*/
public AbstractReturnPage(QueryPage queryPage){
if (queryPage.getRows()!=null){
rows=queryPage.getRows();
}else{
rows=DEFAULT_PAGE_ROWS;
}
if(queryPage.getPage()!=null){
page=queryPage.getPage();
}else{
page=DEFAULT_PAGE_NUM;
}
}
@Override
public Integer getTotal() {
return total;
}
@Override
public Integer getFirst() {
return (getPage() - 1) * getRows();
}
@Override
public Integer getRows() {
if (rows == null) {
rows = DEFAULT_PAGE_ROWS;
}
return rows;
}
@Override
public void setTotal(Integer total) {
this.total = total;
}
@Override
public String toJson() {
return JSON.toJSONString((Object)this);
}
public void setPageTotal(Integer pageTotal) {
this.pageTotal = pageTotal;
}
@Override
public Integer getPageTotal() {
pageTotal = getTotal() % rows == 0 ? Integer.valueOf(getTotal() / rows) : Integer.valueOf(getTotal() / rows + 1);
return pageTotal;
}
@Override
public void setPage(Integer pageNo) {
page = pageNo;
}
@Override
public Integer getPage() {
if (page == null || page < 1) {
page = 1;
}
return page;
}
@Override
public void setRows(Integer length) {
rows = length;
}
@Override
public List getRecord() {
return this.record;
}
@Override
public void setRecord(List record) {
this.record = record;
}
}
- 为方便其他类进行调用和维护,这两个类都有对应实现的接口
/**
* 发起查询请求时,定义进行分页需要的相关参数
* 2019年4月5日11:36:41
* authstr
*/
public interface QueryPage {
Integer getRows();
void setRows(Integer rows);
Integer getPage();
void setPage(Integer page);
}
/**
* 定义查询出的一页数据应包含的内容
* 2019年4月5日11:41:09
* authstr
*/
public interface ReturnPage {
//默认的每页数据行数
Integer DEFAULT_PAGE_ROWS = 20;
//默认的页码数
Integer DEFAULT_PAGE_NUM = 1;
Integer getTotal();
List getRecord();
void setTotal(Integer var1);
void setRecord(List var1);
Integer getPageTotal();
void setRows(Integer var1);
Integer getRows();
void setPage(Integer var1);
Integer getPage();
Integer getFirst();
String toJson();
}
4.查询数据总条数
/**
* 取出第一个map中的num值,用于获取分页信息
* @param li sql查询的返回值
* @return num的值
* @time 2019年4月5日18:16:52
* @author authst
*/
public Integer getTotalNumValue(List<Map> li){
if(li == null || li.isEmpty()){
return 0;
}
//获取返回值
Object Onum=li.get(0).get("num");
//转换为Integer
if(Onum instanceof BigInteger){
BigInteger temp=(BigInteger) Onum;
return temp.intValue();
}else{
return (Integer)Onum;
}
}
/**
* 获得查询结果的总条数
* @param sqlstring 进行查询的sql语句
* @param fields 参数项数组
* @param values 参数值数组
* @return 数据条数
* @time 2019年4月5日18:17:11
* @author authst
*/
public Integer getTotalCount(String sqlstring, String[] fields,Object[] values) {
String sql = " select count(1) AS num from ( " + sqlstring + " ) a";
List<Map> li = getBySQL(sql,fields,values,Map.class);
return getTotalNumValue(li);
}
/** 获得查询结果的总条数
* @param sqlstring 进行查询的sql语句
* @param kv 参数map
* @return 数据条数
* @time 2019年4月5日18:17:11
* @author authst
*/
public Integer getTotalCount(String sqlstring, Map<String, Object> kv) {
String sql = " select count(1) AS num from ( " + sqlstring + " ) a";
List<Map> li = getByMapSQL(sql,kv,Map.class);
return getTotalNumValue(li);
}
/**
* 获得查询结果的总条数
* @param sqlstring 进行查询的sql语句
* @param values 参数值
* @return 数据条数
* @time 2019年4月5日18:17:11
* @author authst
*/
public Integer getTotalCount(String sqlstring, Object[] values) {
return getTotalCount(sqlstring,null,values);
}
5.分页的sql执行
- 同样的,分页调用也有Map和单数组两种参数传递方式
/**
* 使用 属性+值 的参数方式,执行查询语句,获取一页数据(执行方法)
* @param sqlstring 查询sql语句
* @param paramAndValue sql参数,键为属性项数组,值为 属性值数组
* @param page 分页对象
* @param returnType 返回值类型
* @return 分页数据
* @time 2019年4月5日16:55:04
* @author authstr
*/
public ReturnPage queryByParamAndValue(String sqlstring,Map<String,Object> paramAndValue, ReturnPage page, Class returnType){
page.setRecord(getByMapSQL(sqlstring,paramAndValue,page.getFirst(),page.getRows(),returnType));
page.setTotal(getTotalCount(sqlstring,paramAndValue));
return page;
}
/**
* 使用 参数值 的参数方式,执行查询语句,获取一页数据(执行方法)
* @param sqlstring 查询sql语句
* @param values sql参数 属性值
* @param page 分页对象
* @param returnType 返回值类型
* @return 分页数据
* @time 2019年4月5日17:01:15
* @author authstr
*/
public ReturnPage queryByValue(String sqlstring,Object[] values, ReturnPage page, Class returnType){
page.setRecord(getByValuesSql(sqlstring,values,page.getFirst(),page.getRows(),returnType));
page.setTotal(getTotalCount(sqlstring,values));
return page;
}
6.分页查询dao层流程
- 首先,在执行时会根据参数方式,选择一个方法调用,执行时需提供一个QueryPage对象
/**
* 使用 属性+值 的参数方式,执行查询语句,获取一页数据(Map)(参数跳转)
* @param sqlstring 查询sql语句
* @param paramAndValue sql参数,键为属性项数组,值为 属性值数组
* @param page 分页查询参数对象
* @return 分页数据
* @time 2019年4月5日17:05:05
* @author author
*/
public ReturnPage queryByParamAndValue(String sqlstring, Map<String, Object> paramAndValue, QueryPage page){
return queryByParamAndValue(sqlstring,paramAndValue,page,Map.class);
}
/**
* 使用 参数值 的参数方式,执行查询语句,获取一页数据(参数跳转)
* @param sqlstring 查询sql语句
* @param values sql参数 属性值
* @param page 分页对象
* @return 分页数据
* @time 2019年4月5日17:13:46
* @author authstr
*/
public ReturnPage queryByValue(String sqlstring,Object[] values, QueryPage page ){
return queryByValue(sqlstring,values,page,Map.class);
}
- 接着,通过QueryPage对象创建出一个ReturnPage对象,之后的分页数据就将封装到ReturnPage对象中进行返回
/**
* 使用 属性+值 的参数方式,执行查询语句,获取一页数据(参数跳转)
* @param sqlstring 查询sql语句
* @param paramAndValue sql参数,键为属性项数组,值为 属性值数组
* @param page 分页查询参数对象
* @param returnType 返回值类型
* @return 分页数据
* @time 2019年4月5日17:01:29
* @author author
*/
public ReturnPage queryByParamAndValue(String sqlstring, Map<String, Object> paramAndValue, QueryPage page, Class returnType){
return queryByParamAndValue(sqlstring, paramAndValue,new AbstractReturnPage(page), returnType);
}
/**
* 使用 参数值 的参数方式,执行查询语句,获取一页数据(参数跳转)
* @param sqlstring 查询sql语句
* @param values sql参数 属性值
* @param page 分页对象
* @param returnType 返回值类型
* @return 分页数据
* @time 2019年4月5日17:13:37
* @author authstr
*/
public ReturnPage queryByValue(String sqlstring,Object[] values, QueryPage page, Class returnType){
return queryByValue(sqlstring,values,new AbstractReturnPage(page),returnType);
}
7.方法整理

方法整理
/**
* 使用 属性+值 的参数方式,执行查询语句,获取返回值(参数跳转)
* @param sql 查询sql语句
* @param kv sql参数,键为属性项数组,值为 属性值数组
* @param returnType 结果集封装的类型
* @param <T> 结果集类型
* @return 查询结果
* @time 2019年4月5日11:27:12
* @author authstr
*/
public <T> List<T> getByMapSQL(String sql,Map<String,Object> kv,Class<T> returnType){
return getByMapSQL(sql,kv,null,null,returnType);
}
/**
* 使用 参数值 的参数方式,执行查询语句,获取返回值(参数跳转)
* @param sql 查询sql语句
* @param values
* @param returnType 结果集封装的类型
* @param <T> 结果集类型
* @return 查询结果
* @time 2019年4月5日16:53:36
* @author authstr
*/
public <T> List<T> getByValuesSql(String sql,Object[] values,Class<T> returnType){
return getByValuesSql(sql,values,null,null,returnType);
}
网友评论