您现在的位置是:首页 > java技术交流java技术交流
Spring Data JPA数据操作总结. findById getOne findOne save delete 等
上善若水2021-01-27 17:19:05【java技术交流】 5132人已围观
简介mybatis和SpringDataJPA基本上就是主要的数据库持久层的框架,本篇自己使用jpa的基本增删改查的方式帮助大家快速上手SpringDataJPA.本篇使用的springboot版
mybatis和Spring Data JPA基本上就是主要的数据库持久层的框架,本篇自己使用jpa的基本增删改查的方式帮助大家快速上手Spring Data JPA.
本篇使用的springboot版本为2.4.1 所依赖的jpa版本也是2.4.1不同版本会有些许差别.
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.4.1</version>
1. 实体于和repository
实体要使用包装类型
package com.fierykylin.jpa.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
@Entity
@Data
@Table(name = "article")
@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
public class Article implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)//自增
private Integer id;
private Integer categoryId;
private String cover;
private String title;
private String introduction;
private String contentMarkdown;
private String content;
private Boolean top;
private Boolean recommend;
private Boolean hot;
private Integer browse;
private Integer up;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}
repository
package com.fierykylin.jpa.repository;
import com.fierykylin.jpa.entity.Article;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ArticleRepository extends JpaRepository<Article, Integer> {
}
2.方法基本使用
1.findById
通过id查找,没查询到就返回null
@Test
@Transactional
public void testFindById(){
Article one = articleRepository.findById(500).orElse(null);
}
2.getOne
通过id查找 采用懒加载 使用时才真正去查库.若id为查询到会异EntityNotFoundException
.
@Test
@Transactional
public void testGetOne(){
Article one = articleRepository.getOne(500);
String title = one.getTitle();
}
id为不存在报异常
javax.persistence.EntityNotFoundException: Unable to find com.fierykylin.jpa.entity.Article with id 500
3.findOne
所查询的结果必须是只包含一条结果,否则会报如下异常
org.springframework.dao.IncorrectResultSizeDataAccessException: query did not return a unique result: 2
查询标题包含故事 并且热门的文章!
@Test
@Transactional
public void testFindOne(){
Article article = new Article();
article.setHot(true);
article.setTitle("故事");
Example<Article> example = Example.of(article, ExampleMatcher.matching().withMatcher("title", ExampleMatcher.GenericPropertyMatcher::contains));
Article one = articleRepository.findOne(example).orElse(null);
}
4.findAllById
通过id查询多个 若未查询到则返回空集合
@Test
@Transactional
public void testFindAllById(){
List<Article> articles = articleRepository.findAllById(Arrays.asList(1,2,3));
}
5.findAllById
通过id查询多个 若未查询到则返回空集合
查询热门并且根据top升序id倒序查询
@Test
@Transactional
public void testFindAll(){
Article article = new Article();
article.setHot(true);
Example<Article> example = Example.of(article);
Sort sort = Sort.by(Sort.Order.asc("top"), Sort.Order.desc("id"));
List<Article> articles = articleRepository.findAll(example,sort);
YGDumper.tree(articles);
}
简单分页使用
@Test
@Transactional
public void testFindAll(){
Article article = new Article();
Example<Article> example = Example.of(article);
Sort sort = Sort.by(Sort.Order.asc("top"), Sort.Order.desc("id"));
PageRequest pageRequest = PageRequest.of(0, 2,sort);
Page<Article> articles = articleRepository.findAll(example,pageRequest);
YGDumper.tree(articles);
}
6.save
保存 需要配置主键自增策略 @Transactional注解要去掉不然会回滚数据添加失败!
@Test
public void testSave(){
Article article = new Article();
article.setTitle("测试添加");
Article save = articleRepository.save(article);
YGDumper.tree(save);
}
7.delete
删除 删除没有返回值
此种删除无效
@Test
public void testDelete(){
Article article = new Article();
article.setTitle("测试添加");
articleRepository.delete(article);
}
实际删除需要实体中包含id即可正确删除,可以直接先查询出实体,然后删除
@Test
public void testDelete(){
Article article = new Article();
article.setId(17);
articleRepository.delete(article);
}
//或者
@Test
public void testDelete(){
Article article = new Article();
article.setTitle("测试添加");
Article articleFind=articleRepository.findOne(Example.of(article)).orElse(null);
articleRepository.delete(articleFind);
}
7.deleteALL
删除所有数据 会执行两条sql 先查出所有id 然后根据id一条条的删除.慎用避免使用无参清空数据
@Test
public void testDeleteAll(){
articleRepository.deleteAll();
}
//删除指定 同样是依据ID进行删除操作
@Test
public void testDeleteAll1(){
Article article1 = new Article();
article1.setId(1);
Article article2 = new Article();
article2.setId(2);
ArrayList<Article> list = new ArrayList<>();
list.add(article1);
list.add(article2);
articleRepository.deleteAll(list);
}
出输入的sql可以看到,先查询的id,然后在进行删除.
8.count
查询数量 无参的方法会返回所有的记录
@Test
public void testCount(){
Article article = new Article();
article.setHot(true);
Example<Article> example = Example.of(article);
long count = articleRepository.count(example);
System.out.println(count);
}
目前就测试以上方法的基本用法,大部分方法都是都通过方法名就能轻松知道方法是怎么用的.本文只初略的总结了基本使用,更复杂的查询还待研究.
Tags: jpa
很赞哦! (53)
随机图文
-
php 安装第三方包aliexpress-sdk-PHP
在开发过程中,大公司在开发过程中会给我们提供sdk封装有签名验证生成,我们哪来就可以快速上手开发,这种公司还是蛮良心的,比如在开发中,速卖通后台及可以下载官方sdk,总结几种包的导入方式.1.直接导入 -
linux centos 安装jenkins
centos 安装jenkins,我们都知道一般项目都是运行再服务器里面,我们本地的window可能和生产环境不一样,着手对centos安装jenkins. 1.jenkins是java开发的运行必须 -
发几个笑话,差点没把人笑晕,专治不开心
1:我坐在沙发上,娃儿趴在我肩膀上闹腾。突然她停下来说:“老爸,你后脑勺上有白头发了!”我无奈的笑了笑:“头发白是因为老爸每天要操心很多事,很辛苦。所以你要心疼老爸知道不?”小家伙想了想,从沙发上跳下来,心疼的搂住Summer(我家的萨摩耶):“唉,家里就你最辛苦了。全身都白了!” 2:以前惹媳妇儿生气后,我就模仿曾志伟、周星驰的声音哄她。楼主学过播音,虽不能说学的惟妙惟肖,却也能把她逗笑,矛盾 -
冠状病毒科普 什么是冠状病毒
冠状病毒在分类层级上是科,冠状病毒科拉丁文名Coronaviridae, 简称CoV,因为外形呈球状,具有花瓣状的刺突,因此根据其形状,国际病毒命名委员会在1975年正式命名为“冠状病毒科”。目前已知