本篇文章主要实现分页和查询功能
效果展示:
下拉框遍历:
查找效果
1.pom.xml配置
<!--pageHelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
2.mybatis-config.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
<property name="reasonable" value="true"/>
<property name="supportMtehodsArguments" value="true"/>
</plugin>
</plugins>
</configuration>
3.applicationContext.xml加载mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:db.properties"/>
<!--开启注解的扫描 希望处理service和dao,controller不需要spring框架去处理 -->
<context:component-scan base-package="com.qf.dao">
<!--配置哪些注解不扫描-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--Spring整合mybatis框架-->
<!--配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="driverClassName" value="${jdbc.driver}"/>
</bean>
<!--配置SqlSessionFactory工厂-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 引入mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--配置Dao接口所在包-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.qf.dao"/>
</bean>
</beans>
4.dao层代码
/**
* 查询所有视频信息
* @return list集合
*/
List<Video> findAllVideo(QueryVo queryVo);
/**
* 获取信息总条数
* @return
*/
Integer getTotalCount();
4.1 mapper.xml(sql语句实现)
sql语句根据自己需要自己编写哦~,调用方法是通过id获取的的方法,方法名与id保持一致
<!--联表查询-->
<select id="findAllVideo" resultMap="VideoMap">
SELECT video.id,title,detail,speaker.speaker_name,time,play_num,speaker_id,course_id
FROM video
INNER JOIN speaker
ON video.speaker_id=speaker.id
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="title != null and title != ''">
and title like concat('%',#{title},'%')
</if>
<if test="speakerId != null and speakerId != ''">
and speaker_id = #{speakerId}
</if>
<if test="courseId != null and courseId != ''">
and course_id = #{courseId}
</if>
</trim>
</select>
<!--查询总条数-->
<select id="getTotalCount" resultType="java.lang.Integer">
SELECT count(*) from video
</select>
5.service层代码
VideoService.java
/**
* 查询所有视频信息
* @return list集合
* @param queryVo
*/
List<Video> findAllVideo(QueryVo queryVo);
/**
* 获取总信息条数
* @return 总信息条数
*/
Integer getTotalCount();
VideoServiceImpl.java
@Autowired
private VideoDao videoDao;
@Override
public List<Video> findAllVideo(QueryVo queryVo) {
return videoDao.findAllVideo(queryVo);
}
@Override
public Integer getTotalCount() {
return videoDao.getTotalCount();
}
6.编写controller层代码
VideoController
@Autowired
private VideoService videoService;
@Autowired
private SpeakerService speakerService;
@Autowired
private CourseService courseService;
/**
* 分页查找
* @param pageNum 首页
* @param model 用于存储数据
* @param queryVo 查询
* @return 展示界面
*/
@RequestMapping("/findByPage")
public String findByPage(@RequestParam(defaultValue = "1",required = false) Integer pageNum,
Model model,
QueryVo queryVo) {
model.addAttribute("queryVo", queryVo);
if (pageNum < 1) {
pageNum = 1;
} else if (pageNum > getTotalPage()) {
pageNum = getTotalPage();
}
//课程名下拉菜单
List<Course> allCourse = courseService.findAllCourse();
model.addAttribute("allCourse",allCourse);
//主讲人下拉菜单
List<Speaker> allSpeaker = speakerService.findAllSpeaker();
model.addAttribute("allSpeaker",allSpeaker);
PageHelper.startPage(pageNum, 10);
List<Video> videos = videoService.findAllVideo(queryVo);
PageInfo<Video> videoPageInfo = new PageInfo<>(videos);
model.addAttribute("videoPageInfo", videoPageInfo);
return "/behind/videoList";
}
/**
* 获取总页数
* @return
*/
public Integer getTotalPage() {
Integer pageSize = 10;
Integer totalCount = videoService.getTotalCount();
if (totalCount % pageSize == 0) {
return totalCount / pageSize;
} else {
return totalCount / pageSize + 1;
}
}
7.查询的参数代码QueryVo
7.1 pojo层
package com.qf.pojo;
import lombok.Data;
@Data
public class QueryVo {
/**
* 标题
*/
private String title;
/**
* 主讲人
*/
private Integer speakerId;
/**
* 课程表
*/
private Integer courseId;
}
8.前端jsp起分页作用的代码
form2为你展示的内容的form表单的id
<div class="container">
<div class="navbar-right" style="padding-right: 17px">
<tr>
<a href="javascript:void(0)" onclick="queryVideo(1)">首页</a>
<a href="javascript:void(0)" onclick="queryVideo(${videoPageInfo.pageNum-1})">上一页</a>
<a href="javascript:void(0)" onclick="queryVideo(${videoPageInfo.pageNum+1})">下一页</a>
<a href="javascript:void(0)" onclick="queryVideo(${videoPageInfo.pages})">尾页</a>
</tr>
</div>
</div>
<script type="application/javascript" src="../../js/jquery-1.8.3.min.js"></script>
<script>
function queryVideo(pageNum) {
$("#pageNum").val(pageNum);
$("#form1").submit();
}
// function delAll() {
// $("#form2").submit();
// }
</script>
9.现奉上videoList.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="p" uri="http://yanzhenwei.com/common/" %>
<!-- 分页插件 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<!--表示使用IE最新的渲染模式进行解析-->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--
兼容一些移动设备,会根据屏幕的大小缩放
width=device-width 表示宽度是设备的宽度(很多手机的宽度都是980px)
initial-scale=1 初始化缩放级别 1-5
minimum-scale=1 maximum-scale=5
user-scalable=no 禁止缩放
-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>视频列表管理</title>
<!-- Bootstrap -->
<link href="${pageContext.request.contextPath}/css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!-- 如果IE版本小于9,加载以下js,解决低版本兼容问题 -->
<!--[if lt IE 9]>
<script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<!--
引入网络的jquery ,如果想换成自己的,导入即可
网站优化:建议将你网站的css\js等代码,放置在互联网公共平台上维护,比如:七牛
-->
<script src="${pageContext.request.contextPath}/js/jquery-1.12.4.min.js"></script>
<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
<script src="${pageContext.request.contextPath}/js/confirm.js"></script>
<style type="text/css">
th {
text-align: center;
}
</style>
<script type="text/javascript">
function showAddPage() {
location.href = "${pageContext.request.contextPath}/video/toAddOrUpdateVideo";
}
$(function () {
$("#btn").click(function () {
if (deleteNum > 0) {
Confirm.show('溫馨提示', '您確定要刪除这' + deleteNum + '条记录嗎?', {
'Delete': {
'primary': true,
'callback': function () {
//不是ajax,模拟提交
$("#form2").submit();
//如果是一个正常表单的提交,按钮必须是type=submit,并且必须在form表单里面
}
}
});
} else {
alert("您暂未选择任何数据,请选择您要删除的数据!");
}
});
});
function delVideoById(obj, id, name) {
Confirm.show('溫馨提示', '您確定要刪除' + name + '嗎?', {
'Delete': {
'primary': true,
'callback': function () {
//此处需要调用ajax
var params = {
"id": id
};
$.post("${pageContext.request.contextPath}/video/videoDel", params, function (data) {
if (data == 'success') {
Confirm.show('处理结果', '恭喜您删除成功');
//请用js删除掉那条记录
$(obj).parent().parent().remove();
} else {
Confirm.show('处理结果', '操作失败');
}
});
}
}
});
//阻止事件默认行为 a href onclick
//先执行onclick 后跳转
return false;
}
var deleteNum = 0;
function selectAll(obj) {
//dom jquery
var value = obj.checked;
//alert(value);
var arr = document.getElementsByName("ids");
for (var i = 0; i < arr.length; i++) {
arr[i].checked = value;
}
if (value) {
deleteNum = arr.length;
} else {
deleteNum = 0;
}
$("#delNum").text(deleteNum);
}
function selectOne(obj) {
if (obj.checked) {
deleteNum += 1;
} else {
deleteNum -= 1;
}
if (deleteNum == 0) {
document.getElementById("checkAllId").checked = false;
}
var arr = document.getElementsByName("ids");
if (deleteNum == arr.length) {
document.getElementById("checkAllId").checked = true;
}
$("#delNum").text(deleteNum);
}
//解决选择下拉框内容到输入框内容的问题
function showName(obj, id, type) {
var name = $(obj).text();
if (type == 1) {
$("#speakerName").html(name + "<span class='caret'></span>");
$("#speakerId").val(id);
} else {
$("#courseName").html(name + "<span class='caret'></span>");
$("#courseId").val(id);
}
}
</script>
</head>
<body>
<nav class="navbar-inverse">
<div class="container">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<a class="navbar-brand" href="${pageContext.request.contextPath}/video/findByPage">视频管理系统</a>
</div>
<div class="collapse navbar-collapse"
id="bs-example-navbar-collapse-9">
<ul class="nav navbar-nav">
<li class="active"><a href="${pageContext.request.contextPath}/video/findByPage">视频管理</a></li>
<li><a href="${pageContext.request.contextPath}/speaker/findByPage">主讲人管理</a></li>
<li><a href="${pageContext.request.contextPath}/showCourseList">课程管理</a></li>
</ul>
<p class="navbar-text navbar-right">
<span>${admin.username}</span> <i class="glyphicon glyphicon-log-in"
aria-hidden="true"></i> <a
href="${pageContext.request.contextPath}/admin/exit"
class="navbar-link">退出</a>
</p>
</div>
<!-- /.navbar-collapse -->
</div>
<!-- /.container-fluid -->
</nav>
<div class="jumbotron" style="padding-top: 15px;padding-bottom: 15px;">
<div class="container">
<h2>视频管理</h2>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-2">
<button onclick="showAddPage()" type="button"
class="btn btn-info dropdown-toggle" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">添加
</button>
<button id="btn" class="btn btn-primary" type="button">
批量删除 <span class="badge" id="delNum">0</span>
</button>
</div>
<div class="col-md-4"></div>
<div class="col-md-6">
<!-- 查询相关组件 -->
<form id="form1" class="navbar-form navbar-right" action="${pageContext.request.contextPath}/video/findByPage" method="post">
<!-- 设置隐藏域 传递当前页码 -->
<input type="hidden" name="pageNum" id="pageNum">
<input type="text" name="title" class="form-control" placeholder="标题" value="${queryVo.title}">
<div class="btn-group">
<button type="button" id="speakerName"
class="btn btn-primary dropdown-toggle" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<c:forEach items="${allSpeaker}" var="speaker">
<c:if test="${speaker.id == queryVo.speakerId}">
${speaker.speakerName}
</c:if>
</c:forEach>
<c:if test="${empty queryVo.speakerId}">
--请选择老师--
</c:if>
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li value=''><a href="#" onclick="showName(this,'',1)">--请选择老师--</a>
</li>
<c:forEach items="${allSpeaker}" var="speaker">
<li value='${speaker.id}'><a href="#"
onclick="showName(this,'${speaker.id}',1)">${speaker.speakerName}</a>
</li>
</c:forEach>
</ul>
<input type="hidden" name="speakerId" id="speakerId" value="${queryVo.speakerId}"/>
</div>
<div class="btn-group">
<button type="button" id="courseName"
class="btn btn-primary dropdown-toggle" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<c:forEach items="${allCourse}" var="course">
<c:if test="${course.id == queryVo.courseId}">
${course.courseTitle}
</c:if>
</c:forEach>
<c:if test="${empty queryVo.courseId}">
--请选择课程--
</c:if>
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li value=""><a href="#" onclick="showName(this,'',2)">--请选择课程--</a>
</li>
<c:forEach items="${allCourse}" var="course">
<li value="${course.id}"><a href="#"
onclick="showName(this,${course.id},2)">${course.courseTitle}</a>
</li>
</c:forEach>
</ul>
<input type="hidden" name="courseId" id="courseId" value="${queryVo.courseId}"/>
</div>
<button type="submit" class="btn btn-info dropdown-toggle">查询</button>
</form>
</div>
</div>
</div>
<div class="container" style="margin-top: 20px;">
<!--
http://localhost/video/video/list
相对路径就是将最后一个/后面的东西替换掉
http://localhost/video/video/delBatchVideos
-->
<form id="form2" action="/video/delAll" method="post">
<table class="table table-bordered table-hover"
style="text-align: center;table-layout:fixed">
<thead>
<tr class="active">
<th style="width:3%"><input type="checkbox" onclick="selectAll(this)"
id="checkAllId"/></th>
<th style="width:5%">序号</th>
<th style="width:15%">名称</th>
<th style="width:42%;">介绍</th>
<th>讲师</th>
<th>时长</th>
<th style="width:7%">播放次数</th>
<th>编辑</th>
<th>删除</th>
</tr>
</thead>
<tbody>
<c:forEach items="${videoPageInfo.list}" var="video" varStatus="status">
<tr>
<td><input type="checkbox" name="ids" value="${video.id}"
onclick="selectOne(this)"/></td>
<td>${status.count}</td>
<td>${video.title}</td>
<td style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;">${video.detail}</td>
<td>${video.speakerName}</td>
<td>${video.time}</td>
<td>${video.playNum}</td>
<td><a href="${pageContext.request.contextPath}/video/queryById?id=${video.id}"><span
class="glyphicon glyphicon glyphicon-edit" aria-hidden="true"></span></a></td>
<!-- js中如果使用el表达式,请用单引号包括,避免造成一些语法问题 -->
<td><a
onclick="return delVideoById(this,'${video.id}','${video.title}')"><span
class="glyphicon glyphicon-trash" aria-hidden="true"></span></a></td>
</tr>
</c:forEach>
</tbody>
</table>
</form>
<div class="container">
<div class="navbar-right" style="padding-right: 17px">
<tr>
<a href="javascript:void(0)" onclick="queryVideo(1)">首页</a>
<a href="javascript:void(0)" onclick="queryVideo(${videoPageInfo.pageNum-1})">上一页</a>
<a href="javascript:void(0)" onclick="queryVideo(${videoPageInfo.pageNum+1})">下一页</a>
<a href="javascript:void(0)" onclick="queryVideo(${videoPageInfo.pages})">尾页</a>
</tr>
</div>
</div>
</center>
</div>
</body>
<script type="application/javascript" src="../../js/jquery-1.8.3.min.js"></script>
<script>
function queryVideo(pageNum) {
$("#pageNum").val(pageNum);
$("#form1").submit();
}
// function delAll() {
// $("#form2").submit();
// }
</script>
</html>