来讲解一下“Spring MVC+MyBatis+MySQL实现分页功能实例”的完整攻略。
首先,我们需要简单了解一下Spring MVC、MyBatis和MySQL分页功能的基本使用。
Spring MVC
Spring MVC 是 Spring 框架的一个模块,用于开发 Web 应用程序。它是一个基于 MVC 设计模式的框架,提供了一个 Model-View-Controller 架构,可以帮助开发者更好地组织和管理代码。Spring MVC 中的核心组件包括:DispatcherServlet、Controller、ModelAndView 等。其中,DispatcherServlet 是 Spring MVC 的前置处理器,用于接收客户端请求并分发到对应的 Controller 进行处理;Controller 负责处理请求,并根据需要调用 Service 层和 Dao 层中的代码,最终生成响应结果;ModelAndView 用于封装处理结果,包括视图名称和模型对象等。
MyBatis
MyBatis 是一款支持 Java 和 .NET 开发语言的持久层框架,它封装了 JDBC 操作,可以自动完成一系列操作,包括:连接数据库、创建 SQL 语句、执行 SQL 语句、映射结果集和参数,以及管理事务等。MyBatis 中的核心组件包括:SqlSessionFactory、SqlSession、Mapper 等。其中,SqlSessionFactory 是 MyBatis 的核心接口,用于创建 SqlSession;SqlSession 是与数据库交互的主要对象,提供了一系列对数据库的操作方法;Mapper 是使用注解或 XML 配置文件定义 SQL 语句的接口或抽象类。
MySQL分页功能
MySQL 分页功能可以通过 LIMIT 关键字实现,语法格式为:LIMIT offset, length,其中,offset 表示从哪一行开始查询,length 表示查询多少行。具体实现时,需要根据当前页码和每页显示的条数计算 offset 和 length 的值,然后将其拼接到 SQL 语句中进行查询。
以上是 Spring MVC、MyBatis 和 MySQL 分页功能的基本介绍。接下来,让我们来实现一个基于 Spring MVC、MyBatis 和 MySQL 实现分页功能的示例。
实现步骤
第一步:创建 Maven 项目
在 Eclipse 中创建 Maven 项目。在 pom.xml 文件中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
第二步:配置 Spring MVC
在 src/main/resources 目录下创建 springmvc-servlet.xml 文件,并添加以下内容:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<mvc:resources mapping="/static/**" location="/static/" />
</beans>
其中,
第三步:配置 MyBatis
在 src/main/resources 目录下创建 mybatis-config.xml 文件,并添加以下内容:
<configuration>
<typeAliases>
<!-- 配置别名 -->
<!--<typeAlias type="包名.entity类名" alias="别名"/>-->
</typeAliases>
<mappers>
<!-- 配置 Mapper 文件 -->
<!--<mapper resource="包名/dao层Java文件.xml"/>-->
</mappers>
</configuration>
在 pom.xml 文件中添加以下 MyBatis 插件:
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>compile</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<configurationFile>
${basedir}/src/main/resources/mybatis-generator.xml
</configurationFile>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
在 src/main/resources 目录下创建 mybatis-generator.xml 文件,并添加以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="MySQLTables" targetRuntime="MyBatis3Simple">
<!-- 数据库连接信息 -->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/dbname"
userId="root"
password="root">
</jdbcConnection>
<!-- 对应的 schema -->
<schema fileName="schema">
dbname
</schema>
<!-- 生成 Model 对象 -->
<javaModelGenerator targetPackage="包名.entity类名" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成 SQL 语句对应的 Mapper 接口 -->
<sqlMapGenerator targetPackage="包名.dao层Java文件" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成 Mapper 映射文件 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="包名.dao层Java文件" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 配置表 -->
<table tableName="表名">
<property name="useActualColumnNames" value="true"/>
</table>
</context>
</generatorConfiguration>
其中,需要将 dbname、包名、entity类名、dao层Java文件、表名等信息根据实际情况进行修改。执行 Maven 命令 mvn mybatis-generator:generate,即可在对应的包名下生成实体类和 Mapper 接口。
第四步:实现分页功能
在 Controller 中添加分页查询的方法:
@RequestMapping("/list")
public ModelAndView list(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size) {
ModelAndView modelAndView = new ModelAndView("list");
// 计算分页信息
int offset = (page - 1) * size;
// 执行查询,并设置分页信息
List<Entity> entities = dao.list(offset, size);
int total = dao.count();
int maxPage = (total + size - 1) / size;
modelAndView.addObject("entities", entities);
modelAndView.addObject("page", page);
modelAndView.addObject("size", size);
modelAndView.addObject("total", total);
modelAndView.addObject("maxPage", maxPage);
return modelAndView;
}
其中,@RequestParam 注解用于接收请求参数,defaultValue 表示默认值,@RequestMapping 注解用于指定请求路径,"list" 表示请求的路径为 /list。
在 Dao 层中添加分页查询和统计记录总数的方法:
List<Entity> list(@Param("offset") int offset, @Param("size") int size);
int count();
在对应的 Mapper 文件中编写查询语句:
<select id="list" resultType="包名.entity类名.Entity">
select *
from 表名
limit #{offset}, #{size}
</select>
<select id="count" resultType="int">
select count(*)
from 表名
</select>
其中,#{offset} 和 #{size} 表示 MyBatis 的动态占位符,用于接收传入的 offset 和 size 变量,从而实现动态分页查询。
最后,创建视图文件 list.jsp,用于显示分页结果:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>分页列表</title>
</head>
<body>
<h1>分页列表</h1>
<table>
<tr>
<th>ID</th>
<th>名称</th>
<th>创建时间</th>
<th>更新时间</th>
</tr>
<c:forEach items="${entities}" var="entity">
<tr>
<td>${entity.id}</td>
<td>${entity.name}</td>
<td>${entity.createTime}</td>
<td>${entity.updateTime}</td>
</tr>
</c:forEach>
</table>
<br>
<p>共 ${total} 条记录,${maxPage} 页</p>
<hr>
<p>
<a href="?page=1&size=${size}">首页</a>
<a href="?page=${page-1}&size=${size}">上一页</a>
<a href="?page=${page+1}&size=${size}">下一页</a>
<a href="?page=${maxPage}&size=${size}">末页</a>
</p>
<hr>
<form action="${pageContext.request.contextPath}/list" method="get">
<input type="text" name="page" value="${page}" size="2">/
<c:choose>
<c:when test="${maxPage gt 0}">
<c:out value="${maxPage}" />
</c:when>
<c:otherwise>
1
</c:otherwise>
</c:choose>
<input type="submit" value="跳转">
<input type="text" name="size" value="${size}" size="2">
</form>
</body>
</html>
其中,