Spring Data Jpa

1、JPA简介

JPA的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA是在吸收现有ORM框架的基础上发展而来,易于使用,伸缩性强。总的来说,JPA包括以下3方面的技术:

  • ORM映射元数据: 支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系
  • API: 操作实体对象来执行CRUD操作
  • 查询语言: 通过面向对象而非面向数据库的查询语言(JPQL)查询数据,避免程序的SQL语句紧密耦合

2、准备环境

2.1、Spring Boot整合Spring Data Jpa

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

application.yml配置

server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=falseusername: rootpassword: rootjpa:database: MySQLdatabase-platform: org.hibernate.dialect.MySQL5InnoDBDialectshow-sql: truehibernate:ddl-auto: update
ddl-auto
  • create:每次运行程序时,都会重新创建表,故而数据会丢失
  • create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表
  • upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
  • validate:运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错
  • none: 禁用DDL处理

2.2实体类

@Entity用于关联映射数据库中的一张表,entity类需要完成以下几项工作:

  • 注解

    1. @Entity:表明这是一个实体类,与指定的数据库表进行映射
    2. @Id:该属性映射为数据库的主键
    3. @GeneratedValue:默认使用主键生成方式为自增,hibernate会自动生成一个名为HIBERNATE_SEQUENCE的序列
    4. @Table:指定映射的表名,若没有则根据类的名称进行映射
    5. @Column:指定映射的字段名
    6. @OneToOne/OneToMany/ManyToOne:一对一、一对多、多对一的关联
  • (2)定义属性,类型为私有
  • (3)创建所有属性所对应的setter和getter方法
  • (4)创建带参数的构造器和无参数的构造函数
  • (5)重写父类中的equals()方法和hashcode()方法
  • (6)实现序列化并赋予其一个版本号。

有参无参构造和getter、setter方法均用Lombok注解代替

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
@Table(name = Order.TABLE_NAME)
public class Order implements Serializable {public static final String TABLE_NAME = "user";@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer userId;private String userName;private Integer age;
}

@GenericGenerator是Hibernate提供的主键生成策略

@GeneratedValue(JPA注解)使用generator = “idGenerator” 引用上文name = "idGenerator"主键生成策略

一般简单的表结构中,会使用GereratedValue(strategy = Generation.IDENTITY)主键自增的策略,但实际数据库中的主键少见是int型,一般雪花算法生成UUID唯一;

常见的主键生成策略

  • TABLE: 使用一个特定的数据库表格来保存主键
  • SEQUENCE: 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)
  • IDENTITY: 主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
  • AUTO: 主键由程序控制,也是GenerationType的默认值

2.3、Dao(repository)

@Repository
public interface UserRepository extends JpaRepository<User,Integer> {}

2.3.1、JpaRepository和CrudRepository的区别

CrudRepository和PagingAndSortingRepository由Spring Data提供;JpaRepository 由Spring Data JPA提供,而Spring Data JPA又是Spring Data的一个子项目,这就是两者的关系。通常,最好的想法是使用 CrudRepository 或 PagingAndSortingRepository, 具体取决于是否需要排序和分页。如果可能,应该避免使用 JpaRepository ,因为它将存储库与JPA持久性技术联系起来,并且在大多数情况下,我们甚至可能不会使用它提供的额外方法。

2.3.2、编写Repostory接口需要指定的泛型参数

使用注解@Repostory编写接口实现对数据库的访问,在编写Repostory接口时需将实体类型和实体类的id类型作为类型参数指定到继承类的泛型中

例如编写接口UserRepostory继承JpaRepostory时需要指定JpaRepostory<User,Integer>

2.3.3、编写符合书写规范的方法

增删改查等操作方法只需按照书写规范进行声明,不需要实现,spring data jpa会在运行程序时根据方法名称自动创建相关的实现,如下是CrudRepostory中的全部方法

可以继承的接口有四个:

  • Repository
  • CrudRepository
  • PagingAndSortingRepository
  • QueryByExampleExecutor

方法名支持的Query关键字:

Keyword Sample JPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is, Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull, Null findByAge(Is)Null … where x.age is null
IsNotNull, NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection ages) … where x.age not in ?1
TRUE findByActiveTrue() … where x.active = true
FALSE findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

2.3.4继承JpaRepostory

在继承JpaRepository接口的方法中,可以在自定义的查询方法上使用@Query,来指定该方法要执行的自定义的查询语句。其中的value值可以是任意的查询语句,同样只需要进行方法的定义,无需进行实现。

@Repository
public interface UserRepository extends JpaRepository<User,Integer> {/*** 通过姓名查找用户* @param userName* @return*/List<User> findUserByUserName(String userName);/*** 通过ID修改姓名* @param userName* @param userId*/@Modifying@Transactional@Query(value = "update user u set u.user_name = ?1 where u.user_id = ?2", nativeQuery = true)void updateUser(String userName,Integer userId);}

2.4、Service以及Impl

2.4.1、UserService

public interface UserService {/*** 新增用户* @param user*/void saveUser(User user);/*** 通过id删除用户* @param id*/void delUserById(Integer id);/*** 通过对象更新数据* @param user*/void updateUser(User user);/*** 查找对象* @return*/Collection<User> findUser();/*** 通过Id修改UseName* @param id* @param name*/void updateUserNameById(Integer id,String name);
}

2.4.2、UserServiceImpl

@Service
public class UserServiceImpl implements UserService {@ResourceUserRepository userRepository;@Overridepublic void delUserById(Integer id) {userRepository.deleteById(id);}@Overridepublic void saveUser(User user) {userRepository.save(user);}@Overridepublic void updateUser(User user) {userRepository.save(user);}@Overridepublic Collection<User> findUser() {return userRepository.findAll();}@Overridepublic void updateUserNameById(Integer id, String name) {userRepository.updateUser(name,id);}
}

2.5、Controller

编写Restful风格的UserController

@Api(value = "users' CRUD")
@RestController
@RequestMapping("/api")
public class UserController {@ResourceUserService userService;@ApiOperation(value = "create user")@PostMapping(value = "/user")public JsonNode saveUser(@RequestBody User user){userService.saveUser(user);return JsonUtils.object().put("success",true);}@ApiOperation("delete user by id")@DeleteMapping(value = "/user")public JsonNode deleteUser(@RequestParam Integer id){userService.delUserById(id);return JsonUtils.object().put("success",true);}@ApiOperation("update user")@PutMapping(value = "/user")public JsonNode updateUser(@RequestBody User user){userService.updateUser(user);return JsonUtils.object().put("success",true);}@ApiOperation("search all users")@GetMapping(value = "/user")public JsonNode findUser(){Collection<User> users = userService.findUser();ObjectNode result = JsonUtils.object();result.put("success",true).set("result",JsonUtils.toJson(users));return result;}@ApiOperation("update useName by id")@PutMapping(value = "/userName")public JsonNode updateUser(@RequestParam Integer id,@RequestParam String name){userService.updateUserNameById(id,name);return JsonUtils.object().put("success",true);}}

3、PostMan测试

3.1、数据库数据

3.2、新增测试

localhost:8080/api/user
{"userId":"4","userName":"李理","age":"20"
}

3.3、查找测试

3.4、更新测试

localhost:8080/api/user
{"userId":"3","userName":"李元","age":"20"
}

3.5、删除测试

localhost:8080/api/user?id=3

3.6、修改指定Id的UserName

localhost:8080/api/userName?id=2&name=李子柒

Spring Data JPA简单使用相关推荐

  1. Spring Data JPA简单学习

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  2. JAVA入门[20]-Spring Data JPA简单示例

    Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建.事务处理等 JPA 相关的处理.Spring Data JPA更是 ...

  3. springdatajpa命名规则_简单了解下spring data jpa

    公司准备搭建一个通用框架,以后项目就用统一一套框架了 以前只是听过jpa,但是没有实际用过 今天就来学习下一些简单的知识 什么是JPA 全称Java Persistence API,可以通过注解或者X ...

  4. spring data jpa从入门到精通_Spring Data JPA的简单入门

    前言 spring data JPA是spring团队打造的sping生态全家桶的一部分,本身内核使用的是hibernate核心源码,用来作为了解java持久层框架基本构成的样本是再好不过的选择.最近 ...

  5. spring data jpa封装specification实现简单风格的动态查询

    github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...

  6. Spring Data JPA 写SQL语句也可以如此简单

    在使用 Spring Data JPA 的时候,通常我们只需要继承 JpaRepository 就能获得大部分常用的增删改查的方法.有时候我们需要自定义一些查询方法,可以写自定义 HQL 语句 像这样 ...

  7. Spring Security+Spring Data Jpa 强强联手,安全管理只有更简单!

    Spring Security+Spring Data Jpa 强强联手,安全管理没有简单,只有更简单! 这周忙着更新 OAuth2,Spring Security 也抽空来一篇. Spring Se ...

  8. Spring Data JPA是什么?以及简单的使用(联表查询)

    Spring Data学习网站(下载gitHub工程学习) Spring Boot JPA 使用教程 - fishpro - 博客园 Spring Data JPA是什么?以及相关概述 首先Sprin ...

  9. Spring Boot整合Spring Data JPA操作数据

    一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...

最新文章

  1. Linux下搭建Lotus Domino集群
  2. DeepFusion:基于单视图深度和梯度预测的单目SLAM实时稠密三维重建
  3. Mybatis操作数据库实现主键自增长
  4. maven项目发布到tomcat里lib包没有发布的问题
  5. 计算机程序设计 大作业 vb,成人《VB程序设计》标准化大作业(答案)1
  6. 微信小程序 | 来自小程序开发者的实例教程 ①
  7. TensorFlow的基础概念04
  8. AE “每用户订阅上的所有人SID 不存在”
  9. adb命令查看手机电量_你们要的App电量分析测试来了
  10. Atitit 日志分析与方法调用链 发出命令与接收,,接收使用缩进一格来。。。 方法闭合 使用notepad++选中字符串模式单词。。所以 cls_mthd 模式的输出,来确定一个具体命令。
  11. Atitti 摘要算法 散列算法SHA1 和 MD5  crc32 目录 1.1. CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长 1 1.1.1. 数据摘要算
  12. springboot过滤器配置
  13. win10电脑磁盘占用百分百,电脑优化
  14. idea中自动生成Java类图和时序图
  15. ACE事件类型及模板
  16. ORA-22835:缓冲区对于CLOB到CHAR转换而言太小
  17. 苹果微信昵称表情php,苹果手机微信名如何使用特殊符号
  18. 2021-03-23
  19. 清华计算机类专业介绍,清华大学研究生专业介绍:计算机技术
  20. 【嵌入式08】STM32F103C8T6寄存器方式借助面包板点亮LED流水灯详解

热门文章

  1. php做mes系统,mes系统的七大功能是什么
  2. 计算机科学与技术与光电,光电信息科学与工程考研科目有哪些?
  3. 【PC】完美解决 office2010 错误1920 未能启动服务 “Office Software Protection Platform”(osppsvc)
  4. warning:suggest parentheses around assignment used as truth value
  5. 翻译 | 《JavaScript Everywhere》第1章 开发环境(^_^)
  6. DESeq2的baseMean和log2FoldChange是如何得到的?
  7. 视频会议工具Zoom上市大涨—办公真的必须面对面吗?
  8. java 周易解梦接口_周公解梦-免费API,收集所有免费的API
  9. Problem F: 凹凸四边形
  10. 计算机协会报名范文,入计算机协会申请书范文.docx