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 三个核心对象
- QueryRunner类 顾名思义,QueryRunner中提供对sql语句操作的API. 它主要有三个方法
- query() 用于执行select
- update() 用于执行insert update delete
- batch() 批处理
- DbUtils类 一个工具类,定义了关闭资源与事务处理的方法。
1.3 示例代码
代码语言:javascript复制能读懂这段代码即可 QueryRunner需要传入一个连接池对象,请通过学习JavaWeb基础 3.5节 数据库连接池进行配置
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
学会以上分析,即可实现分页查询 下面是源自视频学习中的“书籍分页查询代码”