SSH(Spring + Struts + Hibernate)框架带有注解的分页查询

以下都是我自己个人的一个完整思路解析,仅供参考!!!

第一步:创建数据库,表

  (1)创建第一张表 名为:t_air_quality

DROP TABLE IF EXISTS `t_air_quality`;
CREATE TABLE `t_air_quality` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记录编号',
  `district_id` int(11) DEFAULT NULL COMMENT '区域编号',
  `monitor_time` varchar(30) DEFAULT NULL COMMENT '监测时间',
  `pm10` int(10) DEFAULT NULL COMMENT 'pm10值',
  `pm2.5` int(10) DEFAULT NULL COMMENT 'pm2.5值',
  `monitoring_station` varchar(200) DEFAULT NULL COMMENT '监测站',
  `last_modify_time` varchar(30) DEFAULT NULL COMMENT '最后更改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;

  (2)创建第二张表 名为:t_district_info

DROP TABLE IF EXISTS `t_district_info`;
CREATE TABLE `t_district_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '区域编号',
  `name` varchar(30) DEFAULT NULL COMMENT '区域名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

 注:表中需要添加几条数据,便于查询,分页查询越多数据越好

第二步:使用idea工具搭建配置文件

(1)创建一个新项目

(2)需要添加web文件

(3)引入ssh整合的全部jar包

(4)配置文件(需要放在一个资源文件下面

        (4.1)web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>openSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
</web-app>

         (4.2)applicationContext.xml配置(以下是全部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
	http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop.xsd
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx.xsd">

	<context:component-scan base-package="com.ssh.crud.controller.action,com.ssh.crud.service.impl,com.ssh.crud.dao.impl"/>

	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
	</bean>

	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>

	<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>

        (4.3)hibernate.cfg.xml配置

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url"><![CDATA[jdbc:mysql://localhost:3306/move?useUnicode=true&characterEncoding=utf8]]></property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123456</property>
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>
		<mapping resource="orm.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

        (4.4)orm.hbm.xml配置

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.ssh.crud.entity.AirQuality" table="t_air_quality">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
        <property name="districtId" column="district_id"/>
        <property name="monitorTime" column="monitor_time"/>
        <property name="pm10" column="pm10"/>
        <property name="pm25" column="pm2.5"/>
        <property name="monitoringStation" column="monitoring_station"/>
        <property name="lastModifyTime" column="last_modify_time"/>
    </class>
    <class name="com.ssh.crud.entity.District" table="t_district_info">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
        <property name="name" column="name"/>
    </class>
</hibernate-mapping>

        (4.5)log4j.properties配置文件(可要可不要

(5)src文件下的Package分类

 (6)编写业务代码

        (6.1)Entity(实体类)

                (6.1.1)AirQuality(对应数据库里面的t_air_quality表

package com.ssh.crud.entity;

public class AirQuality {
    private int id;
    private int districtId;
    private String monitorTime;
    private int pm10;
    private int pm25;
    private String monitoringStation;
    private String lastModifyTime;
    private District district;

    public District getDistrict() {
        return district;
    }

    public void setDistrict(District district) {
        this.district = district;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getDistrictId() {
        return districtId;
    }

    public void setDistrictId(int districtId) {
        this.districtId = districtId;
    }

    public String getMonitorTime() {
        return monitorTime;
    }

    public void setMonitorTime(String monitorTime) {
        this.monitorTime = monitorTime;
    }

    public int getPm10() {
        return pm10;
    }

    public void setPm10(int pm10) {
        this.pm10 = pm10;
    }

    public int getPm25() {
        return pm25;
    }

    public void setPm25(int pm25) {
        this.pm25 = pm25;
    }

    public String getMonitoringStation() {
        return monitoringStation;
    }

    public void setMonitoringStation(String monitoringStation) {
        this.monitoringStation = monitoringStation;
    }

    public String getLastModifyTime() {
        return lastModifyTime;
    }

    public void setLastModifyTime(String lastModifyTime) {
        this.lastModifyTime = lastModifyTime;
    }
}

                (6.1.2)District(对应数据库里面的t_district_info表

package com.ssh.crud.entity;

public class District {
    private int id;
    private String name;

    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;
    }
}

                (6.1.3)PagingParam(给到前端的数据

package com.ssh.crud.entity.param;

public class PagingParam {
    private int indexPage = 1;      //当前页
    private int rows =5;           //当前行

    public int getIndexPage() {
        return indexPage;
    }

    public void setIndexPage(int indexPage) {
        this.indexPage = indexPage;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }
}

                (6.1.4)PagingVo(前端给我们的数据

package com.ssh.crud.entity.vo;

import java.util.List;

public class PagingVo {

    public PagingVo(int pageCount, int rows, int indexPage, List list){
        this.pageCount = pageCount;
        this.rows = rows;
        this.indexPage = indexPage;
        this.list = list;
    }

    public PagingVo(){

    }

    private int pageCount;      //总页数
    private int rows;           //总行数
    private int indexPage;      //当前页数
    private List list;          //全部数据

    public int getPageCount() {
        return pageCount;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public int getIndexPage() {
        return indexPage;
    }

    public void setIndexPage(int indexPage) {
        this.indexPage = indexPage;
    }

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }
}

        (6.2)Controller(控制层)

package com.ssh.crud.controller.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.ssh.crud.entity.param.PagingParam;
import com.ssh.crud.entity.vo.PagingVo;
import com.ssh.crud.service.PagingService;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
@Namespace("/")
@ParentPackage("struts-default")
public class PagingController extends ActionSupport implements ModelDriven<PagingParam> {

    private PagingParam pagingParam = new PagingParam();

    private PagingVo pagingVo;

    public PagingVo getPagingVo() {
        return pagingVo;
    }

    @Autowired
    private PagingService pagingService;

    @Action(value = "paging",results = @Result(name = "success",location = "/index.jsp"))
    public String paging(){
        pagingVo = pagingService.paging(pagingParam);
        return SUCCESS;
    }

    @Override
    public PagingParam getModel() {
        return pagingParam;
    }
}

        分析:(1)以上使用的是注解的方式编写的,需要导入一个注解的包,不然会报错;

                   (2)使用的是模型驱动,也可以根据自己喜欢的方式来;     

(6.3)Service(业务层)

                (6.3.1)接口

package com.ssh.crud.service;

import com.ssh.crud.entity.param.PagingParam;
import com.ssh.crud.entity.vo.PagingVo;

public interface PagingService {
    PagingVo paging(PagingParam pagingParam);
}

                (6.3.2)实现类

package com.ssh.crud.service.impl;

import com.ssh.crud.dao.PagingDao;
import com.ssh.crud.entity.AirQuality;
import com.ssh.crud.entity.param.PagingParam;
import com.ssh.crud.entity.vo.PagingVo;
import com.ssh.crud.service.PagingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class PagingServiceImpl implements PagingService {

    @Autowired
    private PagingDao pagingDao;

    @Override
    public PagingVo paging(PagingParam pagingParam) {
        //1、先查询总行数(第一个优点:获取到总欧诺个多少页 第二个优点:获取到是否有数据,没有的话就没有必要执行后面的操作)
        int count = pagingDao.count(pagingParam);
        //判断总行数是否==0
        if (count == 0){
            return new PagingVo(1,count,pagingParam.getIndexPage(),null);
        }
        //2、根据总行数获取到总页数
        int pageCount = count%pagingParam.getRows() == 0 ? count/pagingParam.getRows() : count/pagingParam.getRows()+1;
        //3、获取到起始行数 = (等于当前页数-1)*每页行数
        int startIndex = (pagingParam.getIndexPage()-1)*pagingParam.getRows();
        //4、根据起始行数和查询多少行去查询到数据列表
        List<AirQuality> airQualityList = pagingDao.paging(pagingParam,startIndex);
        //5、封装数据,返回给到controller
        return new PagingVo(pageCount,count,pagingParam.getIndexPage(),airQualityList);
    }
}

(6.4)Dao(与数据库交互)

        (6.4.1)接口

package com.ssh.crud.dao;

import com.ssh.crud.entity.AirQuality;
import com.ssh.crud.entity.param.PagingParam;

import java.util.List;

public interface PagingDao {
    int count(PagingParam pagingParam);

    List<AirQuality> paging(PagingParam pagingParam, int startIndex);
}

            (6.4.2)实现类

package com.ssh.crud.dao.impl;

import com.ssh.crud.dao.PagingDao;
import com.ssh.crud.entity.AirQuality;
import com.ssh.crud.entity.District;
import com.ssh.crud.entity.param.PagingParam;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class PagingDaoImpl implements PagingDao {
    @Autowired
    private SessionFactory sessionFactory;
    @Autowired
    private HibernateTemplate hibernateTemplate;

    @Override
    public int count(PagingParam pagingParam) {
        StringBuffer stringBuffer = new StringBuffer("select count(0) from t_air_quality");

        Session currentSession = sessionFactory.getCurrentSession();
        SQLQuery sqlQuery = currentSession.createSQLQuery(stringBuffer.toString());
        Object object = sqlQuery.uniqueResult();
        if (object == null){
            return 0;
        }

        return Integer.valueOf(String.valueOf(object));
    }

    @Override
    public List<AirQuality> paging(PagingParam pagingParam, int startIndex) {
        StringBuffer stringBuffer = new StringBuffer("select id,district_id,monitor_time,pm10,`pm2.5`,monitoring_station,last_modify_time from t_air_quality where 1=1");
        //(limit 查询起始行数,查询每页多少行)
        stringBuffer.append(" limit "+startIndex+","+pagingParam.getRows());

        Session currentSession = sessionFactory.getCurrentSession();
        SQLQuery sqlQuery = currentSession.createSQLQuery(stringBuffer.toString());
        sqlQuery.addEntity(AirQuality.class);
        List list = sqlQuery.list();
        for (int i=0;i<list.size();i++){
            AirQuality airQuality = (AirQuality)list.get(i);
            int districtId = airQuality.getDistrictId();
            District district = hibernateTemplate.get(District.class, districtId);
            airQuality.setDistrict(district);
        }
        return list;
    }
}

(6.5)index.jsp(前端的分页展示)

<a onclick="last(<s:property value="pagingVo.indexPage"/>)">上一页</a>
第<input style="width: 20px;" value="<s:property value="pagingVo.indexPage"/>">页
<a onclick="next(<s:property value="pagingVo.indexPage"/>,<s:property value="pagingVo.pageCount"/>)">下一页</a>
<b style="color: red">总共<s:property value="pagingVo.pageCount"/>页</b>

         注释:分页按钮一般都是在table标签下面,body标签上面即可

(6.6)jquery,js代码

<script src="https://apps.bdimg.com/libs/jquery/2.1.1/jquery.js"></script>
  <script src="https://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>

  <script type="text/javascript">
    function last(id){
      if (id == "1"){
        alert("客官,无法满足你当前的操作哦:当前页已经是第一页了。。。");
      }else{
        id--;
        window.location.href = "${pageContext.request.contextPath}/paging?indexPage="+id+"&rows=5"
      }
    }

    function next(id,count){
      if (id == count){
        alert("客官,无法满足你当前的操作哦:当前页已是最后一页。。。");
      }else{
        id++;
        window.location.href = "${pageContext.request.contextPath}/paging?indexPage="+id+"&row=5";
      }
    }
  </script>

第三步:运行结果:

        分析:(1)不符合条件则会弹窗提示;

                   (2)数据是随便新增进去的;

                   (3)有些地方没注释,要是不理解可以评论或私信;

                   (4)以上只是一个较简单的分页查询;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值