Spring Data JPA简单使用
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类需要完成以下几项工作:
- 注解
- @Entity:表明这是一个实体类,与指定的数据库表进行映射
- @Id:该属性映射为数据库的主键
- @GeneratedValue:默认使用主键生成方式为自增,hibernate会自动生成一个名为HIBERNATE_SEQUENCE的序列
- @Table:指定映射的表名,若没有则根据类的名称进行映射
- @Column:指定映射的字段名
- @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简单使用相关推荐
- Spring Data JPA简单学习
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- JAVA入门[20]-Spring Data JPA简单示例
Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建.事务处理等 JPA 相关的处理.Spring Data JPA更是 ...
- springdatajpa命名规则_简单了解下spring data jpa
公司准备搭建一个通用框架,以后项目就用统一一套框架了 以前只是听过jpa,但是没有实际用过 今天就来学习下一些简单的知识 什么是JPA 全称Java Persistence API,可以通过注解或者X ...
- spring data jpa从入门到精通_Spring Data JPA的简单入门
前言 spring data JPA是spring团队打造的sping生态全家桶的一部分,本身内核使用的是hibernate核心源码,用来作为了解java持久层框架基本构成的样本是再好不过的选择.最近 ...
- spring data jpa封装specification实现简单风格的动态查询
github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...
- Spring Data JPA 写SQL语句也可以如此简单
在使用 Spring Data JPA 的时候,通常我们只需要继承 JpaRepository 就能获得大部分常用的增删改查的方法.有时候我们需要自定义一些查询方法,可以写自定义 HQL 语句 像这样 ...
- Spring Security+Spring Data Jpa 强强联手,安全管理只有更简单!
Spring Security+Spring Data Jpa 强强联手,安全管理没有简单,只有更简单! 这周忙着更新 OAuth2,Spring Security 也抽空来一篇. Spring Se ...
- Spring Data JPA是什么?以及简单的使用(联表查询)
Spring Data学习网站(下载gitHub工程学习) Spring Boot JPA 使用教程 - fishpro - 博客园 Spring Data JPA是什么?以及相关概述 首先Sprin ...
- Spring Boot整合Spring Data JPA操作数据
一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...
最新文章
- Linux下搭建Lotus Domino集群
- DeepFusion:基于单视图深度和梯度预测的单目SLAM实时稠密三维重建
- Mybatis操作数据库实现主键自增长
- maven项目发布到tomcat里lib包没有发布的问题
- 计算机程序设计 大作业 vb,成人《VB程序设计》标准化大作业(答案)1
- 微信小程序 | 来自小程序开发者的实例教程 ①
- TensorFlow的基础概念04
- AE “每用户订阅上的所有人SID 不存在”
- adb命令查看手机电量_你们要的App电量分析测试来了
- Atitit 日志分析与方法调用链 发出命令与接收,,接收使用缩进一格来。。。 方法闭合 使用notepad++选中字符串模式单词。。所以 cls_mthd 模式的输出,来确定一个具体命令。
- Atitti 摘要算法 散列算法SHA1 和 MD5 crc32 目录 1.1. CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长	1 1.1.1. 数据摘要算
- springboot过滤器配置
- win10电脑磁盘占用百分百,电脑优化
- idea中自动生成Java类图和时序图
- ACE事件类型及模板
- ORA-22835:缓冲区对于CLOB到CHAR转换而言太小
- 苹果微信昵称表情php,苹果手机微信名如何使用特殊符号
- 2021-03-23
- 清华计算机类专业介绍,清华大学研究生专业介绍:计算机技术
- 【嵌入式08】STM32F103C8T6寄存器方式借助面包板点亮LED流水灯详解
热门文章
- php做mes系统,mes系统的七大功能是什么
- 计算机科学与技术与光电,光电信息科学与工程考研科目有哪些?
- 【PC】完美解决 office2010 错误1920 未能启动服务 “Office Software Protection Platform”(osppsvc)
- warning:suggest parentheses around assignment used as truth value
- 翻译 | 《JavaScript Everywhere》第1章 开发环境(^_^)
- DESeq2的baseMean和log2FoldChange是如何得到的?
- 视频会议工具Zoom上市大涨—办公真的必须面对面吗?
- java 周易解梦接口_周公解梦-免费API,收集所有免费的API
- Problem F: 凹凸四边形
- 计算机协会报名范文,入计算机协会申请书范文.docx