SpringData JPA实现CRUD,分页与多参数排序

  Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问计数,包括非关系数据库、Map-Reduce 框架、云数据服务等等,SpringData JPA是简化创建 JPA 数据访问层和跨存储的持久层功能,通过一个接口的继承即可实现简单的CRUD。

  数据库的连接与项目的构建不说了,可以参考:springboot实战SpringDataJPA。我采用的是eclipse构建的普通的springboot项目。

一、创建表与实体类映射

@Entity
@Table(name = "student")
public class Student implements Serializable {
	@Id
	// id自动生成
	@GeneratedValue
	@Column(name = "id")
	private Long id;
	@Column(name = "name")
	private String name;
	@Column(name = "clas")
	private String clas;

	@Column(name = "interest")
	private String interest;

    // 省略了getter(),setter()方法 

二、创建StudentMapper 继承JpaRepository<Student, Long>,第一个参数是实体,第二个参数是主键的类型

public interface StudentMapper extends JpaRepository<Student, Long> {
	// int queryCount();
	// 自定义的方法实现findAll
	@Query(value = "select * from student where id < ?1", nativeQuery = true)
	public List<Student> findAll(Long id);
}

三、Controller内的代码如下:

@Resource
	private FirstPageService firstPageService;

	@RequestMapping(value = "/", method = RequestMethod.GET)
	@Fooish(tags = { "this_is_method" })
	String home() {
		return firstPageService.getString();
	}

	@RequestMapping(value = "/add", method = RequestMethod.GET)
	String addStudent(Student student) {
		return firstPageService.addStudent(student);
	}

	@RequestMapping(value = "/delete", method = RequestMethod.GET)
	String deleteStudent(Long id) {
		return firstPageService.deleteStudent(id);
	}

	@RequestMapping(value = "/update", method = RequestMethod.GET)
	String updateStudent(Student student) {
		return firstPageService.updateStudent(student);
	}

	@RequestMapping(value = "/list", method = RequestMethod.GET)
	List<Student> listStudent() {
		return firstPageService.listStudent();
	}

	// 采用的是自定义的方法
	@RequestMapping(value = "/list2", method = RequestMethod.GET)
	List<Student> list2Student(Long id) {
		return firstPageService.nativeQuery(id);
	}

	// 分页查询
	@RequestMapping(value = "/pageRequest", method = RequestMethod.GET)
	List<Student> pageRequest() {

		return firstPageService.pageRequest();
	}

	// 分页与排序查询
	@RequestMapping(value = "/pageAndSortRequest", method = RequestMethod.GET)
	List<Student> pageAndSortRequest() {

		return firstPageService.pageAndSortRequest();
	}

四、服务层firstPageService代码如下:

@Resource
	private StudentMapper studentMapper;

	public String getString() {

		// return name;
		// int a = studentMapper.queryCount();
		// return a + "";
		return "Hellow World!";
	}

	public String addStudent(Student stu) {
		studentMapper.save(stu);
		return "添加成功";
	}

	public String deleteStudent(Long id) {
		studentMapper.delete(id);
		return "删除成功";
	}

	public String updateStudent(Student stu) {
		// 如果有就更新,没有就添加
		studentMapper.save(stu);
		return "更新成功";
	}

	public List<Student> listStudent() {

		return studentMapper.findAll();
	}

	public List<Student> nativeQuery(Long id) {
		return studentMapper.findAll(id);
	}
    // 分页查询
	public List<Student> pageRequest() {
		PageRequest pageRequest = new PageRequest(1, 3);
		Page<Student> stuPage = studentMapper.findAll(pageRequest);
		List<Student> stuList = stuPage.getContent();
		return stuList;
	}
    // 分页与排序
	public List<Student> pageAndSortRequest() {
		Sort sort1 = new Sort(Sort.Direction.DESC, "id");
		Sort sort2 = new Sort(Sort.Direction.ASC, "name");
		// 把两个排序的条件取取与
		Sort sort = sort1.and(sort2);
		PageRequest pageRequest = new PageRequest(1, 2, sort);
		Page<Student> stuPage = studentMapper.findAll(pageRequest);
		List<Student> stuList = stuPage.getContent();
		return stuList;
	}

  

通过源码的继承与实现关系可以看出,JpaRepository接口继承了PagingAndSortingRepository,QueryByExampleExecutor两个接口,PagingAndSortingRepository接口继承了CrudRepository。CrudRepository中包含了简单的数据库增,删,改,查,这四个操作还是比较简单的,下面主要介绍分页与排序;

下面的是PagingAndSortingRepository的源码:

public interface PagingAndSortingRepository extends CrudRepository {

	public abstract Iterable findAll(Sort sort);

	public abstract Page findAll(Pageable pageable);
}

这个接口提供了分页与排序的基本方法,想要实现分页查询,要实现Pageable接口,而PageRequest是该接口的一个实现类,该类的构造方法:

    // 单纯的分页
    public PageRequest(int page, int size) {
		this(page, size, null);
	}

	public transient PageRequest(int page, int size, Sort.Direction direction,
			String properties[]) {
		this(page, size, new Sort(direction, properties));
	}
      // 分页与排序,要实现Sort类
	public PageRequest(int page, int size, Sort sort) {
		super(page, size);
		this.sort = sort;
	}

 

五、按照id倒序,name顺序,查询第二页,每页显示两个的查询结果:

时间: 2024-08-03 19:43:01

SpringData JPA实现CRUD,分页与多参数排序的相关文章

SpringData JPA查询分页demo

SpringData JPA 的 PagingAndSortingRepository接口已经提供了对分页的支持,查询的时候我们只需要传入一个 org.springframework.data.domain.Pageable 接口的实现类,指定PageNumber和pageSize即可 springData包中的 PageRequest类已经实现了Pageable接口,我们可以直接使用下边是部分代码: DAO: package com.jiaoyiping.jdjy.sourcecode.dao

年末最代码部分源码大出血分享-freemarker,bootstrap,springdata jpa分页代码

原文:年末最代码部分源码大出血分享-freemarker,bootstrap,springdata jpa分页代码 源代码下载地址:http://www.zuidaima.com/share/1606851189656576.htm 项目截图: eclipse jee Deployment Assembly设置截图: eclipse java build path设置截图: eclipse java compile设置截图: eclipse jee project facets设置截图: ecl

SpringData JPA复合主键

上一篇博客简单介绍了SpringData JPA实现简单的CRUD,分页与多条件的排序,那里的主键类型是Long,有时我们会遇到主键不是一个的,复合主键,经过调研如下.确定一个人,不能只根据他的姓名来确定,因为会有重名,现在我们假设姓名.身份证号确定唯一一个人. 复合主键:一张表存在多个字段共同组成一个主键,这多个字段的组合不能重复,但是单独一个可以重复. 例子:姓名和省份证号共同组成了主键 一.Spring Data Jpa 复合主键 1.1.编写一个复合主键类:PeopleKey @Embe

Spring、SpringMVC、SpringData + JPA 整合详解

原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7759874.html ---------------------------------------------------------------------------------------------------------------------------------------------------------- 笔记中提供了大量的代码示例,需要说明的是,大部分代码示例都是本

Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例

前言:由于之前没有接触过Hibernate框架,但是最近看一些博客深深被它的"效率"所吸引,所以这就来跟大家一起就着一个简单的例子来尝尝Spring全家桶里自带的JPA的鲜 Spring-DATA-JPA 简介 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO

SpringData,JPA,MongoDB,Solr,Elasticsearch底层逻辑关系

一: Spring-data底层的接口路基: spring-data : PagingAndSortingRepository-> CrudRepository-> Repository ,它是springdatajpa,solr,mongoDB,Elasticsearch的核心基础. 有三个主要的接口: 1. Repository<T, ID> {}空接口 2.CrudRepository<T, ID>extends Repository<T, ID> 主

带你搭一个SpringBoot+SpringData JPA的环境

前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData JPA可以分分钟上手的.SpringBoot和SpringData JPA的好处我就不说了,当时我学习的时候也粗略做过笔记,有兴趣的同学可以去看看 SpringBoot就是这么简

Django分页和查询参数的问题

查询是通过get的方式,之前没有分页之前,url是这样的: http://hostname/search?query=port%3A8080 那么我的想法是如果分页了. 1,不带page参数了.next之后就加载下一页的内容 http://hostname/search?query=port%3A8080 请问这个是通过post传参吗? 2,使用官方文档中的(目前的方案) http://hostname/search?query=port%3A8080?page=2 但是,在现实情况下.?pag

oracle入门(8)——实战:支持可变参数、多种条件、多个参数排序、分页的存储过程查询组件

[本文介绍] 学了好几天,由于项目需要,忙活了两天,写出了个小组件,不过现在还只能支持单表操作.也没考虑算法上的优化,查询速度要比hibernate只快了一点点,可能是不涉及多表查询的缘故吧,多表的情况下才更快. 经非专业的测试,在有分页的情况下,在300万条数据里面查询的时间保持在0.1秒内.相同查询条件+分页的情况下,hibernate 用时0.3秒内. 不分页的条件下,查出来的数据越多,时间越长,时间长的话,跟hibernate相相比就没什么优势了. [思路] 我的思路是从java传来”字