一、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;
@Column
private 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;
@Column
private 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;
@Column
private 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;
@Column
private 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在复杂查询上的不足

spring-data-jpa 二、多对一结构、Repository的更多相关文章

  1. <Spring Data JPA>二 Spring Data Jpa

    1.pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  2. Spring Data Jpa (二)JPA基础查询

    介绍Spring Data Common里面的公用基本方法 (1)Spring Data Common的Repository Repository位于Spring Data Common的lib里面, ...

  3. Spring Data - Spring Data JPA 提供的各种Repository接口

    Spring Data Jpa 最近博主越来越懒了,深知这样不行.还是决定努力奋斗,如此一来,就有了一下一波复习 演示代码都基于Spring Boot + Spring Data JPA 传送门: 博 ...

  4. Spring Data JPA 提供的各种Repository接口作用

    各种Repository接口继承关系: Repository : public interface UserRepository extends Repository<User, Integer ...

  5. 【ORM框架】Spring Data JPA(一)-- 入门

    本文参考:spring Data JPA入门   [原创]纯干货,Spring-data-jpa详解,全方位介绍  Spring Data JPA系列教程--入门 一.Spring Data JPA介 ...

  6. Spring Data JPA入门

    1. Spring Data JPA是什么 它是Spring基于ORM框架.JPA规范封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常用功能, ...

  7. Spring Data JPA笔记

    1. Spring Data JPA是什么 Spring Data JPA是Spring Data大家族中的一员,它对对持久层做了简化,用户只需要声明方法的接口,不需要实现该接口,Spring Dat ...

  8. spring data jpa使用原生sql查询

    spring data jpa使用原生sql查询 @Repository public interface AjDao extends JpaRepository<Aj,String> { ...

  9. Spring Data JPA: 实现自定义Repository

    一.前言 由于项目中的 实体(entity)默认都是继承一个父类(包含一些公共的属性,比如创建时间,修改时间,是否删除,主键id).为了实现逻辑删除,一般会自己实现RepositoryFactoryB ...

  10. Spring Boot入门系列(二十六)超级简单!Spring Data JPA 的使用!

    之前介绍了Mybatis数据库ORM框架,也介绍了使用Spring Boot 的jdbcTemplate 操作数据库.其实Spring Boot 还有一个非常实用的数据操作框架:Spring Data ...

随机推荐

  1. Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)B. Personalized Cup

    题意:把一长串字符串 排成矩形形式  使得行最小  同时每行不能相差大于等于两个字符 每行也不能大于20个字符 思路: 因为使得行最小 直接行从小到大枚举即可   每行不能相差大于等于两个字符相当于  ...

  2. 上板子在线抓波发现app_rdy一直为低

    现象 使用Xilinx的MIG IP测试外挂DDR3的读写发现一段很短的时间后app_rdy恒为低,并且最后一个读出的数据全是F. (1)不读写数据,app_rdy正常为高,MIG IP初始化信号为高 ...

  3. C#面向对象基本概念总结

    快过年了,发一篇自己的复习总结.以下内容均是个人理解,如文章有幸被浏览,如有错误的地方欢迎大家提出,相互学习相互进步! 面向对象三大基本特征:封装,继承,多态 一.类 (对象声明的三种方式:以普通基类 ...

  4. laravel 读写分离源码解析

    前言:上一篇我们说了<laravel 配置MySQL读写分离>,这次我们说下,laravel的底层代码是怎样实现读写分离的.   一.实现原理 说明: 1.根据 database.php ...

  5. GWAS群体分层校正,该选用多少个PCA

    前言 关于选用多少个PCA做群体分层校正,各大期刊并没有一个统一的说法. 故做了如下综述. 1 随心所欲型,想选多少就选多少 PCA想选多少就选多少,这个真的不是开玩笑.有文献出处有真相! 比如下面文 ...

  6. 实验二 Java面向对象程序设计实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  7. Springboot集成FreeMarker

    Apache官网对FreeMarker的解释如下: Apache FreeMarker™是一个模板引擎 :一个基于模板和变化的数据来生成文本输出(HTML网页,电子邮件,配置文件,源代码,等等)的Ja ...

  8. Apicloud学习第三天——获取云数据库的数据方法

    apicloud学习30天中的对用进行注册和登录以及数据的获取的代码,在apicloud中有单独的api对用户的增删查改进行操作,这里写下增加和查询. 增加用户数据 var model=api.req ...

  9. 异常详细信息: System.IO.FileLoadException: 未能加载文件或程序集“Office, Version=7.0.3300.0,

    导出Excel程序调试起来很正常,发布到服务器上却出错. 错误:未能加载文件或程序集“Office, Version=2.2.0.0, Culture=neutral, PublicKeyToken= ...

  10. [转载]再谈PostgreSQL的膨胀和vacuum机制及最佳实践

    本文转载自 www.postgres.cn 下的文章: 再谈PostgreSQL的膨胀和vacuum机制及最佳实践http://www.postgres.cn/news/viewone/1/390 还 ...