我是阿福,公众号「阿福聊编程」作者,一个在后端技术路上摸盘滚打的程序员,在进阶的路上,共勉!文章已收录在 JavaSharing 中,蕴含Java技术文章,面试指南,资源分享。
思路剖析
MyBatis的PageHelper插件(后盾)
作用
以齐全非侵入的形式在原有查问根底上附加分页成果。从SQL层面来说,在SQL语句前面附加LIMIT子句。从Java代码来说,把原来返回的List类型封装为Page类型。
依赖信息
<!-- MyBatis分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.0.0</version>
</dependency>
配置形式
那么如何让插件起作用呢?就须要在SqlSessionFactoryBean中配置MyBatis插件
<!--配置SqlSessionFactoryBean-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--拆卸数据源-->
<property name="dataSource" ref="dataSource"></property>
<!--mybatis配置文件所在的地位-->
<property name="configLocation" value="classpath:/mybstis/mybatis-config.xml"></property>
<!--配置mapper所在的文件地位-->
<property name="mapperLocations" value="classpath:/mybstis/mapper/*Mapper.xml"></property>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageHelper">
<!-- 配置插件属性 -->
<property name="properties">
<props>
<!-- 配置数据库方言 -->
<!-- MySQL分页:LIMIT -->
<!-- Oracle分页:TopN剖析 -->
<prop key="dialect">mysql</prop>
<!-- 配置主动修改页码 -->
<!-- pageNo的无效范畴:1~总页数 -->
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
数据库的Sql 脚本
SELECT
*
FROM
t_admin
WHERE
loginacct LIKE CONCAT('%','ad','%')
OR username LIKE CONCAT('%','ad','%')
OR email LIKE CONCAT('%','ad','%')
AdminMapper配置文件
<resultMap id="BaseResultMap" type="com.zfcoding.model.AdminBean" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="loginacct" property="loginAcct" jdbcType="VARCHAR" />
<result column="userpswd" property="userPswd" jdbcType="CHAR" />
<result column="username" property="userName" jdbcType="VARCHAR" />
<result column="email" property="email" jdbcType="VARCHAR" />
<result column="createtime" property="createTime" jdbcType="CHAR" />
</resultMap>
<sql id="Base_Column_List" >
id, loginacct, userpswd, username, email, createtime
</sql>
<select id="queryAdminByKeyWord" parameterType="java.lang.String" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM
t_admin
WHERE
loginacct LIKE CONCAT('%',#{keyword},'%')
OR username LIKE CONCAT('%',#{keyword},'%')
OR email LIKE CONCAT('%',#{keyword},'%')
</select>
Mapper接口
List<AdminBean> queryAdminByKeyWord(@Param("keyword") String keyword);
AdminServiceImpl
public PageInfo<AdminBean> queryForKeywordSearch(int pageNum, int pageSize, String keyword) {
//调用PageHelper的工具办法,开启分页性能
PageHelper.startPage(pageNum, pageSize);
List<AdminBean> adminBeans = adminMapper.queryAdminByKeyWord(keyword);
//执行分页查问
return new PageInfo<AdminBean>(adminBeans);
}
AdminController
@RequestMapping("/queryAdmin")
public String queryAdminByKeyword(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
@RequestParam(value = "pageSize", defaultValue = "5") int pageSize,
@RequestParam(value = "keyword", defaultValue = "") String keyword,
Model model) {
PageInfo<AdminBean> adminBeanPageInfo = adminService.queryForKeywordSearch(pageNum, pageSize, keyword);
model.addAttribute(CrowdFundingConstant.ATTR_NAME_PAGE_INFO, adminBeanPageInfo);
return "admin/admin-page";
}
常量类
public class CrowdFundingConstant {
public static final String ATTR_NAME_PAGE_INFO="PAGEINFO-ADMIN";
}
到这里后盾的性能都实现完了,上面来实现前台的性能。
页面显示 主体局部(前台)
前台页面
<table class="table table-bordered">
<thead>
<tr>
<th width="30">#</th>
<th width="30"><input id="summaryBox" type="checkbox"></th>
<th>账号</th>
<th>名称</th>
<th>邮箱地址</th>
<th width="100">操作</th>
</tr>
</thead>
<tbody>
<c:if test="${empty requestScope['PAGEINFO-ADMIN'].list}">
<tr>
<td style="text-align: center" colspan="6">道歉,没有用户查问的数据!!!!</td>
</tr>
</c:if>
<c:if test="${! empty requestScope['PAGEINFO-ADMIN'].list}">
<c:forEach items="${requestScope['PAGEINFO-ADMIN'].list}" var="item"
varStatus="myStatus">
<tr>
<td>${myStatus.count}</td>
<th width="30"><input class="itemBox" type="checkbox"></th>
<td>${item.loginAcct}</td>
<td>${item.userName}</td>
<td>${item.email}</td>
<td>
<button type="button" class="btn btn-success btn-xs"><i
class=" glyphicon glyphicon-check"></i></button>
<button type="button" class="btn btn-danger btn-xs uniqueRemoveBtn"><i
class=" glyphicon glyphicon-remove"></i></button>
</td>
</tr>
</c:forEach>
</c:if>
</tbody>
<tfoot>
<tr>
<td colspan="6" align="center">
<div id="Pagination" class="pagination"><!-- 这里显示分页 --></div>
</td>
</tr>
</tfoot>
</table>
页面导航条局部的实现
应用一个基于jQuery的分页插件:Pagination
环境搭建
退出款式文件,pagination.css引入工程,在须要的页面援用pagination.css
<link rel="stylesheet" href="css/pagination.css"/>
退出Pagination的js文件,在须要的页面援用jquery.pagination.js,这里要留神一下,须要把源码文件中 这段代码正文掉:opts.callback(current_page, this); 因为在这个中央从新加载页面,会造成死循环。
<script type="text/javascript" src="script/jquery.pagination.js"></script>
分页导航条须要在HTML标签中退出的局部
<tr>
<td colspan="6" align="center">
<div id="Pagination" class="pagination"><!-- 这里显示分页 --></div>
</td>
</tr>
jQuery代
// 申明函数封装导航条初始化操作
function initPagination() {
// 申明变量存储总记录数
var totalRecord = ${requestScope['PAGEINFO-ADMIN'].total};
// 申明变量存储分页导航条显示时的属性设置
var paginationProperties = {
num_edge_entries: 3, //边缘页数
num_display_entries: 5, //主体页数
callback: pageselectCallback, //回调函数
items_per_page: ${requestScope['PAGEINFO-ADMIN'].pageSize}, //每页显示数据数量,就是pageSize
current_page: ${requestScope['PAGEINFO-ADMIN'].pageNum - 1},//当前页页码
prev_text: "上一页", //上一页文本
next_text: "下一页" //下一页文本
};
// 显示分页导航条
$("#Pagination").pagination(totalRecord, paginationProperties);
};
// 在每一次点击“上一页”、“下一页”、“页码”时执行这个函数跳转页面
function pageselectCallback(pageIndex, jq) {
// pageIndex从0开始,pageNum从1开始
var pageNum = pageIndex + 1;
// 跳转页面
window.location.href = "admin/queryAdmin.action?pageNum=" + pageNum + "&keyword=${param.keyword}";
return false;
};
关键词查问
<form class="form-inline" action="/admin/queryAdmin.action" method="post" role="form"
style="float:left;">
<div class="form-group has-feedback">
<div class="input-group">
<div class="input-group-addon">查问条件</div>
<input class="form-control has-success" name="keyword" type="text"
placeholder="请输出查问条件">
</div>
</div>
<button type="submit" class="btn btn-warning"><i class="glyphicon glyphicon-search"></i> 查问
</button>
</form>
点击查问的按钮就能够实现分页查问的性能了。
源码下载
发表回复