spring-data-jpa 二、多对一结构、Repository
spring-data-jpa 二、多对一结构、Repository
一、Entity
例如一个user实体和一个department实体 多个用户对应一个部门
1、user类
@id:声明了一个属性映射到数据库主键字段,主键生成策略有@GenerateValue来指定
@Column:声明了一个字段(字段名可以通过name来自定义)
@ManyToOne:多对一,many指的是定义此类的实体(User),one指的是此注解所注解的属性
@JoinColumn:与@ManyToOne配合使用,说明外键字段是“department_id”
package com.nxz.blog;import javax.persistence.*;
import java.util.Date;@Entity
public class User{@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Columnprivate String name;@Column(name = "create_date")private Date createDate;@ManyToOne@JoinColumn(name = "department_id")private Department department;
}
2、department类
@oneToMany:一对多,One指的是次注解所在的实体(department),many是指此注解的属性(User),
在这种一对多的关系映射上,“One”端采用@OneToMany注解是必须使用mapperBy,以声明Many端的对象(这里只User对象)的department属性提供了对应的映射关系
(User为什么使用Set而不是List,这个是jpa要求的,因为Set结构是存放不同元素的集合)
@Entity
class Department {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;@Columnprivate String name;@OneToMany(mappedBy = "department")private Set<User> users = new HashSet<>();}
3、现在越来越多的jpa应用2简化了Entity的定义,去掉了关系映射的相关配置,去掉了数据库外键的设置(类似其他f非ORM),一个表对应一个简单的对象,这样使JPA变得简单
例:(在下边这个User对象中只会用到基本的注解:@Entity、@Id、@GenerateValue、@Column),这样定义Entity,不用理解复杂的映射关系(便于初学者应用)
@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Columnprivate String name;@Column(name = "create_date")private Date createDate;@Column(name = "department_id")private Integer departmentId;
}
@Entity
class Department {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;@Columnprivate String name;}
二、Repository
1、Repository是SpringData的核心,抽象了对数据库和nosql的操作,提供了几个接口:
CurdRepository:提供了基本的增删改查
PagingAndSortingRepository:集成CrudRepository,并提供了分页功能
JPARepository:专门用于JPA,提供了更丰富的数据库访问接口
源码:
CrudRepository:T表示实体,ID表示主键(ID必须实现序列化接口)
import java.util.Optional;@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S var1);//save方法保存Entity,如果Entity包含主键,SpringData则认为是更新操作<S extends T> Iterable<S> saveAll(Iterable<S> var1);Optional<T> findById(ID var1);/根据主键查询实体,返回Optional对象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();
}
PagingAndSortingRepository:
PageAble是用于构造分页查询的接口,其实现类是PageRequest
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);
}
JpaRepository:Example是SpringData提供的用来构造查询条件的对象
import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {List<T> findAll();List<T> findAll(Sort var1);List<T> findAllById(Iterable<ID> var1);<S extends T> List<S> saveAll(Iterable<S> var1);void flush();<S extends T> S saveAndFlush(S var1);void deleteInBatch(Iterable<T> var1);void deleteAllInBatch();T getOne(ID var1);<S extends T> List<S> findAll(Example<S> var1);<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
2、例
最简单的Repository就是直接继承一个接口,下边这个即可实现简单的增删改查
import org.springframework.data.jpa.repository.JpaRepository;public interface U1tsRepository extends JpaRepository<User,Integer> {}
如果需要自定义查询,可以新增基于方法名字的查询:(方法的参数和方法名需要遵循一定的规则,spirngData才能自动转化为sql),
方法名之间可以用And或Or连接
public interface U1tsRepository extends JpaRepository<U1ts, Integer> {U1ts findByName(String name);//方法名是根据查询对象的属性类定义的
}
3、JPA使用@Query注解,手动写JPQL
@Query("select u from User u where u.name = ?1 and u.department.id = ?2")User findUser(String name,Integer departmentId);
4、如果手写sql,也可以在@Query注解中添加nativeQuery参数
@Query(value = "select * from user where name = ?1 and department_id = ?2",nativeQuery = true)User findUser1(String name,Integer departmentId);
5、命名参数(sql和jpql都支持)
@Query(value = "select * from user where name = :name and department_id = :departmentId",nativeQuery = true)User findUser2(String name,Integer departmentId);
6、如果查询结果不是Entity对象,也可以用Object【】数组代替
7、分页
@Query(value = "select * from user where name = :name and department_id = :departmentId",nativeQuery = true)User findUser2(String name, Integer departmentId, Pageable pageable);
8、跟新删除
@Modifying//更新和删除必须加modifying注解@Query("update User u set u.name = ?1 where u.id = ?2")User updateUser(String name, Integer id);
三、EntityManager
EntityManger提供了实体操作的所有接口,可以通过@Autowired注入到类中
作用:弥补Repository在复杂查询上的不足
posted @ 2019-04-21 13:13 巡山小妖N 阅读(...) 评论(...) 编辑 收藏
spring-data-jpa 二、多对一结构、Repository相关推荐
- ORM框架之Spring Data JPA(二)spring data jpa方式的基础增删改查
上一篇主要在介绍hibernate实现jpa规范,如何实现数据增删改查,这一篇将会着重spring data jpa 一.Spring Data JPA 1.1 Spring Data JPA介绍: ...
- 【Spring Data JPA自学笔记五】一对多、多对多和级联
文章目录 数据库表的关系 一对多 多对多 Spring Data JPA实现一对多 基本配置 实现一对多 放弃维护权 Spring Data JPA实现多对多 基本配置 实现多对多 级联 之前的所有操 ...
- springdatajpa命名规则_简单了解下spring data jpa
公司准备搭建一个通用框架,以后项目就用统一一套框架了 以前只是听过jpa,但是没有实际用过 今天就来学习下一些简单的知识 什么是JPA 全称Java Persistence API,可以通过注解或者X ...
- 第九章SpringBoot整合Spring Data JPA
目录 1 概述 2 Spring Data JPA整合 2.1 pom文件 2.2 配置文件 2.3 实体类 2.4 Dao接口 2.5 启动类 2.6 编写测试类 3 Spring Data JPA ...
- Spring Data JPA教程
在Java类或对象与关系数据库之间管理数据是一项非常繁琐且棘手的任务. DAO层通常包含许多样板代码,应简化这些样板代码,以减少代码行数并使代码可重复使用. 在本教程中,我们将讨论Spring数据的J ...
- Spring Boot————Spring Data JPA简介
引言 JPA是Java 持久化API的缩写,是一套Java数据持久化的规范, Spring Data Spring Data项目的目的是为了简化构建基于Spring 框架应用的数据访问技术,包括对关系 ...
- 从Spring Data JPA访问EntityManager
Spring Data JPA允许您通过使用Repository接口来快速开发数据访问层. 有时,您需要从Spring Data JPA访问EntityManager. 这篇文章向您展示了如何访问En ...
- Spring Data JPA: 实现自定义Repository
一.前言 由于项目中的 实体(entity)默认都是继承一个父类(包含一些公共的属性,比如创建时间,修改时间,是否删除,主键id).为了实现逻辑删除,一般会自己实现RepositoryFactoryB ...
- Spring Data JPA 自定义Repository接口与子接口
上篇文章介绍了 Repository接口的使用(Spring Data JPA介绍与Spring的整合),接下来重点掌握 Repository的CrudRepository子接口下的子接口. 在dao ...
- Spring Data JPA 从入门到精通~自定义实现Repository
EntityManager 的获取方式 我们既然要自定义,首先讲一下 EntityManager 的两种获取方式. 1. 通过 @PersistenceContext 注解. 通过将 @Persist ...
最新文章
- python私有函数
- 二维分类教案_大班数学二维分类教案
- 引用和指针-内存的分配方式有几种
- Leetcode --9
- 深度学习的实用层面 —— 1.2 偏差/方差
- pandas 使用把dataframe变为series
- Java中this和super的区别
- pgAdmin4的应用(一)
- 未来10年,最值得投资的40个城市
- 如何把电视盒子做成游戏机? —— 破解电视IPTV盒子(Skyworth E900-S)
- 2021-10-26
- 为什么机器学习对嵌入式开发很重要?
- Python爬取豆瓣电影top250的电影信息
- 给地震监视器添加Notification
- kettle中的switch_kettle 条件判断 Switch Case
- paddlepaddle框架小白入门级指南
- 人工智能基础部分7-高维空间的神经网络认识
- 巨一自动化工业机器人_一文了解国内工业机器人系统集成商格局
- 贪心问题(二分判定法)---牛棚距离问题
- 通过LABVIEW控制安川伺服制作的座椅实验室数据采集系统
热门文章
- PHP json_encode不转义中文
- php代码编辑器6,优秀的PHP代码编辑器_Blumentals Rapid PHP V13.6 免费版
- php+linux+线程安全,PHP 线程安全与非线程安全版本的区别深入解析
- 手机抓包app_Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
- shell 获取 mysql 行数_一个Shell小脚本精准统计Mysql每张表的行数实现
- Centos 利用yum源安装 nginx stream模块
- maven项目,提示One or more constraints have not been satisfied
- echarts词云图形状_用Python 3.8绘制词云图就这么20行代码
- 手机浏览器android2.,QQ浏览器Android 2.6:畅享版云浏览器大变身
- 路径前缀是什么意思_Trie 树是什么样的数据结构?有哪些应用场景?