以下都是我自己个人的一个完整思路解析,仅供参考!!!
第一步:创建数据库,表
(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)以上只是一个较简单的分页查询;