Java Web——Jdbc Template增删改查综合案例

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u010835486/article/details/79801101

 

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>&nbsp;<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页面上的删除按钮后,这条数据被从数据库中删除,再次查询,页面上不再显示这条数据;

【需求分析】

  1. 点击删除按钮,删除当前的数据;

    1. 怎么能够确定当前这条数据呢?【通过id】

    2. id是在什么时候传递的呢?【点击按钮】

    3. 怎么删除数据库中的数据?【JdbcTemplate】

    4. 结论:点击按钮,将id传到后台,根据id删除页面数据;

  2. 删除数据后,页面仍停留在用户列表页面,只是被删除的数据已经不存在了;

    1. 页面停留在用户列表页面:【删除成功后转发或者重定向到这个页面】

    2. 页面数据需要更新:【重新调用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、回显要修改的数据

【需求】点击修改按钮后,将当前这条数据的信息展示在页面上

【需求分析】

  1. 点击按钮后,需要传递这个用户的id数据到后台;【超链接传值,Servlet接收数据】

  2. 后台根据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、保存修改后的数据

【需求】将修改后的数据保存到数据库

  1. 将修改后的数据传递到后台。新增?更新? 【更新操作】

  2. 根据什么更新?【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即可。

第四章 新增用户

【需求】

  1. 将用户数据准确插入到数据库中(页面数据校验[选做]);

  2. 数据添加完成后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、分页实现分析

页面上的分页数据展示可以分为两部分:

  1. 分页数据:就是展示在数据表格中的数据,随着页码的变化而变化;

  2. 分页条:控制分页的按钮;

3、分页数据实现

因为我们在页面上显示的数据,是从数据库中查询到的数据。所以,分页的实现最终还是依赖sql语句来实现。

3.1 数据库实现分页查询

MySQL数据库为我们提供了一个关键字limit,可以帮助我们查询到我们想要的指定条数的数据。

【案例】limit实现分页数据查询

【需求】

  1. 每页查询3条数据;

  2. 分别查询第1页,第2页,第3页的数据;

  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;

【结论】

  1. 实现分页查询需要用到3个变量:

    1. 页码数:pageNum;

    2. 每页显示的数据条数:pageSize;

    3. 查询时的起始条数:startNum;

  2. 页码数和每页显示多少数据都是页面上用户选择的。需要从前台传递过来;

  3. 起始条数计算规则: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 分页条数据分析

经过分析:分页条中需要以下参数

  1. 前一页:prePage 当前页的前一页,prePage = pageNum-1

  2. 总页数:totalPage (总记录数/每页显示的记录数)totalPage = totalCount/pageSize

  3. 下一页: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 改变新增,修改,删除成功后的跳转路径

	将新增,修改,删除成功后的重定向路径都改成分页查询的路径:

猜你喜欢

转载自blog.csdn.net/u010835486/article/details/79801101