当前位置:网站首页>通用查询&分页代码
通用查询&分页代码
2022-07-23 05:40:00 【_Leaf1217】
目录
一、如何建立测试类JUnit
1.1 Ctrl+N--->JUnit--->JUnit Test Case--->Next
在你要测试的类里面Ctrl+N,然后搜索JUnit,选择JUnit Test Case,然后Next。

1.2 New JUnit 4 test
选择New JUnit 4 test,然后根据情况看是否勾选setUp()与tearDown(),然后finish。

这里的setUp()与tearDown()就是测试方法执行前后;

注:这里的方法不跟方法名有关系,主要是注释@Before、@After、@Test这些生效,
可以建立多个测试方法。
总结:JUnit的好处:
/**
* JUnit 能够针对单个方法进行测试
* 相较于main而言,测试耦合性降低了。
* @author Leaf
*
* 2022年6月22日 上午9:40:20
*/
二、编写通用查询代码
先放上封装好的一个分页属性的类:
package com.leaf.util;
/**
* 分页工具类
* @author Leaf
*
* 2022年6月22日 上午11:41:03
*/
public class PageBean {
private int page = 1;// 页码
private int rows = 2;// 页大小
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 + "]";
}
}2.1 建立BaseDao<T>类
这个类的代码就是通用的查询方法要调用的类,里面封装好了平常写方法重复出现的代码;
/**
* T代表的是实体类,可以是任何实体类...
* @author Leaf
*
* 2022年6月22日 上午9:46:41
*/
public class BaseDao<T> {
/**
* 通用查询
* @param sql SQL语句
* @param pagb 分页的属性
* @param callBack 处理返回集合的接口
* @return 结果集
* @throws Exception 抛出的异常
*/
public List<T> executeQuery(String sql,PageBean pagb,CallBack<T> callBack) throws Exception{
//拿到数据库连接
Connection con = DBHelper.getConnection();//重复代码1
//获取执行对象
PreparedStatement ps = con.prepareStatement(sql);//重复代码2
//开始执行
ResultSet rs = ps.executeQuery();//重复代码3
//查询不同的表,必然要处理不同的结果集
//接口是调用方法的人来实现
return callBack.foreach(rs);
}
}
2.2 处理集合接口
根据不同表返回的不同的集合需要建立的一个处理集合的接口:CallBack
package com.leaf.util;
import java.sql.ResultSet;
import java.util.List;
/**
* 回调函数接口类的作用?
* 谁调用谁处理
* @author Leaf
*
* 2022年6月22日 上午9:49:11
*/
public interface CallBack<T> {
List<T> foreach(ResultSet rs);
}2.3 继承BaseDao
用自己的方法类BookDao继承BaseDao,拼接好SQL语句,然后再调用通用查询的方法,
return返回的时候实现接口CallBack,处理一下集合然后循环;
public class BookDao extends BaseDao<Book> {
/**
* 通用查询第一个版本
* 查询所有书籍
* @param book 书籍对象
* @param pagb 分页属性
* @return 书籍集合
* @throws Exception 抛出异常
*/
public List<Book> getAll2(Book book,PageBean pagb) throws Exception{
//定义SQL语句
String sql = "select * from tb_book where 1=1 ";
//获取属性
String bname = book.getBname();
int bid = book.getBid();
if(StringUtils.isNotBlank(bname)) {
sql += " and bname like '%"+bname+"%'";
}
if(bid != 0) {
sql += " and bid = "+bid;
}
return super.executeQuery(sql, null, rs->{
List<Book> list = new ArrayList<>();
try {
while(rs.next()) {
list.add(new Book(rs.getInt(1), rs.getString(2), rs.getFloat(3)));
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
});
}
}
2.4 测试调用
@Test
public void testGetAll2() throws Exception {
List<Book> list = new BookDao().getAll2(new Book(), null);
System.out.println("=======测试=======");
for (Book book : list) {
System.out.println(book);
}
}运行结果:

三、编写通用分页代码
在上面已经写好的BaseDao里面新增分页代码;
3.1 判断是否分页
根据封装的分页工具类判断
//判断是否分页
if(pagb != null && pagb.isPagination()) {
}
3.2 写两个方法拼接SQL语句获取总记录条数&分页数据
/**
* 拼接分页的SQL
* @param sql
* @param pagb
* @return
*/
private String getPageSQL(String sql, PageBean pagb) {
return sql + " limit " + pagb.getStartIndex() + "," + pagb.getRows();
}/**
* 拼接总记录条数的SQL
* @param sql
* @return
*/
private String getCountSQL(String sql) {
return "select count(1) as n from ("+sql+") t";
}
3.3 根据拼接的SQL语句分别执行
将获取到的拼接好的SQL语句执行,然后将得到的总记录数给封装好的PageBean赋值;
完整代码:
/**
* 通用分页查询
* @param sql SQL语句
* @param pagb 分页的属性
* @param callBack 处理返回集合的接口
* @return 结果集
* @throws Exception 抛出的异常
*/
public List<T> executeQuery(String sql,PageBean pagb,CallBack<T> callBack) throws Exception{
//拿到数据库连接
Connection con = null;//重复代码1
//获取执行对象
PreparedStatement ps = null;//重复代码2
//开始执行
ResultSet rs = null;//重复代码3
//判断是否分页
if(pagb != null && pagb.isPagination()) {
//获取总记录条数--->得到总页数的SQL语句
String countSQL = getCountSQL(sql);
con = DBHelper.getConnection();//重复代码1
ps = con.prepareStatement(countSQL);//重复代码2
rs = ps.executeQuery();//重复代码3
if(rs.next()) {
//给总记录数赋值
pagb.setTotal(rs.getString(1));
}
//获取分页SQL语句
String pageSQL = getPageSQL(sql,pagb);
con = DBHelper.getConnection();//重复代码1
ps = con.prepareStatement(pageSQL);//重复代码2
rs = ps.executeQuery();//重复代码3
}
else {
//不分页
con = DBHelper.getConnection();//重复代码1
ps = con.prepareStatement(sql);//重复代码2
rs = ps.executeQuery();//重复代码3
}
//查询不同的表,必然要处理不同的结果集
//接口是调用方法的人来实现
return callBack.foreach(rs);
}3.4 测试调用
@Test
public void testGetAll3() throws Exception {
Book b = new Book();
PageBean pageBean = new PageBean();
//查什么
b.setBname("绝世");
//第几页
pageBean.setPage(1);
//一页多少条
pageBean.setRows(3);
List<Book> list = new BookDao().getAll2(b, pageBean);
System.out.println("=======测试=======");
for (Book book : list) {
System.out.println(book);
}
}
运行结果:

我们写好通用分页后就只要简单地定义一些参数就好了,是不是很方便!
OK,今天Leaf,带来的学习笔记分享就到这里啦,后期还会有更多的学习分享,喜欢的可以关注一起学习噢~拜拜啦!!!
边栏推荐
猜你喜欢

简单实现矩形面积块

Pywinauto+某应用程序(学习至第9讲)--受阻

Web server failed to start. Port 8080 was already in use.

Getting started with RPC and thrift

Copy a project /project in idea

flex+js实现内部盒子高度跟随其中最大的高度

Dynamically set the theme color of the card

MySQL之函数&视图&导入导出
![[Hudi]hudi的编译及hudi&spark和hudi&flink的简单使用](/img/6f/e6f5ef79c232d9b27a8334cd8ddaa5.png)
[Hudi]hudi的编译及hudi&spark和hudi&flink的简单使用

my_ Implementation of strcpy (classic, simple, practical, collection)
随机推荐
3. Threads in flask
The super simple face recognition API can realize face recognition in just a few lines of code
Application of higher-order functions: handwritten promise source code (III)
Transform: translate (-50%, -50%) border problem
【无标题】
牛客刷题记录--Mysql
高阶函数的应用:手写Promise源码(四)
Web Component-自定义元素的生命周期
transform: translate(-50%, -50%)边框问题
Composants web - cycle de vie des éléments personnalisés
The attribution of branch and loop statements in C language
Oracle创建数据库“监听程序未启动或数据库服务未注册”错误处理
[flink]flink on yarn之flink-conf最简单配置
TypeScript介绍
py程序可以运行,但打包出的exe运行提示错误:加载“cv2”二进制扩展时检测到递归。请检查OpenCV安装。
JWT header进行编码过程
Anti shake and throttling of JS
js中类数组对象以及类数组转换的方法(ES6, ES5)
[Hudi]hudi的编译及hudi&spark和hudi&flink的简单使用
[部署]presto-server-0.261.tar.gz的集群部署和启动