Java学习笔记-全栈-web开发-09-DBUtils与分页实现

2021-08-18 15:28:34 浏览数 (1)

DBUtils是JDBC的一个高级封装,与大多数JDBC的封装包使用方法基本一致。 后面学习框架会有自己的框架DBUtils,学习本节DBUtils的目的是掌握“这一类”JDBC封装包的使用方法,为后续学习开路。 分页是数据查询以及数据展示中非常重要的一环


1. Dbutils

1.1 简介

DBUtils是java编程中的数据库操作实用工具,小巧简单实用。

DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。

  • 1.对于数据表的读操作,他可以把结果转成List,Array,Set等java集合,便于程序员操作;
  • 2.对于数据表的写操作,也变得很简单(只需写sql语句)
  • 3.更加简便的使用数据源

1.2 三个核心对象

  1. QueryRunner类 顾名思义,QueryRunner中提供对sql语句操作的API. 它主要有三个方法
代码语言:txt复制
- query() 用于执行select
- update() 用于执行insert update delete
- batch() 批处理
  1. DbUtils类 一个工具类,定义了关闭资源与事务处理的方法。

1.3 示例代码

能读懂这段代码即可 QueryRunner需要传入一个连接池对象,请通过学习JavaWeb基础 3.5节 数据库连接池进行配置

代码语言:javascript复制
public class Demo {

	//--1.ArrayHandler:将查询的结果的第一行放到一个数组中
    @Test
    public void query1() throws SQLException{
        
        QueryRunner runner=new QueryRunner(C3P0Utils.getDataSource());
        Object[] array=runner.query("select * from account",new ArrayHandler());
        System.out.println(array);
    }

	//--2.ArrayListHandler:将查询的结果的每一行放到一个数组中,然后再将数组放到集合中;
    @Test
    public void query2() throws SQLException{
        
        QueryRunner runner=new QueryRunner(C3P0Utils.getDataSource());
        List<Object[]> list=runner.query("select * from account",new ArrayListHandler());
        System.out.println(list);
    }
	
	//--3.BeanHandler:将查询的结果的第一行封装到一份javabean对象中;
    @Test
    public void query3() throws SQLException{
        
        QueryRunner runner=new QueryRunner(C3P0Utils.getDataSource());
        Account account=runner.query("select * from account",new BeanHandler<Account>(Account.class));
        System.out.println(account);
    }

	//--4.BeanListHandler:将查询的结果的每一行封装到一个javabean对象中,然后再将这些对象存入list中;
    @Test
    public void query4() throws SQLException{
        
        QueryRunner runner=new QueryRunner(C3P0Utils.getDataSource());
        List<Account> list=runner.query("select * from account",new BeanListHandler<Account>(Account.class));
        System.out.println(list);
    }
    
    //--5.MapHandler:将查询的结果的第一行存入到一个map中,键为列名,值为各列值;
    @Test
    public void query5() throws SQLException{
        
        QueryRunner runner=new QueryRunner(C3P0Utils.getDataSource());
        Map<String,Object> map=runner.query("select * from account",new MapHandler());
        System.out.println(map);
    }    

    //--6.MapListHandler:将查询的结果的每一行存入到一个map中,键为列名,值为各列值;然后再将map存入list中;
    @Test
    public void query6() throws SQLException{
        
        QueryRunner runner=new QueryRunner(C3P0Utils.getDataSource());
        List<Map<String,Object>> map=runner.query("select * from account",new MapListHandler());
        System.out.println(map);
    }    

    //--7.ScalarHandler:将查询的结果的第一行的某一列放到一个对象中;精确定位到某个值;
    @Test
    public void query7() throws SQLException{
        
        QueryRunner runner=new QueryRunner(C3P0Utils.getDataSource());
        String name=(String)runner.query("select * from account",new ScalarHandler(2));
        System.out.println(name);
    }  
}

2. 分页

分页,指的就是我们平常看到的网页数据,分很多页。 比如说百度搜索结果,可以不停的点击下一页来获取数据。

有两种方式:

1.一次将所有数据返回给前端,js进行分页

2.通过巧妙的构造,只有用户点击“下一页”的时候,再进行查询并返回响应结果。

显然,第一种方式会导致客户端响应缓慢,而且一次就把所有数据交出去,也不可取。

第二种才是常用的方式。

2.1 分页原理

既然是“用户点击下一页时,返回一页数据响应”,那自然需要将“一页数据”作为一个Javabean进行封装。

我们打开一个百度搜索页面进行分析。

可以看到,以上至少包含:

  • 当前搜索结果(多个被搜索实体–List<model>
  • 当前页码(currentPage
  • 总页数(totalPage

若是写过爬虫,肯定知道事实上还有一个数据是固定的:

  • 当前页搜索结果显示条数(pageCount

自然而然,会有总数据条数:

  • 总数据条数(totalCount

将以上属性封装成一个Javabean,这就是一个分页model

代码语言:javascript复制
public class PageResult<T> {
	private List<T> modelList;
	private int currentPage;//当前页码
	private int totalPage;//总页数
	private int pageCount;//每页数据量
	private long totalCount;//总数据量
}

自然而然,可以从中得出数据关系。

totalCount,pageCount应当是已知的,totalCount从数据库获取,pageCount由服务器设置。 currentPage应当也是已知的。因为,要么是第 1 页(初次访问),要么是用户输入具体页码跳转或是点击下一页实现页码自增。因此,对于服务器来说,currentPage是已知的。 totalPage和modelList是未知的,需要求出。

totalPage = (总记录÷总页数=每页数据量) 求出 totalPage ,同时考虑可否整除的情况

代码语言:javascript复制
totalPage=(int)
			(totalCount % pageCount)==0 
			? totalCount/pageCount 
			: totalCount/pageCount   1;

modelList = 当前数据序号起点 到 pageCount给定的数据长度

通过sql语句条件查询获得

代码语言:javascript复制
int start = pageCount * (currentPage-1); //当currentPage=1时,start=0,符合条件查询
代码语言:javascript复制
modelList = select * from models limit start, pageCount

学会以上分析,即可实现分页查询 下面是源自视频学习中的“书籍分页查询代码”

0 人点赞