java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java通用分页(后端)

java实现通用分页(后端)

作者:Ar.小白

这篇文章主要介绍了java实现通用分页(后端)方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.通用分页是什么?

Java通用分页是指在Java编程语言中实现的一种通用分页功能。它通常用于在Java Web应用中展示大量数据或查询结果,并将其分页显示给用户。

在Java中,通常会使用以下几个组件或类来实现通用分页功能:

1. 分页查询:通常会通过数据库查询或其他方式获取大量数据,然后使用分页查询技术来获取特定页的数据。这通常包括设置每页显示的数据数量、当前页码和排序规则等参数,然后根据参数筛选和返回相应页的数据。

2. 页面展示:通用分页需要在前端页面上展示分页数据,可以使用Java的模板引擎或前端框架来实现。在页面上通常会显示当前页的数据列表、页码导航、上一页和下一页按钮等控件,以便用户浏览和导航不同页的数据。

3. 分页逻辑:在Java中,通常会使用一些逻辑代码或工具类来处理分页逻辑,例如计算总页数、当前页起始索引、数据转换等。这些代码可以根据每页显示的数据数量、总数据量和当前页码等来计算所需的数据范围,并在数据库查询中使用相应的参数。

4. 控制器和路由:在Java Web应用中,控制器和路由负责处理用户的请求,并将相应的数据传递给前端页面。在通用分页中,控制器会接收用户请求的页码等参数,并将相应页的数据查询结果传递给页面展示部分进行渲染。

总体而言,Java通用分页是通过数据库查询、分页逻辑、页面展示和控制器等组件配合工作,实现在Java Web应用中对大量数据进行分页显示的一种功能。它可以提升用户体验、优化数据加载性能,并方便用户浏览和导航大数据集。

通用分页通常会包括如下元素:

2.通用分页的作用

Java通用分页在Java Web应用中具有以下几个作用:

总之,Java通用分页在Java Web应用中起到提升用户体验、优化数据加载性能、支持数据导航和浏览等作用。它使得展示大量数据更加高效、灵活,并能够满足用户对数据展示的需求。

3. 通用分页的优缺点

Java通用分页的优点:

Java通用分页的缺点:

需要根据具体应用场景和需求综合考虑这些优缺点,并选择合适的实现方式以达到最佳的效果和用户体验。

4.通用分页的核心思想

Java通用分页的核心思想是将大量数据进行分割,每次只返回部分数据,以便更好地展示和处理数据。

其主要的核心思想包括:

通过这些核心思想,Java通用分页可以更好地控制数据的加载和展示,提高用户体验和数据处理的效率。它允许大数据集的分页展示,并提供了灵活的导航和配置选项,满足不同用户对数据浏览需求的需求。

5.通用分页实例

书籍实体类:

package com.liao.enity;
 
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;
	}
 
}

封装pageBean类:

package com.liao.utils;
 
/**
 * 分页工具类
 *
 */
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 + "]";
	}
 
}

书籍“分页模糊查询所有”方法

package com.liao.Dao;
 
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
 
import org.junit.Test;
 
import com.liao.enity.Book;
import com.liao.utils.DBAccess;
import com.liao.utils.PageBean;
import com.liao.utils.StringUtils;
/**
 * 传统dao方法
 *	重复代码:
 * Connection conn = DBAccess.getConnection();
 * CallableStatement ps = conn.prepareCall(sql);
   ResultSet rs = ps.executeQuery();
 * 
 * 流程重复:
 * 1.需要创建数据库表对应的实体类对象
 * 2.将查询出来的结果集添加到实例化对象属性中
 * 3.已经被填充的实体对象,加入集合中
 * while(rs.next()) {
			Book b = new Book();
			b.setBid(rs.getInt("bid"));
			b.setBname(rs.getString("bname"));
			b.setPrice(rs.getFloat("price"));
			list.add(b);
		}
 * 
 * 
 * 
 * @author Administrator
 *
 */
public class BookDao extends BaseDoa<Book>{
	/**
	 * 查询Dao方法 优化前
	 * @param book
	 * @param pagebean
	 * @return
	 * @throws Exception
	 */
	public List<Book> list1(Book book,PageBean pagebean) throws Exception{
		List<Book> list = new ArrayList<Book>();
		//获取连接
		Connection conn = DBAccess.getConnection();
		//查询sql语句
		String sql ="select * from t_mvc_book where 1=1 ";
		String bname = book.getBname();
		if(StringUtils.isNotBlank(bname)) {
			sql += "and bname like '%"+bname+"%'";
		}
		CallableStatement ps = conn.prepareCall(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()) {
			Book b = new Book();
			b.setBid(rs.getInt("bid"));
			b.setBname(rs.getString("bname"));
			b.setPrice(rs.getFloat("price"));
			list.add(b);
		}
		return list;
	}
 
	
	
	/**
	 * 优化后
	 * @param book
	 * @param pagebean
	 * @return
	 * @throws Exception
	 */
	public List<Book> list2(Book book,PageBean pagebean) throws Exception{
		//查询sql语句
		String sql ="select * from t_mvc_book where 1=1 ";
		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 Exception {
		BookDao bookDao = new BookDao();
		Book book = new Book();
		book.setBname("圣墟");
		PageBean pagebean = new PageBean();
		List<Book> list = bookDao.list2(book, pagebean);
		//查询第二页
		pagebean.setPage(2);
		for (Book b : list) {
			System.out.println(b);
		}
//		bookDao.list2(book, pagebean);
//		查询总记录数
		System.out.println(pagebean);
	}
	
 
	
	
	
}

 封装baseDao通用分页模糊查询的方法

package com.liao.Dao;
 
import java.lang.reflect.Field;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
 
import com.liao.enity.Book;
import com.liao.utils.DBAccess;
import com.liao.utils.PageBean;
import com.liao.utils.StringUtils;
/**
 */
public class BaseDoa<T> {
	/**
	 * 通用Dao 利用反射机制
	 * @param sql 
	 * @param cls
	 * @param pagebean
	 * @return
	 * @throws Exception
	 */
	public List<T> executeQuery(String sql,Class cls,PageBean pagebean) throws Exception{
		List<T> list = new ArrayList<T>();
		
		Connection conn = null;
	
		CallableStatement ps = null;
		ResultSet rs = null;
//		select * from t_mvc_book where bname LIKE '%圣墟%'
//		SELECT count(1) as n from (SELECT * FROM t_mvc_book WHERE bname LIKE '%圣墟%') t
//		select * from t_mvc_book where bname LIKE '%圣墟%' LIMIT 0,10
		if(pagebean !=null && pagebean.isPagination()) {
			String countSQL = getcount(sql);
			conn = DBAccess.getConnection();
			 ps = conn.prepareCall(countSQL);
			 rs = ps.executeQuery();
			 
			 if(rs.next()){
				 pagebean.setTotal(rs.getObject("n").toString());
				 
			 }
			 
			String pageSQL = getpage(sql,pagebean); 
			conn = DBAccess.getConnection();
			 ps = conn.prepareCall(pageSQL);
			 rs = ps.executeQuery();
			
			
		}else {
			conn = DBAccess.getConnection();
			 ps = conn.prepareCall(sql);
			 rs = ps.executeQuery();
		}
		
		
		
		
		
		
		
		while(rs.next()) {
			T t =(T) cls.newInstance();
			Field[] fields = cls.getDeclaredFields();
			for (Field f : fields) {
				f.setAccessible(true);
				f.set(t, rs.getObject(f.getName()));
			
			}
			list.add(t);
			
			
		}
		return list;
	}
 
	
	
	/**
	 *  拼接最终展示数据
	 * @param sql 原生态sql语句
	 * @param pagebean
	 * @return
	 */
	private String getpage(String sql, PageBean pagebean) {
		
		return sql+"LIMIT "+pagebean.getStartIndex()+","+pagebean.getRows();
	}
	/**
	 * 拼接出查询符合条件的总记录数sql
	 * @param sql
	 * @return
	 */
	private String getcount(String sql) {
		// TODO Auto-generated method stub
		return "SELECT count(1) as n from ("+sql+") t";
	}
}

运行结果:

使用工具: MySQL数据库,eclipse

6.单元测试框架JUnit4

JUnit是一个广泛使用的Java单元测试框架,其最新版本为JUnit 5。

JUnit 4提供了一组基于注解的API来编写和运行单元测试。以下是JUnit 4的一些主要特点和用法:

除了以上的功能,JUnit 4还支持测试套件(@RunWith(Suite.class))、超时设置(@Test(timeout = xxx))、测试规则(@Rule)等高级特性,可以进行更灵活、高效的单元测试。

下面是一个简单的JUnit 4测试类的示例:

 
import org.junit.Test;
import static org.junit.Assert.*;
 
public class MyTest {
    @Test
    public void testAddition() {
        int result = 2 + 2;
        assertEquals(4, result);
    }
}
```

在这个示例中,我们使用@Test注解将方法testAddition标记为测试方法,并使用assertEquals断言来验证加法的结果。

以上是一些JUnit 4的主要特点和用法,JUnit 4是Java开发中非常常用的单元测试框架,它可以帮助开发者编写可靠的、自动化的测试代码来验证程序的正确性,提高代码质量和可维护性。

 eclipse中使用JUnit4

第一步:选择并且需要添加JUnit4的项目

操作步骤如下:

第二步: 

 

第三步:

保存并且关闭即可完成

为什么是JUnit4不是JUnit5?

以下是JUnit 4和JUnit 5的一些主要对比:

总的来说,JUnit 5在扩展性、参数化测试和条件执行等方面改进了JUnit 4,提供了更多的灵活性和功能。它还提供了更简洁、易用的断言方法和更好的兼容性。无论使用JUnit 4还是JUnit 5,都能够有效地进行Java单元测试,具体选择取决于项目需求和个人喜好。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文