通用分页1

通用分页

首先你得先把数据库连上(由于数据库不同,就不做演示了)

然后就是准备一个判断字符串得类

StringUtils类

public class StringUtils {
    // 私有的构造方法,保护此类不能在外部实例化
    private StringUtils() {
    }

    /**
     * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
     *
     * @param s
     * @return
     */
    public static boolean isBlank(String s) {
        boolean b = false;
        if (null == s || s.trim().equals("")) {
            b = true;
        }
        return b;
    }

    /**
     * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
     *
     * @param s
     * @return
     */
    public static boolean isNotBlank(String s) {
        return !isBlank(s);
    }

}

其次实体类是必不可少的

book

public class Book {
    private int bid;
    private String bname;
    private float price;

    @Override
    public String toString() {
        return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
    }

    public int getBid() {
        return bid;
    }

    public void setBid(int bid) {
        this.bid = bid;
    }

    public String getBname() {
        return bname;
    }

    public void setBname(String bname) {
        this.bname = bname;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public Book(int bid, String bname, float price) {
        super();
        this.bid = bid;
        this.bname = bname;
        this.price = price;
    }

    public Book() {
        super();
        // TODO Auto-generated constructor stub
    }

}

通用分页还需要一个工具类pagebean

public class PageBean {

    private int page = 1;// 页码

    private int rows = 10;// 页大小

    private int total = 0;// 总记录数

    private boolean pagination = true;// 是否分页

    public PageBean() {
        super();
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public void setTotal(String total) {
        this.total = Integer.parseInt(total);
    }

    public boolean isPagination() {
        return pagination;
    }

    public void setPagination(boolean pagination) {
        this.pagination = pagination;
    }

    /**
     * 获得起始记录的下标
     *
     * @return
     */
    public int getStartIndex() {
        return (this.page - 1) * this.rows;
    }

    @Override
    public String toString() {
        return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
    }

}

 

接下来就是basedao使用泛型

basedao

public class BaseDao<T> {

    public List<T> executeQuery(String sql,Class clz,PageBean pageBean) throws SQLException, InstantiationException, IllegalAccessException{
        Connection con=DBAccess.getConnection();
        PreparedStatement pst=null;
        ResultSet rs=null;
        if(pageBean!=null&&pageBean.isPagination()) {
            //需要分页
            //算符合条件的总记录数
            String countsql=getcountsql(sql);
            pst=con.prepareStatement(countsql);
            rs=pst.executeQuery();
            if(rs.next()) {
                pageBean.setTotal(rs.getLong(1)+"");
            }
            //查询出符合条件的结果集
            String pageSql=getPageSql(sql,pageBean);
            pst=con.prepareStatement(pagesql);
            rs=pst.executeQuery();
        }else {
            pst=con.prepareStatement(sql);
            rs=pst.executeQuery();
        }
        List<T> list=new ArrayList<>();
        T t;
        while(rs.next()) {
            /*
             * 1,实例化一个book对象(该对象是空得)
             * 2,取book得所有属性,然后给其赋值
             * 2.1获取所有属性对象
             * 2.2给属性对象赋值
             * 3,赋完值得book对象装进list容器中
             */
//            list.add(new Book(rs.getInt("bid"),rs.getString("bname"),rs.getFloat("price")));
            t=(T) clz.newInstance();
            Field[] fields= clz.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                field.set(t, rs.getObject(field.getName()));
            }
            list.add(t);
        }
        DBAccess.close(con, pst, rs);
        return list;
    }
    /**
     * 利用原生sql拼接出符合条件的结果集的查询sql
     * @param sql
     * @param pageBean
     * @return
     */
    private String getPageSql(String sql, PageBean pageBean) {
        // TODO Auto-generated method stub
        return sql+" limit "+pageBean.getStartIndex()+",5";
    }
    /**
     * 获取符合条件的总记录
     * @param sql
     * @return
     */
    private String getcountsql(String sql) {
        // TODO Auto-generated method stub
        return "SELECT COUNT(*)FROM("+sql+")t;";
    }
}

接下来就是我们的dao方法了,写完dao方法就可以直接运行看看效果了

public class BookDao extends BaseDao<Book> {

    public List<Book> list(Book book, PageBean pageBean)
            throws SQLException, InstantiationException, IllegalAccessException {
        String sql = "select * from t_mvc_book where true";
        String bname = book.getBname();
        if (StringUtils.isNotBlank(bname)) {
            sql += " and bname like ‘%" + bname + "%‘";
        }
        return super.executeQuery(sql, Book.class, pageBean);
    }
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, SQLException {
        BookDao bookDao = new BookDao();

            Book book = new Book();
            PageBean pageBean = new PageBean();
            book.setBname("圣墟");
            pageBean.setPage(2);//这是是设置看第几页的
            List<Book> list = bookDao.list(book, pageBean);
            for (Book b : list) {
                System.out.println(b);
            }

    }
}

结果(这是我设置pageBean.setPage(2);)只要要改括号,改变查询的页数

 下面还做了一个小测试,看查其他的表需要写多少代码可以实现这个分页

建一个实体类blog类

public class Blog {
     private int id;
     private String bookname;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getBookname() {
        return bookname;
    }
    public void setBookname(String bookname) {
        this.bookname = bookname;
    }
    @Override
    public String toString() {
        return "Blog [id=" + id + ", bookname=" + bookname + "]";
    }
}

接下来直接写dao方法继承下basedao就可以了

public class BlogDao extends BaseDao<Blog> {

    public List<Blog> list(Blog blog, PageBean pageBean)throws SQLException, InstantiationException, IllegalAccessException {
        String sql = "select * from t_book where true";
        String bookname = blog.getBookname();
        if (StringUtils.isNotBlank(bookname)) {
            sql += " and bookname LIKE ‘%" + bookname + "%‘";
        }
        System.out.println(sql);
        return super.executeQuery(sql, Blog.class, pageBean);
    }

    public static void main(String[] args) throws InstantiationException, IllegalAccessException, SQLException {
        BlogDao blogDao = new BlogDao();
        PageBean pageBean = new PageBean();
        Blog blog = new Blog();
        blog.setBookname("哈林");
        pageBean.setPage(3);
        List<Blog> list = blogDao.list(blog, pageBean);
        for (Blog b : list) {
            System.out.println(b);
        }

    }
}

让我们来看下结果,这就完成了

 这就实现了分页效果,就是这么简单了,直接一套用就可以了,简化代码真的实用。

原文地址:https://www.cnblogs.com/ztbk/p/11053543.html

时间: 2024-10-10 02:14:49

通用分页1的相关文章

ibernate学习笔记5---实体类或属性名与数据库关键字冲突、hql命名参数、hql实现通用分页

一.实体类或属性名与数据库关键字冲突问题1.实体类名与数据库中的关键字冲突比如:实体表User与oracle中的系统表冲突解决方式1:在xml中添加table属性,指定表名,使其不与name默认相等 [html] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hiber

通用分页存储过程

/****** Object: StoredProcedure [dbo].[sp_CommonPaging] Script Date: 08/03/2015 21:06:14 ******/ --通用分页存储过程 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO Create PROCEDURE [dbo].[sp_CommonPaging] ( @tn nvarchar(30),--表名称 @idn nvarchar(20),--表主键名称 @

SQL SERVER 通用分页存储过程

SQL SERVER 通用分页存储过程 从SQLSERVER 2005开始,提供了Row_Number()函数,利用函数生成的Index来处理分页,按照正常的逻辑思维都是传pageIndex和pageSize来完成分页,昨天前端和我沟通,他们使用jQuery.DataTable.js插件,而且经过了公司底层的封装,pageIndex需要变动一下,变成pageIndex*pageSize来传. 也就是说按每页显示30条算,第一次传0,第二次传30这样来计算,我也是醉了. 1.传pageIndex和

三大数据库下的存储过程实现通用分页

三大数据库下的存储过程实现通用分页  SqlServer数据库下通用存储过程实现分页: 1 --通用存储过程分页 2 CREATE PROCEDURE procList 3 --我们需要传入的参数 4 @strWhere NVARCHAR(max), --查询条件 5 @PageSize INT, --每页显示多少条内容 6 @PageIndex INT , --当前页 7 @TableName NVARCHAR(max), --需要查询的表名 8 @ColName NVARCHAR(max),

Sql Server通用分页存储过程

Sql Server2005通用分页存储过程 CREATE PROCEDURE [dbo].[Common_GetPagedList] ( @TableName nvarchar(100), --表名 @ColumnNames nvarchar(1000) = '*', --字段名集合(全部字段为*,其它逗号分隔) @OrderClause nvarchar(1000), --排序从句(不包含order by) @WhereClause nvarchar(1000) =N' 1=1 ',   

MySql通用分页存储过程

MySql通用分页存储过程 1MySql通用分页存储过程 2 3过程参数 4p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4000),p_order varchar(100),p_pageindex int,p_pagesize int,out p_recordcount int,out p_pagecount int 5 6$$:begin 7 declare v_sqlcounts varchar(4000); 8

ReactJS实现的通用分页组件

大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯jsWeb板的,Angular版的,因为这个基础得不能再基础的功能太多地方都会用到,下面我给出以个用ReactJS实现的版本,首先上图看下效果:    注意这个组件需要ES6环境,最好使用NodeJS结合Webpack来打包:webpack --display-error-details --config webpack.config.js 此React版分页组件请亲们结合redux来使用比较方便,UI = Fn(State)    基本

sqlserver存储过程----通用分页

下面这个sql是sqlserver中通用分页存储过程: if (exists(select * from sys. procedures where name= 'proc_paging' ))-- 如果 proc_paging这个存储过程存在 drop proc proc_paging  -- 那么就删除这个存储过程 go create proc proc_paging( @pageSize nvarchar ( 50), @currentPage nvarchar ( 50), @table

JS 通用分页

1 //上一页 2 function nextPager(href, pageindex, pagecount) { 3 4 if (pageindex > pagecount) { 5 pageindex = pagecount; 6 } else { 7 pageindex = pageindex + 1; 8 } 9 pager(href, pageindex); 10 } 11 //下一页 12 function upPager(href, pageindex) { 13 14 if (

PHP通用分页(Pager)类

三种不同展示方式 附上style~ 1. 效果图1 2.效果图2  3. 效果图3 4. 分页类主体 <?php /** * PHP通用分页类 * * show(2) 1 ... 62 63 64 65 66 67 68 ... 150 * 分页样式 * #page{font:12px/16px arial} * #page span{float:left;margin:0px 3px;} * #page a{float:left;margin:0 3px;border:1px solid #d