自定义标签实现分页查询
忙活了一下午才写好,真是菜。不过还是很开心。
第一步、导入资源
自定义标签库和自定义标签类(实现了tagSupport)
第二步、前端页面使用自定义标签
导入自定义标签库
使用自定义标签
第三步、后台实现
后台实现的过程就是将查询到的信息及分页信息封装到page对象中相应给前端页面
分析:size是由开发者自定义的,page是由前端页面传来的。因此我们只需要准备total和rows结果集就可以了
1、首先创建实体类customer
package com.hytXwz.crm.entity;
import java.io.Serializable;
import java.util.Date;
public class Customer implements Serializable {
private static final long serialVersionUID = -6128501330437420783L;
private Long cust_id;
private String cust_name;
private Long cust_user_id;
private Long cust_create_id;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_linkman;
private String cust_phone;
private String cust_mobile;
private String cust_zipcode;
private String cust_address;
private Date cust_createtime;
。。。get/set省略了
2、dao层(重要)
CustomerDao 从数据库中查询我们需要用到的total和rows
package com.hytXwz.crm.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.hytXwz.crm.entity.Customer;
import com.hytXwz.crm.entity.QueryVo;
@Repository("customerDao")
public interface CustomerDao {
//查询符合条件的结果集
List<Customer> selectRowsByQueryVo(QueryVo vo);
//查询符合条件的结果数量
Integer selectCountByQueryVo(QueryVo vo);
}
CustomerDao.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hytXwz.crm.dao.CustomerDao">
<!-- 根据条件返回结果集 -->
<select id="selectRowsByQueryVo" parameterType="QueryVo" resultType="Customer">
SELECT * FROM customer
<where>
<if test="custName != null and '' != custName">
cust_name LIKE "%"#{custName}"%"
</if>
<if test="custSource != null and '' != custSource">
and cust_source = #{custSource}
</if>
<if test="custIndustry != null and '' != custIndustry">
and cust_industry = #{custIndustry}
</if>
<if test="custLevel != null and '' != custLevel">
and cust_level = #{custLevel}
</if>
</where>
limit #{startRow}, #{size}
</select>
<!-- 根据条件返回结果数量
这里用count(1)和count(*)都行,没有什么区别
-->
<select id="selectCountByQueryVo" parameterType="QueryVo" resultType="Integer">
SELECT count(1) FROM customer
<where>
<if test="custName != null and '' != custName">
cust_name LIKE "%"#{custName}"%"
</if>
<if test="custSource != null and '' != custSource">
and cust_source = #{custSource}
</if>
<if test="custIndustry != null and '' != custIndustry">
and cust_industry = #{custIndustry}
</if>
<if test="custLevel != null and '' != custLevel">
and cust_level = #{custLevel}
</if>
</where>
</select>
</mapper>
3.service层 –将Dao从数据库中拿到的数据封装到page对象并且加入size和page(属性)
把每页现实的记录数放到properties文件中使用@value注解拿数据避免硬编码。这里我配置到applicationContext.xml文件中读取properties失败不知道为什么,所以用了@PropertiesResource标签。不过这样更加方便啦
package com.hytXwz.crm.service.impl;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import com.hytXwz.common.utils.Page;
import com.hytXwz.crm.dao.CustomerDao;
import com.hytXwz.crm.entity.Customer;
import com.hytXwz.crm.entity.QueryVo;
import com.hytXwz.crm.service.CustomerService;
@PropertySource("classpath:resource.properties")
@Service("customerService")
public class CustomerServiceImpl implements CustomerService {
@Value("${page.size}")
private String size;
@Resource(name="customerDao")
private CustomerDao customerDao;
@Override
public Page<Customer> selectPageByQueryVo(QueryVo vo) {
Page<Customer> page = new Page<>();
// page.setSize(5);
//在QueryVo不为空的前提条件下开始组装page对象
if(null != vo) {
//当前页显示的用户信息数size
vo.setSize(Integer.parseInt(size));
page.setSize(vo.getSize());
//当前页数page
if(null != vo.getPage()) {
page.setPage(vo.getPage());
vo.setStartRow((vo.getPage() - 1) * vo.getSize());
}
//分页后的结果集
//1.先对查询条件进行处理
if(null != vo.getCustName() && "".equals(vo.getCustName())) {
vo.setCustName(vo.getCustName().trim());
}
if(null != vo.getCustSource() && "".equals(vo.getCustSource())) {
vo.setCustSource(vo.getCustSource().trim());
}
if(null != vo.getCustIndustry() && "".equals(vo.getCustIndustry())) {
vo.setCustIndustry(vo.getCustIndustry().trim());
}
if(null != vo.getCustLevel() && "".equals(vo.getCustLevel())) {
vo.setCustLevel(vo.getCustLevel().trim());
}
//2.查询结果集
page.setRows(customerDao.selectRowsByQueryVo(vo));
//符合条件的结果总数
page.setTotal(customerDao.selectCountByQueryVo(vo));
}
return page;
}
}
4、controller层 – 将page对象相应给jsp,实现分页
在从数据库中拿option标签属性时同样用到了@value注解避免硬编码
package com.hytXwz.crm.controller;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.hytXwz.common.utils.Page;
import com.hytXwz.crm.entity.BaseDict;
import com.hytXwz.crm.entity.Customer;
import com.hytXwz.crm.entity.QueryVo;
import com.hytXwz.crm.service.BaseDictService;
import com.hytXwz.crm.service.CustomerService;
@Controller
public class CustomerController {
//从配置文件中获取的参数
@Value("${formType.code}")
private String formTypeCode;
@Value("${industryType.code}")
private String industryTypeCode;
@Value("${levelType.code}")
private String levelTypeCode;
//注入service依赖
@Resource(name="baseDictService")
private BaseDictService baseDictService;
@Resource(name="customerService")
private CustomerService customerService;
//加载页面
@RequestMapping("/customer/list")
public String selectOptions(QueryVo vo, Model model) {
//加载select标签中的option选项
// List<BaseDict> fromType = baseDictService.selectBaseDictByTypeCode("001");
// List<BaseDict> industryType = baseDictService.selectBaseDictByTypeCode("002");
// List<BaseDict> levelType = baseDictService.selectBaseDictByTypeCode("006");
//避免硬编码问题从出具库中读取typecode
List<BaseDict> fromType = baseDictService.selectBaseDictByTypeCode(formTypeCode);
List<BaseDict> industryType = baseDictService.selectBaseDictByTypeCode(industryTypeCode);
List<BaseDict> levelType = baseDictService.selectBaseDictByTypeCode(levelTypeCode);
model.addAttribute("fromType", fromType);
model.addAttribute("industryType", industryType);
model.addAttribute("levelType", levelType);
//加载客户信息 -- 只需要返回一个page对象即可
Page<Customer> page = customerService.selectPageByQueryVo(vo);
model.addAttribute("page", page);
return "customer";
}
}
这样分页效果就实现啦!
join with me:713788313