版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
SSM框架–实现模糊分页查询
一.准备工作
-
使用MyBatis逆向生成员工表和部门表的实体类,接口以及映射文件
-
pom.xml中添加分页插件的依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency>
-
sqlMapConfig.xml中添加分页插件配置
<!-- 分页插件 --> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 --> <!-- pageNum表示当前页 pages表示尾页 --> <!-- true启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 --> <!-- false禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 --> <property name="reasonable" value="true"/> </plugin> </plugins>
二.展示页面
1.form表单包含查询条件和回显
- 需要查出所有的图书类型
<form id="myForm" action="/emp/search" method="post" style="text-align: center">
姓名:<input type="text" name="name" value="${ec.name}">
工资:<input type="text" name="startSalary" value="${ec.startSalary}" >-
<input type="text" name="endSalary" value="${ec.endSalary}" >
生日:<input type="date" name="startBirth" value="<fmt:formatDate value='${ec.startBirth}' pattern='yyyy-MM-dd'/>" >-
<input type="date" name="endBirth" value="<fmt:formatDate value='${ec.endBirth}' pattern='yyyy-MM-dd'/>" >
部门:<select name="deptid" >
<option value="0">--请选择--</option>
<c:forEach var="dept" items="${depts}">
<option value="${dept.id}"
<c:if test="${dept.id==ec.deptid}">selected=true</c:if>
>${dept.dname}</option>
</c:forEach>
</select>
<input type="hidden" id="pageNum" name="pageNum" value="1">
<input type="submit" value="搜索">
</form>
2.table做主体数据展示
- Book.bookType.name 需要在后台把booktype存到book中
<table align="center" cellpadding="15" cellspacing="0" border="1">
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>工资</td>
<td>津贴</td>
<td>生日</td>
<td>入职时间</td>
<td>领导</td>
<td>部门</td>
</tr>
<c:if test="${not empty pageInfo.list}">
<c:forEach var="emp" items="${pageInfo.list}">
<tr>
<td>${emp.id}</td>
<td>${emp.name}</td>
<td>${emp.age}</td>
<td>${emp.sex}</td>
<td>${emp.salary}</td>
<td>${emp.bonus}</td>
<td><fmt:formatDate value="${emp.birth}" pattern="yyyy-MM-dd"/></td>
<td><fmt:formatDate value="${emp.hiredate}" pattern="yyyy-MM-dd"/></td>
<td>${emp.leader}</td>
<td>${emp.dept.dname}</td>
</tr>
</c:forEach>
</c:if>
</table>
3.分页
- 使用超链接标签调用js函数to_Page,实现form表单的提交
<table align="center" cellpadding="10" cellspacing="10" border="1">
<tr>
<td><a href="javascript:goPage(1)">首页</a></td>
<td><a href="javascript:goPage(${pageInfo.pageNum-1})">上一页</a></td>
<c:forEach var="i" begin="1" end="${pageInfo.pages}">
<td><a href="javascript:goPage(${i})">${i}</a></td>
</c:forEach>
<td><a href="javascript:goPage(${pageInfo.pageNum+1})">下一页</a></td>
<td><a href="javascript:toPage()">跳转</a>到第<input size="2" type="text" value="${pageInfo.pageNum}" id="go">页</td>
<td><a href="javascript:goPage(${pageInfo.pages})">尾页</a></td>
</tr>
</table>
<!--js部分-->
<script>
function goPage(page) {
$("#pageNum").val(page);
$("#myForm").submit()
}
function toPage() {
var page=$("#go").val();
goPage(page)
}
</script>
三.Controller层
1.接收jsp的查询条件参数,和当前页参数pageNum
2.查询所有的部门信息
3.进行模糊条件 查询
4.将pageinfo,所有部门 和查询条件存进model
5.跳转到展示页面
@Controller
@RequestMapping("/emp")
public class EmpController {
@Autowired
IEmpService service;
/*
1.接收jsp的查询条件参数,还有当前页
2.查询所有的部门信息
3.进行模糊条件 查询
4.将pageinfo,所有部门 和 查询条件(回显)存进model
5.跳转到展示页面
*/
@RequestMapping("/search")
public ModelAndView search(EmpCriteria ec, @RequestParam(defaultValue = "1") int pageNum, ModelAndView mav){
//1.查询所有的部门
List<Dept> depts= service.selectDepts();
//2.使用分页插件, 模糊分页查询,pageInfo中包含查询结果集和分页四大参数
PageInfo pageInfo= service.selectLikePage(ec,pageNum);
mav.addObject("depts",depts);
mav.addObject("pageInfo",pageInfo);
mav.addObject("ec",ec);
mav.setViewName("show");
return mav;
}
}
四.Service层
1.开始执行分页(必须放在最前面)
2.模糊条件查询 得到结果集 emps
3.emps集合进行遍历 并查询每一名员工的部门 存进员工对象中
4.将结果集 以有参构造的方式存到pageInfo(分页的参数 查询结果集)中
@Service
@Transactional
public class EmpServiceImpl implements IEmpService {
@Autowired
DeptMapper deptMapper;
@Autowired
EmpMapper empMapper;
@Override//查询所有部门
public List<Dept> selectDepts() {
//条件为空即为查询所有
return deptMapper.selectByExample(null);
}
/*
1.开始执行分页(必须放在最前面)
2. 模糊条件查询 得到结果集 emps
3.emps集合进行遍历 并查询每一个员工的部门 存进员工对象中
4.将结果集 以有参构造的方式存到pageInfo(分页的参数 查询结果集)中
*/
@Override
public PageInfo selectLikePage(EmpCriteria ec, int pageNum) {
//1.开始执行分页(必须放在最前面)
int size=5;
PageHelper.startPage(pageNum,size);
//2.封装查询条件 ,执行模糊查询
EmpExample empExample = new EmpExample();
EmpExample.Criteria criteria = empExample.createCriteria();
//ec:所有的条件参数:
// 1.姓名name 2.工资 startSalary endSalary 3.生日 startBirth endBirth 4.部门deptid
if(ec.getName()!=null){
criteria.andNameLike("%"+ec.getName()+"%");
}
if(ec.getStartSalary()!=null){
criteria.andSalaryGreaterThanOrEqualTo(ec.getStartSalary());
}
if(ec.getEndSalary()!=null){
criteria.andSalaryLessThanOrEqualTo(ec.getEndSalary());
}
if(ec.getStartBirth()!=null){
criteria.andBirthGreaterThanOrEqualTo(ec.getStartBirth());
}
if(ec.getEndBirth()!=null){
criteria.andBirthLessThanOrEqualTo(ec.getEndBirth());
}
if(ec.getDeptid()!=null&&ec.getDeptid()!=0){
criteria.andDeptidEqualTo(ec.getDeptid());
}
List<Emp> emps = empMapper.selectByExample(empExample);
//3.遍历结果集,关联员工和部门
for(Emp emp:emps){
Dept dept = deptMapper.selectByPrimaryKey(emp.getDeptid());
emp.setDept(dept);
}
//4.结果集 存进 pageInfo 并返回
return new PageInfo(emps);//pageInfo中本来就有四大分页参数,现关联结果集
}
}
- 封装条件类
public class EmpCriteria {
private String name;
private Double startSalary;
private Double endSalary;
//页面400
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date startBirth;
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date endBirth;
private Integer deptid;
//省略 get/set set中String类型的带 trim()方法
}