让我来详细讲解一下“springmvc4+hibernate4分页查询功能实现”的完整攻略。
1. 前言
在开发Web应用过程中,分页查询功能是经常会用到的一项功能。SpringMVC和Hibernate是当前较为流行的Web开发框架,结合起来使用可以实现很好的分页功能。下面,我们将详细说明如何使用SpringMVC和Hibernate实现分页查询功能。
2. 准备工作
首先,我们需要准备好以下工具和环境:
- JDK1.8或以上
- SpringMVC4.x
- Hibernate4.x
- MySQL数据库
- Maven
3. 实现步骤
接下来,我们就开始实现分页查询功能。
3.1 创建数据库表
首先,我们需要创建一个名为“blog”的数据库,并在其中创建一张名为“t_article”的文章表,用于存储文章相关信息,如下所示:
create table t_article (
id bigint unsigned not null auto_increment comment '文章ID',
title varchar(128) not null comment '文章标题',
content text not null comment '文章内容',
created_time datetime not null default current_timestamp comment '创建时间',
primary key (id)
) engine=innodb default charset=utf8mb4 collate=utf8mb4_unicode_ci comment '文章表';
3.2 配置pom.xml
我们需要在pom.xml中添加如下配置,以引入相应的SpringMVC和Hibernate依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.11.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
3.3 配置Web.xml
我们需要在Web.xml中添加如下配置,以启用SpringMVC的DispatcherServlet:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.4 配置springmvc-servlet.xml
我们需要在springmvc-servlet.xml中添加如下配置,以启用SpringMVC的注解和Controller:
<mvc:annotation-driven/>
<context:component-scan base-package="com.example.blog.controller"/>
3.5 配置hibernate.cfg.xml
我们需要在hibernate.cfg.xml中添加如下配置,以指定数据库连接信息和Hibernate相关配置:
<hibernate-configuration>
<session-factory>
<!-- 数据库连接信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/blog?useSSL=false&characterEncoding=utf-8&serverTimezone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- Hibernate配置 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 映射文件 -->
<mapping class="com.example.blog.entity.Article"/>
</session-factory>
</hibernate-configuration>
3.6 创建Article实体类
我们需要创建Article实体类,用于映射t_article表中的数据:
@Entity
@Table(name = "t_article")
public class Article implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(name = "title")
private String title;
@NotNull
@Lob
@Column(name = "content")
private String content;
@NotNull
@Column(name = "created_time")
private LocalDateTime createdTime;
// getter、setter、toString等方法略去
}
3.7 创建ArticleDao类
我们需要创建ArticleDao类,用于进行文章的查询和分页处理:
@Repository
public class ArticleDao {
@Autowired
private SessionFactory sessionFactory;
/**
* 获取文章列表
*
* @param offset 起始位置
* @param limit 每页数量
* @return List<Article> 文章列表
*/
public List<Article> getArticleList(int offset, int limit) {
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("from Article order by createdTime desc");
query.setFirstResult(offset);
query.setMaxResults(limit);
return query.list();
}
/**
* 获取文章总数
*
* @return int 文章总数
*/
public int getArticleCount() {
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("select count(*) from Article");
return ((Number) query.uniqueResult()).intValue();
}
}
3.8 实现分页查询功能
最后,我们在Controller中实现分页查询功能:
@Controller
public class ArticleController {
@Autowired
private ArticleDao articleDao;
/**
* 显示文章列表
*
* @param pageNumber 页码
* @param model 数据模型
* @return String 视图名称
*/
@RequestMapping(value = "/article", method = RequestMethod.GET)
public String showArticleList(@RequestParam(defaultValue = "1") int pageNumber, Model model) {
// 每页显示的数量
int pageSize = 10;
// 获取文章总数
int totalCount = articleDao.getArticleCount();
// 计算总页数
int totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
// 计算起始位置
int offset = (pageNumber - 1) * pageSize;
// 获取文章列表
List<Article> articleList = articleDao.getArticleList(offset, pageSize);
// 使用数据模型传递数据到视图
model.addAttribute("articleList", articleList);
model.addAttribute("pageNumber", pageNumber);
model.addAttribute("pageSize", pageSize);
model.addAttribute("totalCount", totalCount);
model.addAttribute("totalPage", totalPage);
// 返回视图名称
return "articleList";
}
}
在上述代码中,使用@RequestParam注解获取传递的页码参数,默认页码为1;先调用ArticleDao的getArticleCount方法获取文章总数,再根据每页数量pageSize计算总页数totalPage和起始位置offset;最后调用ArticleDao的getArticleList方法获取文章列表,并使用数据模型将相关数据传递到视图中。
至此,我们成功实现了使用SpringMVC和Hibernate实现分页查询功能。
4. 示例说明
这里提供两个使用示例,以便更好地理解和使用分页查询功能。
4.1 分页查询获取文章列表
假设我们的网站需要显示最新发布的文章列表,并且需要支持分页查询。此时,我们就可以编写如下代码:
@Controller
public class ArticleController {
@Autowired
private ArticleDao articleDao;
/**
* 显示文章列表
*
* @param pageNumber 页码
* @param model 数据模型
* @return String 视图名称
*/
@RequestMapping(value = "/article", method = RequestMethod.GET)
public String showArticleList(@RequestParam(defaultValue = "1") int pageNumber, Model model) {
// 每页显示的数量
int pageSize = 10;
// 获取文章总数
int totalCount = articleDao.getArticleCount();
// 计算总页数
int totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
// 计算起始位置
int offset = (pageNumber - 1) * pageSize;
// 获取文章列表
List<Article> articleList = articleDao.getArticleList(offset, pageSize);
// 使用数据模型传递数据到视图
model.addAttribute("articleList", articleList);
model.addAttribute("pageNumber", pageNumber);
model.addAttribute("pageSize", pageSize);
model.addAttribute("totalCount", totalCount);
model.addAttribute("totalPage", totalPage);
// 返回视图名称
return "articleList";
}
}
这里,我们使用/showArticleList路径来处理分页请求,使用@RequestParam注解获取传递的页码参数,默认为1;调用ArticleDao的getArticleCount方法获取文章总数,再根据每页数量pageSize计算总页数totalPage和起始位置offset;最后调用ArticleDao的getArticleList方法获取文章列表,并使用数据模型将相关数据传递到视图中。
4.2 分页查询获取用户列表
假设我们的网站需要显示用户列表,并支持分页查询。此时,我们可以编写如下代码:
@Controller
public class UserController {
@Autowired
private UserDao userDao;
/**
* 显示用户列表
*
* @param pageNumber 页码
* @param model 数据模型
* @return String 视图名称
*/
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String showUserList(@RequestParam(defaultValue = "1") int pageNumber, Model model) {
// 每页显示的数量
int pageSize = 10;
// 获取用户总数
int totalCount = userDao.getUserCount();
// 计算总页数
int totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
// 计算起始位置
int offset = (pageNumber - 1) * pageSize;
// 获取用户列表
List<User> userList = userDao.getUserList(offset, pageSize);
// 使用数据模型传递数据到视图
model.addAttribute("userList", userList);
model.addAttribute("pageNumber", pageNumber);
model.addAttribute("pageSize", pageSize);
model.addAttribute("totalCount", totalCount);
model.addAttribute("totalPage", totalPage);
// 返回视图名称
return "userList";
}
}
在这个示例中,使用/showUserList路径来处理分页请求,使用@RequestParam注解获取传递的页码参数,默认为1;调用UserDao的getUserCount方法获取用户总数,再根据每页数量pageSize计算总页数totalPage和起始位置offset;最后调用UserDao的getUserList方法获取用户列表,并使用数据模型将相关数据传递到视图中。
5. 结语
本文详细介绍了如何使用SpringMVC和Hibernate实现分页查询功能,并提供了两个使用示例。希望能够对大家更好地理解和应用分页查询功能有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc4+hibernate4分页查询功能实现 - Python技术站