您现在的位置是:首页 > java技术交流java技术交流
Spring Data JPA数据操作总结. findById getOne findOne save delete 等
上善若水2021-01-27 17:19:05【java技术交流】 5196人已围观
简介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)
随机图文
-
Maatwebsite\Excel 读取导入excel转为数组数据显示不全
在laravel中读取excel转换为数组进行数据处理,发现转换为的数组内只有一条记录,其他记录丢失,Maatwebsite\Excel 读取导入excel转为数组数据显示不全,发现网上给出的代码掉了 -
精品笑话十则,总有一则逗乐您
1、一漂亮女同事,她老公给她送午饭,没说话,放下就走了。 新来的男同事问:刚才那是谁啊? 她回答:送外卖的。 新来又问:怎么沒给钱? 她说:不用给,晚上陪他睡觉就好了。 男同事沉默了。第二天,给她带了四菜一汤的午饭。 整个办公室轰然大笑…… 2、下午肚子饿,看见同事桌上有瓶酸奶,想都没想就喝了。 一会儿,同事来了大叫道:“我的洗面奶怎么不见了!108块啊!” 哥没说话,只是默默的 -
Thinkphp6定时执行 tp6如何使用定时执行脚本
Thinkphp6如何定时执行代码,tp6如何使用定时执行脚本,composer支持tinkphp6定时组件框架有哪些,在项目中经常会使用到定时脚本执行,但是相比较于laravel框架而言,think -
幽默笑话:学生们特别喜欢音乐史课,因为任课的音乐老师非常幽默
1、去相亲,正和女方聊得如火如荼,一个三岁左右的女孩走到我身旁,怯怯的叫了声爸爸。我惊出一身冷汗,赶紧同女方解释:“她不是我女儿!”女方淡淡的道:“我知道,她是我女儿!”2、我上大一的时候的事。刚刚军训完,上大学语文。老师是一个中年妇女,上课可认真了,有一次她正讲课,教室后排的同学都在说话,老师大叫一声:“后面的朋友”话刚落音,不知道哪个二货接了句:“你们好吗?”全班同学都笑趴了。3、早上