写在前面:从2018年底开始学习SpringBoot,也用SpringBoot写过一些项目。现在对学习Springboot的一些知识总结记录一下。如果你也在学习SpringBoot,可以关注我,一起学习,一起进步。相关文章:初识Spring-Data-Jpa
相关文章:
【Springboot系列】Springboot入门到项目实战
目录
上一篇讲了Spring-Data-Jpa入门,这一篇来看一下Spring-Data-Jpa数据的分页展示(基于上一篇Spring-Data-Jpa入门的项目中写的,配置文件没有任何改动,详情可以参考Spring-Data-Jpa入门)。
编写代码
1、创建持久化类
在entity包中创建一个持久化类Article.java,代码如下
//用于标记持久化类,SpringBoot项目加载后会自动根据持久化类建表
@Entity
//设置表名为tb_article
@Table(name="tb_article")
public class Article {
/**
* 使用@id指定主键。使用代码@GeneratedValue(strategy = GenerationType.IDENTITY)
* 指定主键的生存策略,mysql默认为自动增长
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id; //主键
private String title; //名称
private String supplier; //作者
private Double price; //单价
private String locality; //出版社
private int storage; //库存
private String image; //商品图片
private String description; //商品描述
private Date createDate; //出版时间
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSupplier() {
return supplier;
}
public void setSupplier(String supplier) {
this.supplier = supplier;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getLocality() {
return locality;
}
public void setLocality(String locality) {
this.locality = locality;
}
public int getStorage() {
return storage;
}
public void setStorage(int storage) {
this.storage = storage;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
2、定义数据访问层接口
在repository包下新建一个接口,命名为ArticleRepository,让该接口继承PagingAndSortingRepository继承,以持久化对象Article作为PagingAndSortingRepository的第一类型参数,表示当前所操作的持久化对象类型,Integer作为PagingAndSortingRepository的第二个类型参数,用于指定ID类型,完整代码如下
import com.mcy.springdatajpa.entity.Article;
import org.springframework.data.repository.PagingAndSortingRepository;
public interface ArticleRepository extends PagingAndSortingRepository<Article, Integer> {
}
PagingAndSortingRepository提供了查询所有和分页查询的方法,PagingAndSortingRepository接口的源码如下
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort var1); //查询所有,排序
Page<T> findAll(Pageable var1); //分页查询
}
在SpringBoot项目中,数据访问层无须提供实现,直接继承数据访问接口即可。
3、定义业务层类
ArticleService .java代码如下(有findAllSort排序查询所有,findAll分页查询两个方法)
import com.mcy.springdatajpa.entity.Article;
import com.mcy.springdatajpa.repository.ArticleRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class ArticleService {
//数据访问层接口对象
@Resource
private ArticleRepository articleRepository;
//排序查询所有
public Iterable<Article> findAllSort(Sort sort){
return articleRepository.findAll(sort);
}
//分页查询所有
public Page<Article> findAll(Pageable page){
return articleRepository.findAll(page);
}
}
在业务层中需要注入数据访问层对象,在上述代码中通过@Resource注解将ArticleRepository接口对应的实现类注入进来的。
4、定义控制器
ArticleController.java代码如下(有sortArticle排序查询所有,sortPagerArticle分页排序查询两个方法)
import com.mcy.springdatajpa.entity.Article;
import com.mcy.springdatajpa.service.ArticleService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/article")
public class ArticleController {
//注入ArticleServer
@Resource
private ArticleService articleService;
//排序查询
@RequestMapping("/sort")
public Iterable<Article> sortArticle(){
//指定培训参数对象:根据id,进行降序查询
Sort sort = Sort.by(Sort.Direction.DESC, "id");
Iterable<Article> articleDatas = articleService.findAllSort(sort);
return articleDatas;
}
//分页排序查询
@RequestMapping("/pager")
public List<Article> sortPagerArticle(int pageIndex){
//指定排序参数对象:根据id,进行降序查询
Sort sort = Sort.by(Sort.Direction.DESC, "id");
/**
* 封装分页实体
* 参数1:pageIndex表示当前查询的是第几页(默认从0开始,0表示第一页)
* 参数2:表示每页展示多少数据,现在设置每页展示2条数据
* 参数3:封装排序对象,根据该对象的参数指定根据id降序查询
*/
Pageable page = PageRequest.of(pageIndex - 1, 2, sort);
//分页查询
Page<Article> articleDatas = articleService.findAll(page);
System.out.println("查询总页数:"+articleDatas.getTotalPages());
System.out.println("查询总记录数:"+articleDatas.getTotalElements());
System.out.println("查询当前第几页:"+articleDatas.getNumber()+1);
System.out.println("查询当前页面的记录数:"+articleDatas.getNumberOfElements());
//查询出的结果数据集合
List<Article> articles = articleDatas.getContent();
System.out.println("查询当前页面的集合:"+articles);
return articles;
}
}
测试应用
1、测试应用
启动MySQL数据库,在数据库中创建名为jpa的数据库。springboot项目启动后,JPA会在数据库中自动创建持久化类对应的tb_article表。
之后在表中添加一下数据,用于测试。
数据添加后,打开浏览器,输入http://localhost:8080/article/sort访问,请求会提交到ArticleController类中的方法sortArticle方法进行处理,该方法执行培训查询,将tb_article表中的数据以降序的方式查询出来并以JSON格式返回浏览器,如图。
测试分页查询第一页商品数据,在浏览器中输入http://localhost:8080/article/pager?pageIndex=1地址,请求会提交到ArticleController类的sortPagerArticle方法进行处理,该方法接收pageIndex参数,根据该参数确定查询第几页数据,查询到第1页数据如图。
查询第二页数据http://localhost:8080/article/pager?pageIndex=2
分页查询,控制台对应输出: