Spring Data JPA
首先我们需要知道JPA是什么
JPA Java Persistence API:用于对象持久化的API.
那么什么是持久化呢?
- 持久化就是把数据保存到可以永久保存的存储设备中(如磁盘).
- 持久化的主要的应用是将内存中的对象保存到数据库中,或者磁盘文件中,XML数据文件中等等.
其次,JPA是一种规范,而不是和和Hibernate一样的产品.
JPA其本质就是一种ORM规范,而不是ORM框架,这是因为JPA的实现,只是提供了一些编程的API接口,也就是定义规范,但是具体的实现却不是本身实现的.
那么ORM又是什么呢?
- ORM Object Relational Mapping 对象关系映射.
- 本质就是将数据从一种形式转换到另外一种形式,通俗点就是通过使用对象和数据库之间映射的元素据,将OOP中的对象自动持久化到关系数据库中.
JPA中支持的技术
- ORM映射元数据:支持XML和注解两种形式,描述对象和表间的映射关系.
- API:用来操作实体对象,执行基本的CRUD操作,由框架在后台完成所有的事情,而开发者只需要实现接口,或者加上规范即可.
- 查询语言JPQL: 操作的对象是实体对象和实体属性.也就是通过面向对象而不是面向数据库的查询语言查询数据.
Spring Data JPA的使用
- 基本环境的搭建
Spring Boot整合Spring Data Jpa
启用Web支持还需要在配置类上添加@EnableSpringDataWebSupport注解<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>
相关配置:server: port: 8080 servlet: context-path: / spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false username: root password: 123456 jpa: database: MySQL database-platform: org.hibernate.dialect.MySQL5InnoDBDialect show-sql: true hibernate: ddl-auto: update
-
对于ddl-auto
- create:每次运行程序时,都会重新创建表,故而数据会丢失
- create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表
- upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
- validate:运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错
- none: 禁用DDL处理
- 创建实体类
实体类使用注解@Entity加上@Table(name=“table_name”)加上@Data
这里的@Data是插件Lombok的使用,简化get/set/toString方法的书写.
实体类中的字段:主键使用注解@Id和@GeneratedValue(strategy=GenerationType.IDENITY)主键自增的意思
非主键使用@Column注解配置名称,长度,是否为空等. - 在对应DAO包下创建相应的Repository,注意:这里也是一个接口
这里需要注意Repository接口:public interface XXXDao extends Repository<T, id extends Serializable> { T getTById(Long id); }
Repository接口是Spring Data的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法.
该接口的原型为:
Spring Data 使我们只定义接口,只要遵循规范,就无需写实现类.public interface Repository<T, ID extends Serializable> { }
为了增加其他的功能,还有一些子接口:
1. CrudRepository:继承Repository接口,实现了一组CRUD方法.
2. PagingAndSortingRepository:继承CrudRepository接口,实现了一组分页和排序的方法.
3. JpaRespository:继承PagingAndSortingRepository接口,实现一组JPA规范相关的方法
4. 自定义的XXRepository:需要继承JpaRepository接口,这样这个接口就具有了通用的访问控制层的能力.
5. JpaSecificatioinExecutor:实现一组JPA Criteria查询相关的方法. - 接着,就是创建Service层的代码,一个XXService接口,和一个对应的XXServiceImpl的实现类
Servive接口的实现类代码使用@Service注解,也就是该注解标注在XXServiceImpl类上,而不是接口上. - 接着就可以编写控制层代码进行使用测试了,控制层也就是@Controller注解标注的,或者使用@RestController标注的,配合@RequestMapping注解一起使用.
方法定义的规范
简单条件查询
查询方法以 find read get 开头
涉及条件查询时,条件的属性用条件关键字连接,使用的是驼峰命名法
例如根据id和名字查询:
findByIdAndName(long id,String name);
复杂的查询就是按照:
find+全局修饰+By+实体的属性名称+限定词+连接词+其他实体属性+OrderBy+排序属性+排序方向
这个规范的书写.