当前位置: 首页 > news >正文

JPA CrudRepository方法详解

CrudRepository方法详解

通过类关系图可以看到CrudRepository提供了公共的通用的CRUD方法。

CrudRepository interface内容

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S var1);

    <S extends T> Iterable<S> saveAll(Iterable<S> var1);

    Optional<T> findById(ID var1);

    boolean existsById(ID var1);

    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> var1);

    long count();

    void deleteById(ID var1);

    void delete(T var1);

    void deleteAll(Iterable<? extends T> var1);

    void deleteAll();
}

(1)保存实体方法。我们通过IntelliJ IDEA打开类QueryDslJpaRepository,右击,选择show diagrams,用图表的方式查看类的关系层次。

在这里插入图片描述

查看SimpleJpaRepository实现类里面的实现方法:

    @Transactional
    public <S extends T> S save(S entity) {
        if (this.entityInformation.isNew(entity)) {
            this.em.persist(entity);
            return entity;
        } else {
            return this.em.merge(entity);
        }
    }

我们发现它是先检查传进去的实体是不是存在,然后判断是新增还是更新;是不是存在有两种根据机制,一种是根据主键来判断,另一种是根据Version来判断(后面讲解Version的时候详解)。如果我们去看JPA控制台打印出来的SQL,最少会有两条,一条是查询,一条是insert或者update。

(2)批量保存。原理和步骤(1)相同。实现方法就是for循环调用上面的save方法。

(3)根据主键查询实体。

(4)根据主键判断实体是否存在。

(5)查询实体的所有列表。

(6)根据主键列表查询实体列表。

(7)查询总数。

(8)根据主键删除。

SimpleJpaRepository里面的实现方法:

    @Transactional
    public void deleteById(ID id) {
        Assert.notNull(id, "The given id must not be null!");
        this.delete(this.findById(id).orElseThrow(() -> {
            return new EmptyResultDataAccessException(String.format("No %s entity with id %s exists!", this.entityInformation.getJavaType(), id), 1);
        }));
    }

我们看到JPA会先去查询一下,再做保存,不存在抛出异常。这里特别强调一下delete和save方法,因为在实际工作中有的人会画蛇添足,自己先去查询再做判断处理,其实Spring JPA底层都已经考虑到了。

CrudRepository interface的使用示例

使用也很简单,只需要自己的Repository继承CrudRepository即可。

User.class


@Entity
public class User {
	@Id
	@Generatedvalue(strategy=GenerationType.AUTO)
	private Long id;
	private String name;
	private String email;
	public Long getId (){
		return id;
	}
	public void setId(Long id){
		this.id = id;
	}
	public String getName(){
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail(){
		return email;
	}
	public void setEmail(String email){
		this.email = email;
	}
}	

UserCrudRepository.class

import com.example.example2.User;
import org.springframework.data.repository.CrudRepository;
public interface UserCrudRepository extends CrudRepository<User,Long>{
}

UserController.class

@controller
@RequestMapping(path = "/demo")
public class UserController {
	@Autowired
	private UserCrudRepository userRepository;
	
	@GetMapping(path = "/add")
	public void addNewUser(@RequestParam String name,@RequestParam String email) {
		User n = new User ();
		n.setName(name);
		n.setEmail(email);
		userRepository.save(n);
	}
	
	@GetMapping(path = "/all")
	@ResponseBody
	public Iterable<User> getAllUsers () {
		return userRepository.findAll();
	}
	
	@GetMapping(path = "/info")
	@ResponseBody
	public User findOne(@RequestParam Long id){
		return userRepository.findOne(id);
	}
	
	@GetMapping (path = "/delete")
	public void delete (@RequestParam Long id){
	userRepository.deleteById(id);
)

相关文章:

  • PowerDesigner 16.5 name和code自动同步问题
  • ShiroConfig开启Shiro的注解
  • webstorm tab缩进2空格还是4空格?
  • el-select 字符串多选回显
  • 字符串列表转成一个字符串 java
  • el-upload 第二次点击修改后文件跳动问题
  • ElementUI el-table 表格 行选择框改为单选
  • el-table handleCurrentChange有时候会失效
  • el-upload删除文件后修改文件仍然存在
  • element upload上传从上到下滑动 去除upload组件过渡效果
  • 正则表达式 匹配一个数字
  • js中的filter方法和map方法
  • 统计指定文本数量 notepad++
  • 查看路由器的管理页面地址
  • Git-本地项目删除文件,重新在远程仓库pull该文件
  • 【node学习】协程
  • 4. 路由到控制器 - Laravel从零开始教程
  • 78. Subsets
  • CentOS 7 修改主机名
  • Hexo+码云+git快速搭建免费的静态Blog
  • interface和setter,getter
  • Java 多线程编程之:notify 和 wait 用法
  • Javascript Math对象和Date对象常用方法详解
  • js中的正则表达式入门
  • leetcode98. Validate Binary Search Tree
  • Redis 懒删除(lazy free)简史
  • Vue.js源码(2):初探List Rendering
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 简析gRPC client 连接管理
  • 京东美团研发面经
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 首页查询功能的一次实现过程
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 智能合约Solidity教程-事件和日志(一)
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (solr系列:一)使用tomcat部署solr服务
  • (三)elasticsearch 源码之启动流程分析
  • (算法设计与分析)第一章算法概述-习题
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)基于IDEA的JAVA基础1
  • (译) 函数式 JS #1:简介
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转)详解PHP处理密码的几种方式
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • **CI中自动类加载的用法总结
  • 、写入Shellcode到注册表上线
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .gitignore
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑