四、SSM整合

4.1、ContextLoaderListener

  • Spring提供了监听器ContextLoaderListener,实现ServletContextListener接口,可监听ServletContext的状态,
  • 在web服务器的启动,读取Spring的配置文件,创建Spring的IOC容器。web应用中必须在web.xml中配置
  • spring中的IOC容器无法访问springmvc的IOC容器,springmvc是子容器,可以访问spring的IOC容器(父容器)

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--    设置监听器-->
<listener>
<!-- 在服务启动时,加载spring的配置文件 获取ioc 容器-->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 由于 spring的配置文件默认在 WEB-INF下 ,但是我们习惯吧配置文件放在resources 目录,所有这里再重新配置一次-->
<context-param><!--自定义Spring配置文件的位置和名称-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
配置Spring的监听器,在服务器启动时加载Spring的配置文件
Spring配置文件默认位置和名称:/WEB-INF/applicationContext.xml
可通过上下文参数自定义Spring配置文件的位置和名称

4.2、准备工作

1>创建Maven Module

image-20220729183054463 image-20220729183122235 image-20220729183151598

2>添加web模块

image-20220729183210975 image-20220729183250762 image-20220729183451110

3>导入依赖

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<properties>
<spring.version>5.3.1</spring.version>
</properties>
<groupId>org.example</groupId>
<artifactId>demo08_SSM</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!--springmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--mybatis和spring的整合包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- Spring5和Thymeleaf整合包 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
</dependencies>

</project>

4>创建表

1
2
3
4
5
6
7
8
CREATE TABLE `t_emp` (
`emp_id` int(11) NOT NULL AUTO_INCREMENT,
`emp_name` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
PRIMARY KEY (`emp_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

用的之前的表image-20220729184501112

4.3、配置web.xml

清单:

  • 两个过滤器 :
    • CharacterEncodingFilter: 配置编码过滤器
    • HiddenHttpMethodFilter: 配置处理请求方式的过滤器
  • 一个前端控制器
    • DispatcherServlet
  • spring的监听器
    • 在服务器启动时来加载spring的配置文件 来获取IOC容器
  • 指定spring配置文件位置的标签
    • <context-param>标签
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?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>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param> <!--设置了这一项 ,才会处理响应的编码 ,上面的知识设置请求的编码-->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!--设置要过滤的请求 : /* 就是所有请求-->
</filter-mapping>


<!--配置处理请求方式的过滤器-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<!-- 配置mvc的前端控制器-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--设置springmvc配置文件自定义的位置和名称-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--将DispatcherServlet的初始化时间提前到服务器启动--->
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>


<!-- 配置spring的监听器 :在服务器启动时来加载spring的配置文件 来获取IOC容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 设置spring配置文件自定义的位置和名称-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
</web-app>

4.4、配置SpringMVC的配置文件

springMVC.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<!-- 扫描控制层组件-->
<context:component-scan base-package="pers.dhx_.controller"/>


<!-- 配置视图解析器 自己copy 即可-->
<!--配置视图解析器-->
<bean id="viewResolver"
class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>

<!-- 配置访问首页的视图控制 -->
<mvc:view-controller path="/" view-name="index"/>

<!-- 配置默认的servlet处理静态资源 -->
<mvc:default-servlet-handler />

<!-- 开启MVC的注解驱动 -->
<mvc:annotation-driven />

<!-- 配置文件上传解析器-->
<bean id="MultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
</beans>

4.5、搭建MyBatis环境

1>创建属性文件jdbc.properties

  • 最后将数据源交给spring管理
1
2
3
4
jdbc.user=root
jdbc.password=****
jdbc.url=jdbc:mysql://localhost:3306/***?serverTimezone=UTC
jdbc.driver=com.mysql.cj.jdbc.Driver

2>创建MyBatis的核心配置文件mybatis-config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>


<properties resource="jdbc.properties"/>
<!--引入properties 文件 ,就可以在当前文件中使用 mybatis-config 访问properties 中的value-->

<settings> <!--可以自动将下划线映射为驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

<typeAliases> <!--起别名 默认的别名就是类名,并且不区分大小写-->
<typeAlias type="pers.dhx_.pojo" alias="Emp"/>
<package name="pers.dhx_.mapper"/>
<!--通过包来设置类型别名,指定包下所有的类型都会拥有默认的别名,并且不区分大小写-->
</typeAliases>

<!--通过spring.xml配置文件,可以使用spring配置数据源, 上面的引用资源文件也可以 注释掉-->
<!-- &lt;!&ndash;设置连接数据库的环境&ndash;&gt;-->
<!-- <environments default="development">-->
<!-- <environment id="development">-->
<!-- <transactionManager type="JDBC"/>-->
<!-- <dataSource type="POOLED">-->
<!-- <property name="driver" value="${jdbc.driver}"/>-->
<!-- <property name="url" value="${jdbc.url}"/>-->
<!-- <property name="username" value="${jdbc.username}"/>-->
<!-- <property name="password" value="${jdbc.password}"/>-->
<!-- </dataSource>-->
<!-- </environment>-->
<!-- </environments>-->

<!--引入映射文件-->
<mappers>
<!--如果使用package,记得保持目录一致-->
<package name="pers.dhx_.mapper"/>
</mappers>
</configuration>

<!--
MyBatis核心配置文件中,标签的顺序:
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,
reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?
-->

3>创建Mapper接口和映射文件

1
2
3
4
5
6
7
8
9
10
/**
* @author Dhx_
* @className EmpMapper
* @description TODO
* @date 2022/7/29 18:46
*/
public interface EmpMapper {
List<Emp> getAllEmp();
}

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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="pers.dhx_.mapper.EmpMapper">


<!-- List<Emp> getAllEmp();-->
<select id="getAllEmp" resultType="Emp">
select *from t_emp;
</select>
</mapper>

4>创建日志文件log4j.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m(%F:%L)\n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>

4.6、配置Spring的配置文件

1>配置数据源

1
2
3
4
5
6
7
8
9
<!--引入jdbc.properties -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置数据源-->
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

2>在spring中配置SqlSessionFactoryBean

  • 配置SqlSessionFactoryBean:用来可以直接工程bean提供的对象,可以直接在spring的IOC中获取SqlSessionFactory对象

在service层中自动装配

1
2
3
4
5
@Service
public class EmpServiceImpl {
@Autowired
private SqlSessionFactory sqlSessionFactory;
}

配置bean

1
2
<!--配置SqlSessionFactoryBean:用来可以直接工程bean提供的对象,可以直接在spring的IOC中获取SqlSessionFactory对象-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean"/>
  • 这个bean 为我们提供SqlSession对象 ,之前的创建很麻烦
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test1() throws Exception{
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");

SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();

SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(is);

SqlSession sqlSession = sqlSessionFactory.openSession(true); // 将参数设置为true , 就是开启了自动提交

UserMapper mapper = sqlSession.getMapper(UserMapper.class);
System.out.println(mapper.insertUser());
sqlSession.close(); // 关闭会话
}

利用这个bean 的诸多属性,可以代替mybatis-config.xml

1
2
public class SqlSessionFactoryBean implements 
FactoryBean<SqlSessionFactory>,InitializingBean,ApplicationListener<ApplicationEvent> {}

3>配置mapper扫描

  • 把当前设置的包下面的所有的mapper接口通过上面的SqlSessionFactory所创建的SqlSession,通过这些SqlSession来创建设置的包下面所有接口的代理实现类对象,并且将这些对象交给IOC管理
    • 可以直接在service层自动装配对
1
2
3
4
5
<!--    配置mapper扫描-->
<!-- 象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="pers.dhx_.mapper"/>
</bean>

EmpService.java

1
2
3
4
5
6
7
8
9
@Service
public class EmpServiceImpl {
@Autowired
private SqlSessionFactory sqlSessionFactory;

@Autowired
private EmpMapper empMapper;
}

4>配置事务管理

  • @Transactional注解在代码执行出错的时候能够进行事务的回滚。
1
2
3
4
5
6
7
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"/>
</bean>

<!--开启事务注解驱动:将使用注解@Transactional标识的方法或类中的所有方法进行事务管理-->
<tx:annotation-driven/> <!--注意要使用tx命名空间中的driven-->
  • 开启事务注解驱动:将使用注解@Transactional标识的方法或类中的所有方法进行事务管理

5>完整配置文件

  • 使用spring替代了mybatis的配置文件的部分功能
    • 复杂的最好还是在mybatis的配置文件中写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

<!--扫描组件(除了controller 以外的包)-->
<context:component-scan base-package="pers.dhx_.service">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!--引入jdbc.properties -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置数据源-->
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"/>
</bean>

<!--开启事务注解驱动:将使用注解@Transactional标识的方法或类中的所有方法进行事务管理-->
<tx:annotation-driven/> <!--注意要使用tx命名空间中的driven-->

<!--配置SqlSessionFactoryBean:用来可以直接工程bean提供的对象,可以直接在spring的IOC中获取SqlSessionFactory对象-->
<!--public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {}-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 设置当前的mybatis核心配置文件的路径-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="dataSource" ref="datasource" /> <!--替代mybatis 引入数据源,可以交给spring管理-->
<property name="typeAliasesPackage" value="pers.dhx_.pojo"/> <!--设置起别名的包,替代mybatis 起别名,可以交给spring管理-->
<property name="configurationProperties" value=""/> <!--全局配置,下划线映射为驼峰-->
<!--设置映射文件的路径若映射文件所在路径和mapper接口所在路径一致,则不需要设置-->
<!--<property name="mapperLocations" value="classpath:mapper/*.xml"></property>-->
<!--配置分页插件-->
<!-- <property name="plugins">-->
<!-- <array>-->
<!-- <bean class="com.github.pagehelper.PageInterceptor"/>-->
<!-- </array>-->
<!-- </property>-->
</bean>

<!-- 配置mapper扫描-->
<!-- 吧当前设置的包下面的所有的mapper接口通过上面的SqlSessionFactory所创建的SqlSession,通过这些SqlSession来创建设置的包
下面所有接口的代理实现类对象,并且将这些对象交给IOC管理 :可以直接在service层自动装配吗撇儿对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="pers.dhx_.mapper"/>
</bean>


</beans>


4.7、功能测试

分页插件pagehelper

1
2
3
4
5
6
7
8
9
10
11
12
13
limit index,pageSize
pageSize:每页显示的条数
pageNum:当前页的页码
index:当前页的起始索引,index=(pageNum-1)*pageSize
count:总记录数
totalPage:总页数
totalPage = count / pageSize;
if(count % pageSize != 0){
totalPage += 1;
}
pageSize=4,pageNum=1,index=0 limit 0,4
pageSize=4,pageNum=3,index=8 limit 8,4
pageSize=4,pageNum=6,index=20 limit 8,4

使用步骤

1>添加依赖
1
2
3
4
5
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
2>配置分页插件

在MyBatis的核心配置文件中配置插件

1
2
3
4
<plugins>
<!--设置分页插件-->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

分页插件的使用

1>PageHelper.startPage(int pageNum, int pageSize)

pageNum:当前页的页码
pageSize:每页显示的条数

2>PageInfo<T> pageInfo = new PageInfo<>(List<T> list, int navigatePages)
  • 在查询获取list集合之后,使用

    PageInfo<T> pageInfo = new PageInfo<>(List<T> list, intnavigatePages)获取分页相关数据

list:分页之后的数据
navigatePages:导航分页的页码数

3>分页相关数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PageInfo{
pageNum=8, pageSize=4, size=2, startRow=29, endRow=30, total=30, pages=8,
list=Page{count=true, pageNum=8, pageSize=4, startRow=28, endRow=32, total=30,
pages=8, reasonable=false, pageSizeZero=false},
prePage=7, nextPage=0, isFirstPage=false, isLastPage=true, hasPreviousPage=true,
hasNextPage=false, navigatePages=5, navigateFirstPage4, navigateLastPage8,
navigatepageNums=[4, 5, 6, 7, 8]
}
pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页
hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
navigatepageNums:导航分页的页码,[1,2,3,4,5]

代码

controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package pers.dhx_.controller;

import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import pers.dhx_.pojo.Emp;
import pers.dhx_.service.EmpService;
import pers.dhx_.service.impl.EmpServiceImpl;

import java.util.Collection;
import java.util.List;
/**
* @author Dhx_
* @className EmpController
* @description TODO
* @date 2022/7/29 18:47
* * 查询所有员工 --》 /employee get
* * 跳转到添加页面 --》 /to/add get
* * 新增员工 --》 /employee post
* * 跳转到修改页面 --》 /employee/1 get
* * 修改员工信息 --》 /employee put
* * 删除员工 --》 /employee/1 delete
*/
@Controller
public class EmpController {
@Autowired
private EmpService empService;
@RequestMapping(value="/Emp" ,method = RequestMethod.GET)
public String getAllEmp(Model model){
List<Emp> list=empService.getAllEmp();
model.addAttribute("empList",list); // 将信息在请求域中共享
return "employee_list";
}
@RequestMapping(value="/Emp/page/{pageNum}" ,method = RequestMethod.GET)
public String getAllEmpByPage(Model model,@PathVariable("pageNum") Integer pageNum){
PageInfo<Emp> page= empService.getAllEmpByPage(pageNum); // 根据页码获取页面
model.addAttribute("page",page); // 将信息在请求域中共享
return "employee_list";
}
}

Mapper

  • EmpMapper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package pers.dhx_.mapper;

import org.apache.ibatis.annotations.Mapper;
import pers.dhx_.pojo.Emp;

import java.util.List;

/**
* @author Dhx_
* @className EmpMapper
* @description TODO
* @date 2022/7/29 18:46
*/
//@Mapper添加了@Mapper注解之后这个接口在编译时会生成相应的实现类
// *
// * 需要注意的是:这个接口中不可以定义同名的方法,因为会生成相同的id
// * 也就是说这个接口是不支持重载的
public interface EmpMapper {
/**
* 查询所有员工的信息
* @return
*/
List<Emp> getAllEmp();
}

pojo

  • Emp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package pers.dhx_.pojo;

/**
* @author Dhx_
* @className Emp
* @description TODO
* @date 2022/7/29 18:46
*/
public class Emp {
private Integer empId;
private String empName;
private String gender;
private Integer age;

public Emp() {
}

@Override
public String toString() {
return "Emp{" +
"empId=" + empId +
", empName='" + empName + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
", deptId=" + deptId +
'}';
}

public Emp(Integer empId, String empName, String gender, Integer age, Integer deptId) {
this.empId = empId;
this.empName = empName;
this.gender = gender;
this.age = age;
this.deptId = deptId;
}

private Integer deptId;

public Integer getEmpId() {
return empId;
}

public void setEmpId(Integer empId) {
this.empId = empId;
}

public String getEmpName() {
return empName;
}

public void setEmpName(String empName) {
this.empName = empName;
}

public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public Integer getDeptId() {
return deptId;
}

public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
}

service

  • EmpService
  • impl
    • EmpServiceImpl

EmpService

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package pers.dhx_.service;

import com.github.pagehelper.PageInfo;
import org.springfr amework.stereotype.Service;
import pers.dhx_.pojo.Emp;

import java.util.List;

/**
* @author Dhx_
* @className EmpService
* @description TODO
* @date 2022/7/29 19:19
*/
public interface EmpService {
PageInfo<Emp> getAllEmpByPage(Integer pageNum);
List<Emp> getAllEmp();
}

EmpServiceImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package pers.dhx_.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import pers.dhx_.mapper.EmpMapper;
import pers.dhx_.pojo.Emp;
import pers.dhx_.service.EmpService;

import java.util.List;

/**
* @author Dhx_
* @className EmpServiceImpl
* @description TODO
* @date 2022/7/29 19:19
*/
@Service
@Transactional // 执行出错后可以回滚
public class EmpServiceImpl implements EmpService {

@Autowired
private EmpMapper empMapper;

public PageInfo<Emp> getAllEmpByPage(Integer pageNum) {
PageHelper.startPage(pageNum, 4); // 开启分页功能
List<Emp> list = empMapper.getAllEmp(); // 查询所有员工信息
PageInfo<Emp> page = new PageInfo<>(list, 5); // 导航分页 ,下面显示几个页码
return page;
}
@Override
public List<Emp> getAllEmp() {
return empMapper.getAllEmp();
}
}

index.html

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" >
<title>Title</title>
</head>
<body>
<h1>首页</h1>
<a th:href="@{/Emp/page/1}">访问员工信息</a><br/>
</body>
</html>

employee_list.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Employee list</title>
</head>
<div id="dataTable">
<table border="1" cellpadding="0" cellspacing="0" style="text-align:center;">
<tr>
<th colspan="5">Employee Info</th>
</tr>
<tr>
<th>empId</th>
<th>empName</th>
<th>gender</th>
<th>age</th>

<th>options(<a th:href="@{/to/add}">add</a>)</th>
</tr>
<tr th:each="employee:${page.list}">
<td th:text="${employee.empId}"></td>
<td th:text="${employee.empName}"></td>
<td th:text="${employee.gender}"></td>
<td th:text="${employee.age}"></td>

</tr>
</table>
<div>
<a th:if="${page.hasPreviousPage}" th:href="@{/Emp/page/1}">首页</a>
<a th:if="${page.hasPreviousPage}" th:href="@{'/Emp/page'+${page.prePage}}">上一页</a>
<span th:each="nowPage:${page.navigatepageNums}"> <!--显示导航页页码-->
<a th:if="${page.pageNum==nowPage}" style="color: red" th:href="@{'/Emp/page/'+ ${nowPage}}" th:text="${'['+nowPage+']'}">下一页</a>
<a th:if="${page.pageNum!=nowPage}" style="color: blueviolet" th:href="@{'/Emp/page/'+ ${nowPage}}" th:text="${nowPage}">下一页</a>
</span>
<a th:if="${page.hasNextPage}" th:href="@{'/Emp/page/'+ ${page.nextPage}}">下一页</a>
<a th:if="${page.hasNextPage}" th:href="@{'/Emp/page/'+ ${page.pages}}">末页</a> <!--末页就是直接访问总页数-->
</div>
</div>
</body>
</html>

image-20220730133059063