JavaWeb——Jdbc Template增删改查案例
一、学习目标
- 能够完成列表查询
- 能够理解分页的实现原理
- 能够完成修改用户的功能
- 能够完成删除指定用户的功能
二、项目简介
1.项目功能简介
- 查询联系人
- 添加联系人
- 修改联系人
- 删除联系人
2.三层架构
三、web项目环境搭建
1.统一开发环境
-
开发工具---IntelliJ IDEA2017;
- JDK--1.8;
- Tomcat--8.5.31;
- 数据库--MySQL 5.6;
- Servlet--3.0;
2.使用IDEA创建web项目
第一步:File--New--Project
第二步:配置web项目
第三步:使用模板
第三步:配置web项目信息
第四步:创建完成
3、导入jar包
这次综合练习需要用到以下jar包 :
3.1 在WEB-INF下创建lib目录
jar包一般都会存放在WEB-INF目录下的lib目录中。由于IDEA的web项目模板没有帮我们提供这个目录。所有,我们需要手动在WEB-INF下创建lib目录。
3.2 导入jar包
将jar包复制到lib目录,然后选中所有的jar包---鼠标右键---Add As Library
4、导入静态文件
将案例所需的静态文件复制到web目录。
【注意】不要将静态文件复制到WEB-INF目录下,WEB-INF目录是不能够直接通过浏览器访问的。
5、数据库环境准备
数据库环境准备包括:
- - 创建数据库;
- - 创建数据表;
- - C3P0连接池配置;
5.1 创建数据库
使用数据库客户端创建数据库user_manager。
5.2 导入数据库脚本
在客户端中执行一下数据库脚本:
drop table if exists t_user;
create table if not exists t_user(
id int(11) primary key auto_increment,
name varchar(50) not null,
sex varchar(50) not null,
age int(11) not null,
address varchar(50) not null,
qq varchar(50) not null,
email varchar(50) not null
);
insert into t_user values(null,'张三','男',21,'广东','766335435','[email protected]');
insert into t_user values(null,'李四','男',22,'广东','243424242','[email protected]');
insert into t_user values(null,'王五','女',23,'广东','474574574','[email protected]');
insert into t_user values(null,'赵六','女',28,'广东','77777777', '[email protected]');
insert into t_user values(null,'钱七','女',25,'湖南','412132145','[email protected]');
select * from t_user;
5.3 配置C3P0配置文件
将资料中的C3P0配置文件:c3p0-config.xml文件复制到项目的src目录下。将数据库连接信息修改成自己的数据库连接信息。
【文件】c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///user_manager_45</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="acquireIncrement">2</property>
<property name="initialPoolSize">5</property>
<property name="minPoolSize">1</property>
<property name="maxPoolSize">5</property>
</default-config>
</c3p0-config>
5.4 创建与数据表对应的实体类
【实体类】User.java
public class User {
/**
* 主键id 自增长
*/
private int id;
/**
* 用户姓名姓名
*/
private String name;
private String sex;
private int age;
private String address;
private String qq;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public User() {
}
public User(int id, String name, String sex, int age, String address, String qq, String email) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.address = address;
this.qq = qq;
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", address='" + address + '\'' +
", qq='" + qq + '\'' +
", email='" + email + '\'' +
'}';
}
}
5.5 导入JdbcTemplate工具类
package com.mazai.user.utils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class JdbcTemplateUtil {
//初始化数据源
private static DataSource ds = new ComboPooledDataSource();
/**
* 获取JdbcTemplate对象
* @return
*/
public static JdbcTemplate getJdbcTemplate() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
return jdbcTemplate;
}
}
6、启动tomcat
6.1 配置tomcat
Run---Edit Configurations
修改tomcat的部署信息:
6.2 启动tomcat
第二章 用户列表查询
用户列表查询就是查询所有的用户信息,并将其展示在页面上 。
需求分析:
第一步:查询所有的用户信息;
第二步:在页面上展示数据;
实现:
1、列表查询业务流程分析
2、代码实现
2.1 修改index.jsp的查询链接
将查看所有用户信息的链接地址改成Servlet映射路径进行查询;
<a
href="/queryListServlet" style="text-decoration:none;font-size:33px">查询所有用户信息
</a>
2.2 创建包,编写后台代码
1、创建三层结构所需的包;
2、编写后台代码
【web层】QueryListServlet.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet(urlPatterns = "/queryListServlet")
public class QueryListServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理查询所有用户信息
//1.接收用户请求数据
//2.处理数据 列表查询===查询所有用户信息
UserService userService = new UserService();
List<User> userList = userService.queryAll();
//3.响应数据
//把数据转发到list.jsp页面
request.setAttribute("userList", userList);
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
}
【service层-接口】UserService.java
import java.util.List;
/**
* @author buguniao
* @version v1.0
* @date 2018/12/17 15:53
* @description TODO
**/
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
/**
* Ctrl+i 快速重写方法
* 查询所有用户数据
* @return
*/
@Override
public List<User> queryAll() {
//查询---dao
return userDao.queryAll();
}
}
【service层-实现类】UserService.java
/**
* 查询所有用户
* @return
*/
public List<User> queryAll() {
//处理查询业务逻辑
//调用dao层查询数据 接口制定则
UserDao userDao = new UserJdbcTemplateImpl();
//查询
return userDao.queryAll();
}
【dao层-接口】UserDao.java
import java.util.List;
public interface UserDao {
/**
* 查询所有用户
* @return
*/
public abstract List<User> queryAll();
}
【dao层-实现类】UserJdbcTemplateImpl.java
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class UserJdbcTemplateImpl implements UserDao {
/**
* 用户列表查询
* @return
*/
@Override
public List<User> queryAll() {
//获取jdbctemplate模板
JdbcTemplate jdbcTemplate = JdbcTemplateUtil.getJdbcTemplate();
//String sql
String sql = "select * from t_user";
//query
List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
return userList;
}
}
3、前台页面取值
【数据展示】list.jsp
<div class="container">
<h3 style="text-align: center">用户信息列表</h3>
<table border="1" class="table table-bordered table-hover">
<tr class="success">
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>籍贯</th>
<th>QQ</th>
<th>邮箱</th>
<th>操作</th>
</tr>
<%--从request中取值,展示--%>
<%--遍历:jstl的foreach标签进行遍历--%>
<c:forEach items="${userList}" var="user" varStatus="status">
<tr>
<td>${status.count}</td>
<td>${user.name}</td>
<td>${user.sex}</td>
<td>${user.age}</td>
<td>${user.address}</td>
<td>${user.qq}</td>
<td>${user.email}</td>
<td><a class="btn btn-default btn-sm" href="/queryUserByIdServlet?id=${user.id}">修改</a> <a class="btn btn-default btn-sm" href="javascript:void(0);" οnclick="delUser(${user.id})">删除</a></td>
</tr>
</c:forEach>
<tr>
<td colspan="8" align="center"><a class="btn btn-primary" href="add.jsp">添加联系人</a></td>
</tr>
</table>
第三章 删除指定用户
【需求】
list.jsp页面上的删除按钮后,这条数据被从数据库中删除,再次查询,页面上不再显示这条数据;
【需求分析】
-
点击删除按钮,删除当前的数据;
-
怎么能够确定当前这条数据呢?【通过id】
-
id是在什么时候传递的呢?【点击按钮】
-
怎么删除数据库中的数据?【JdbcTemplate】
-
结论:点击按钮,将id传到后台,根据id删除页面数据;
-
-
删除数据后,页面仍停留在用户列表页面,只是被删除的数据已经不存在了;
-
页面停留在用户列表页面:【删除成功后转发或者重定向到这个页面】
-
页面数据需要更新:【重新调用queryList】
-
结论:删除成功后直接转发或者重定向到queryList;
1、修改删除按钮的链接
<a class="btn btn-default btn-sm" href="javascript:void(0);" οnclick="delUser(${user.id})">删除</a>
<script>
//删除确认
function delUser(userId) {
var flag = window.confirm("确定要删除吗?这个人挺好的,请三思!");
if(flag) {
location.href = "/deleteUserByIdServlet?id=" + userId;
}
}
</script>
2、Servlet接收userId,执行删除
【web层】DeleteUserByIdServlet.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/deleteUserByIdServlet")
public class DeleteUserByIdServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据id删除用户
//1,接收请求数据
String id = request.getParameter("id");
//2.处理数据 === 根据id删除用户
UserService userService = new UserService();
//deleteFlag true:删除成功 fase:删除失败
boolean deleteFlag = userService.deleteUserById(id);
//3.响应数据
if(deleteFlag){
//删除成功 === 让用户看到最新数据
//直接将逻辑跳转到查询所有用户数据的Servlet
//转发到queryListServlet 帮助查询所有数据
//request.getRequestDispatcher("/queryListServlet").forward(request, response);
//重定向
response.sendRedirect("/queryListServlet");
}else {
//删除失败 === 给出提示信息 把错误信息转发到error.jsp页面
request.setAttribute("errorMsg","删除用户失败,请联系管理员!");
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
}
【service层】UserService.java
/**
* 根据id删除用户
* @param id
* @return
*/
public boolean deleteUserById(String id) {
//调用dao层删除数据
UserDao userDao = new UserJdbcTemplateImpl();
int result = userDao.deleteUserById(id);
// if (result == 0) {
// return false;
// }else {
// return true;
// }
// return result == 0? false:true;
return result !=0;
}
【dao层--接口】UserDao.java
int deleteUserById(String id);
【dao层--实现类】UserJdbcTemplateImpl.java
@Override
public int deleteUserById(String id) {
//获取模板
JdbcTemplate jdbcTemplate = JdbcTemplateUtil.getJdbcTemplate();
//String sql
String sql = "delete from t_user where id = ?";
return jdbcTemplate.update(sql, id);
}
第三章 修改指定数据
1、修改的业务逻辑
第一步:回显要修改的数据 查询
第二步:保存修改后的数据 更新
2、回显要修改的数据
【需求】点击修改按钮后,将当前这条数据的信息展示在页面上
【需求分析】
-
点击按钮后,需要传递这个用户的id数据到后台;【超链接传值,Servlet接收数据】
-
后台根据id查询到数据后,将数据展示在修改页面上;【根据id查询到数据后,转发到update.jsp,在update.jsp页面取数据】
【代码实现】 :
【update.jsp】页面
【web层】UpdateUserByIdServlet.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author buguniao
* @version v1.0
* @date 2018/12/17 17:09
* @description 根据id查询用户数据
**/
@WebServlet("/queryByIdServlet")
public class QueryByIdServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、接收请求数据
String id = request.getParameter("id");
//2、处理数据:根据id查询要修改的用户的数据
UserService userService = new UserServiceImpl();
//返回用户对象----转到update.jsp页面
User user = userService.queryById(id);
//3、响应数据:
request.setAttribute("user", user);
//转发到update.jsp
request.getRequestDispatcher("/update.jsp").forward(request,response);
}
}
【Service层】UserService.java
import com.heima.user.bean.User;
import java.util.List;
public interface UserService {
User queryById(String id);
}
【Service层--实现类】UserService.java
/**
* 根据id查询用户数据
* @param id
* @return
*/
@Override
public User queryById(String id) {
//根据id查询
return userDao.queryById(id);
// return user;
}
【dao层--接口】UserDao
/**
* 根据用户id查询用户信息
* @param id 用户id
* @return
*/
public abstract User queryById(String id);
【dao层--实现类】
/**
* 根据id查询数据
* @param id
* @return
*/
@Override
public User queryById(String id) {
String sql = "SELECT * FROM t_user WHERE id = ?";
try {
return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);
} catch (DataAccessException e) {
return null;
}
}
【update.jsp】将数据回显到update.jsp上
<form action="/updateUserByIdServlet" method="post">
<div class="form-group">
<label for="name">姓名:</label>
<input type="text" value="${user.name}" class="form-control" id="name" name="name" readonly="readonly" placeholder="请输入姓名" />
<input type="hidden" name="id" value="${user.id}">
</div>
<div class="form-group">
<label>性别:</label>
<input type="radio" name="sex" value="男" <c:if test="${user.sex == '男'}">checked</c:if> />男
<input type="radio" name="sex" value="女" <c:if test="${user.sex == '女'}">checked</c:if> />女
</div>
<div class="form-group">
<label for="age">年龄:</label>
<input type="text" value="${user.age}" class="form-control" id="age" name="age" placeholder="请输入年龄" />
</div>
<div class="form-group">
<label for="address">籍贯:</label>
<select name="address" class="form-control" >
<option <c:if test="${user.address=='广东'}">selected</c:if> value="广东">广东</option>
<option <c:if test="${user.address=='广西'}">selected</c:if> value="广西">广西</option>
<option <c:if test="${user.address=='湖南'}">selected</c:if> value="湖南">湖南</option>
</select>
</div>
<div class="form-group">
<label for="qq">QQ:</label>
<input type="text" value="${user.qq}" class="form-control" name="qq" placeholder="请输入QQ号码"/>
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="text" value="${user.email}" class="form-control" name="email" placeholder="请输入邮箱地址"/>
</div>
<div class="form-group" style="text-align: center">
<input class="btn btn-primary" type="submit" value="提交" />
<input class="btn btn-default" type="reset" value="重置" />
<input class="btn btn-default" type="button" value="返回"/>
</div>
</form>
3、保存修改后的数据
【需求】将修改后的数据保存到数据库
-
将修改后的数据传递到后台。新增?更新? 【更新操作】
-
根据什么更新?【id】这个数据怎么传递?【id不需要显示在页面上,通过隐藏域传递值】
【代码实现】
【update.jsp】表单提交数据,使用隐藏域提交id
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
/**
* @author buguniao
* @version v1.0
* @date 2018/12/17 17:47
* @description 根据id修改用户提交的数据
**/
@WebServlet("/updateByIdServlet")
public class UpdateByIdServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//1、接收请求数据:post提交数据 处理乱码问题
//BeanUtils封装数据 :map == 》obj
//rquest===》user
Map<String, String[]> parameterMap = request.getParameterMap();
User user = new User();
try {
//把rquest中的数据 封装到user对象中
BeanUtils.populate(user,parameterMap);
System.out.println(user);
//2、处理数据:根据id修改数据
UserService userService = new UserServiceImpl();
//updateFlag: updateFlag==true 修改成功 反之....
boolean updateFlag = userService.updateById(user);
//3、响应数据
if (updateFlag) {
//修改成功 --- 让用户看到最新的数据
response.sendRedirect("/queryListServlet");
}else{
//修改失败 --- 让用户看到错误提示信息
request.setAttribute("errorMsg","修改失败,请联系管理员!");
request.getRequestDispatcher("/error.jsp").forward(request,response);
}
} catch (Exception e) {
//修改失败 --- 让用户看到错误提示信息
request.setAttribute("errorMsg","修改失败,请联系管理员!");
request.getRequestDispatcher("/error.jsp").forward(request,response);
}
}
}
【Service层】UserService.java
/**
* 根据用户id更新用户数据
* @param user
* @return
*/
public boolean updateById(User user) {
int updateResult = userDao.updateUserById(user);
return updateResult!=0;
}
【Dao层--接口】
int updateUserById(User user);
【dao层--实现类】
/**
* 根据id修改用户信息
* @param user
* @return
*/
@Override
public int updateUserById(User user) {
JdbcTemplate jdbcTemplate = JdbcTemplateUtil.getJdbcTemplate();
String sql = "UPDATE t_user SET name =?, sex =?, age =?, address =?, qq =?, email =? WHERE id =?";
int update = jdbcTemplate.update(sql, user.getName(), user.getSex(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail(), user.getId());
return update;
}
4、修改结束后,页面查看最新数据
与删除指定用户一样,重定向到/queryListServlet
这个Servlet即可。
第四章 新增用户
【需求】
-
将用户数据准确插入到数据库中(页面数据校验[选做]);
-
数据添加完成后list页面的数据及时更新;
【add.jsp】新增用户页面
<form action="/addUserServlet" method="post" class="form-horizontal">
<div class="form-group">
<label class="col-lg-2 control-label" for="userName">姓名:</label>
<div class="col-lg-8">
<input type="text" class="form-control" id="userName" name="name" placeholder="请输入姓名">
</div>
<label class="col-lg-2 control-label" id="nameMsg"></label>
</div>
<div class="form-group">
<label class="col-lg-2 control-label">性别:</label>
<div class="col-lg-3">
<input type="radio" name="sex" value="男" checked="checked"/>男
</div>
<div class="col-lg-3">
<input type="radio" name="sex" value="女"/>女
</div>
<label class="col-lg-2 control-label" id="sexMsg"></label>
</div>
<div class="form-group">
<label for="age" class="control-label col-lg-2">年龄:</label>
<div class="col-lg-8">
<input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄">
</div>
</div>
<div class="form-group">
<label for="jiguan" class="col-lg-2 control-label">籍贯:</label>
<div class="col-lg-8">
<select name="address" class="form-control" id="jiguan">
<option value="广东">广东</option>
<option value="广西">广西</option>
<option value="湖南">湖南</option>
</select>
</div>
</div>
<div class="form-group">
<label for="qq" class="control-label col-lg-2">QQ:</label>
<div class="col-lg-8">
<input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码"/>
</div>
</div>
<div class="form-group">
<label for="email" class="col-lg-2 control-label">Email:</label>
<div class="col-lg-8">
<input type="text" class="form-control" id="email" name="email" placeholder="请输入邮箱地址"/>
</div>
</div>
<div class="form-group" style="text-align: center">
<input class="btn btn-primary" type="submit" value="提交" />
<input class="btn btn-default" type="reset" value="重置" />
<input class="btn btn-default" type="button" value="返回" />
</div>
</form>
【AddUserServlet.java】Servlet代码
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
/**
* @author buguniao
* @version v1.0
* @date 2018/12/17 18:10
* @description TODO
**/
@WebServlet("/addUserServlet")
public class AddUserServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//1、接收请求数据:
User user = new User();
try {
BeanUtils.populate(user,request.getParameterMap());
//2、处理数据:把数据插入到数据库中
UserService userService = new UserServiceImpl();
//addFlag:addFlag==true 新增成功
boolean addFlag = userService.addUser(user);
//3、响应数据
if (addFlag) {
//成功 === 需要给用户查询最新的数据 ==== 》queryListServlet
response.sendRedirect("/queryListServlet");
}else{
//失败 === error.jsp
//修改失败 --- 让用户看到错误提示信息
request.setAttribute("errorMsg","新增用户失败,请联系管理员!");
request.getRequestDispatcher("/error.jsp").forward(request,response);
}
} catch (Exception e) {
//失败 === error.jsp
//修改失败 --- 让用户看到错误提示信息
request.setAttribute("errorMsg","新增用户失败,请联系管理员!");
request.getRequestDispatcher("/error.jsp").forward(request,response);
}
}
}
【UserService.java】Service层
/**
* 新增用户
* @param user
* @return
*/
@Override
public boolean addUser(User user) {
//调用dao层存数据
int addNum = userDao.addUser(user);
return addNum != 0;
}
【UserDao.java】Dao层
/**
* 新增用户
* @param user
* @return
*/
@Override
public boolean addUser(User user) {
//调用dao层存数据
int addNum = userDao.addUser(user);
return addNum != 0;
}
第五章 分页查询
1、为什么要用分页
页面数据太多,一页展示不完。
带有分页的页面:
2、分页实现分析
页面上的分页数据展示可以分为两部分:
-
分页数据:就是展示在数据表格中的数据,随着页码的变化而变化;
-
分页条:控制分页的按钮;
3、分页数据实现
因为我们在页面上显示的数据,是从数据库中查询到的数据。所以,分页的实现最终还是依赖sql语句来实现。
3.1 数据库实现分页查询
MySQL数据库为我们提供了一个关键字limit,可以帮助我们查询到我们想要的指定条数的数据。
【案例】limit实现分页数据查询
【需求】
-
每页查询3条数据;
-
分别查询第1页,第2页,第3页的数据;
-
总结出规律;
【提示】limit语法
# limit n1,n2 关键字的用法:
# n1 起始条数;n2 偏移量(从起始条数起,总共查询多少条数据)
select * from t_user limit n1,n2
【参考】:
# n2 查询的条数 偏移量 pageSize
SELECT * FROM t_user LIMIT 0,5 ;# 第1页 0-5
SELECT * FROM t_user LIMIT 5,5;# 第2页 5-5 (2-1)*5
SELECT * FROM t_user LIMIT 10,5;# 第2页 10-5 (3-1)*5
#startCount = (pageNum-1)*pageSize;
18/5 3+1
15/5 3
SELECT count(*) from t_user;
【结论】
-
实现分页查询需要用到3个变量:
-
页码数:pageNum;
-
每页显示的数据条数:pageSize;
-
查询时的起始条数:startNum;
-
-
页码数和每页显示多少数据都是页面上用户选择的。需要从前台传递过来;
-
起始条数计算规则:startNum = (pageNum-1)*pageSize;
3.1 后台代码实现
【web层】PageQueryServlet.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
* @author buguniao
* @version v1.0
* @date 2019/3/12 14:54
* @description 分页查询
**/
@WebServlet("/pageQueryServlet")
public class PageQueryServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//分页数据查询
//1、接收请求数据
//页码数
String strPageNum = request.getParameter("pageNum");
//每页查询的记录数
String strPageSize = request.getParameter("pageSize");
int startCount = 0;
int pageNum = 1;
int pageSize = 5;
if (strPageNum != null && !"".equals(strPageNum.trim())) {
pageNum = Integer.parseInt(strPageNum);
}
if (strPageSize != null && !"".equals(strPageSize.trim())) {
pageSize = Integer.parseInt(strPageSize);
}
//计算起始索引
startCount = (pageNum-1)*pageSize;
//2、处理:分页查询
UserService userService = new UserServiceImpl();
//分页数据查询
List<User> userList = userService.pageQuery(startCount, pageSize);
//分页条处理
//1、计算总页数: totalCount ,pageSize
int totalCount = userService.queryTotalCount();
// if (totalCount % pageSize == 0) {
// int totalPage = totalCount/pageSize;
// }else{
// int totalPage = totalCount/pageSize + 1;
// }
// 20/5 == 4.0 21/5=4.2 向上取整:
int totalPage = totalCount % pageSize == 0?totalCount/pageSize:totalCount/pageSize+1;
//TODO: 向上取整 实现 totalPage计算
//3、响应数据:
//把list数据转发到list.jsp
request.setAttribute("list", userList);
request.setAttribute("totalPage", totalPage);
request.setAttribute("pageNum",pageNum);
request.setAttribute("pageSize",pageSize);
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
}
【service层】UserService.java
List<User> pageQuery(int startCount, int pageSize);
【service层】UserServiceImpl.java
/**
* 分页查询
* @param startCount
* @param pageSize
* @return
*/
@Override
public List<User> pageQuery(int startCount, int pageSize) {
//查询数据
return userDao.pageQuery(startCount,pageSize);
}
【dao层】UserDao.java
List<User> pageQuery(int startCount, int pageSize);
【dao层】UserDaoImpl.java
/**
* 分页查询
* @param startCount
* @param pageSize
* @return
*/
@Override
public List<User> pageQuery(int startCount, int pageSize) {
String sql = "SELECT * FROM t_user LIMIT ?,?";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class), startCount, pageSize);
}
【测试】 使用下面页面测试
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>分页查询</title>
</head>
<body>
<a href="/pageQueryServlet?pageNum=1&pageSize=5">第1页</a><br>
<a href="/pageQueryServlet?pageNum=2&pageSize=5">第2页</a><br>
<a href="/pageQueryServlet?pageNum=3&pageSize=5">第3页</a><br>
</body>
</html>
4、分页条实现
4.1 分页条数据分析
经过分析:分页条中需要以下参数
-
前一页:prePage 当前页的前一页,prePage = pageNum-1
-
总页数:totalPage (总记录数/每页显示的记录数)totalPage = totalCount/pageSize
-
下一页:nextPage 当前页的下一页,nextPage = pageNum+1
4.2 在分页查询Servlet
【封装分页条数据】PageQueryServlet.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
* @author buguniao
* @version v1.0
* @date 2019/3/12 14:54
* @description 分页查询
**/
@WebServlet("/pageQueryServlet")
public class PageQueryServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//分页数据查询
//1、接收请求数据
//页码数
String strPageNum = request.getParameter("pageNum");
//每页查询的记录数
String strPageSize = request.getParameter("pageSize");
int startCount = 0;
int pageNum = 1;
int pageSize = 5;
if (strPageNum != null && !"".equals(strPageNum.trim())) {
pageNum = Integer.parseInt(strPageNum);
}
if (strPageSize != null && !"".equals(strPageSize.trim())) {
pageSize = Integer.parseInt(strPageSize);
}
//计算起始索引
startCount = (pageNum-1)*pageSize;
//2、处理:分页查询
UserService userService = new UserServiceImpl();
//分页数据查询
List<User> userList = userService.pageQuery(startCount, pageSize);
//分页条处理
//1、计算总页数: totalCount ,pageSize
int totalCount = userService.queryTotalCount();
// if (totalCount % pageSize == 0) {
// int totalPage = totalCount/pageSize;
// }else{
// int totalPage = totalCount/pageSize + 1;
// }
// 20/5 == 4.0 21/5=4.2 向上取整:
int totalPage = totalCount % pageSize == 0?totalCount/pageSize:totalCount/pageSize+1;
//TODO: 向上取整 实现 totalPage计算
//3、响应数据:
//把list数据转发到list.jsp
request.setAttribute("list", userList);
request.setAttribute("totalPage", totalPage);
request.setAttribute("pageNum",pageNum);
request.setAttribute("pageSize",pageSize);
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
}
4.4 页面取值
【前一页】list.jsp
<c:if test="${pageNum>1}">
<a class="btn btn-default" href="/pageQueryServlet?pageNum=${pageNum==1?1:pageNum-1}&pageSize=${pageSize}">上一页</a>
</c:if>
【生成页码按钮】list.jsp
<c:forEach begin="1" end="${totalPage}" var="i">
<c:if test="${pageNum == i}">
<a class="btn btn-success btn-default" href="/pageQueryServlet?pageNum=${i}&pageSize=${pageSize}">${i}</a>
</c:if>
<c:if test="${pageNum != i}">
<a class="btn btn-default" href="/pageQueryServlet?pageNum=${i}&pageSize=${pageSize}">${i}</a>
</c:if>
</c:forEach>
【后一页】list.jsp
<c:if test="${pageNum <totalPage}">
<a class="btn btn-default" href="/pageQueryServlet?pageNum=${pageNum==totalPage?totalPage:pageNum+1}&pageSize=${pageSize}">下一页</a>
</c:if>
【每页显示数量】list.jsp
<select class="form-control" name="pageSize" id="pageSize" >
<option <c:if test="${pageSize==5}">selected</c:if> value="5">5条/页</option>
<option <c:if test="${pageSize==10}">selected</c:if> value="10">10条/页</option>
<option <c:if test="${pageSize==15}">selected</c:if> value="15">15条/页</option>
</select>
$("#pageSize").change(function () {
// var pageSize = $("#pageSize").val();
var pageSize = this.value;
//发送请求 查询分页数据
location.href = "/pageQueryServlet?pageNum=1&pageSize="+pageSize;
});
4.5 改变首页的请求链接
将首页的查询链接改成分页查询的链接即可。默认pageSize=5,pageNum=1
<a
href="/pageQueryServlet" style="text-decoration:none;font-size:33px">查询所有用户信息
</a>
4.6 改变新增,修改,删除成功后的跳转路径
将新增,修改,删除成功后的重定向路径都改成分页查询的路径:
4.6 改变新增,修改,删除成功后的跳转路径
将新增,修改,删除成功后的重定向路径都改成分页查询的路径: