Spring Boot2.x实战 - Spring Data
Spring Boot2.x实战 - Spring Data
汪云飞记录本
Spring
展开
-
Spring Boot 2.x实战57 - Spring Data 1 - DDD与Spring Data(Repository)
Spring Data 是一个伞型项目,包含主流的数据库的访问技术。这些不同的数据访问项目都使用相同的编程模型,他们都是基于Repository规范接口。我们在本章选关系型数据库的访问技术Spring Data JPA和NoSQL的访问Spring Data Elasticsearch。1. Spring Data Repository1.1 DDD与Spring Data1.1.1 DDDDDD是Domain-Driven Design的缩写,即领域驱动设计。它是解决复杂业务需求的一些列高级技术。原创 2020-05-20 08:10:06 · 1439 阅读 · 0 评论 -
Spring Boot 2.x实战58 - Spring Data 2 - Spring Boot下Spring Data JPA(自动配置)
2.关系数据库 - Spring Data JPA2.1 JPA、Hibernate和Spring Data JPAJPA是Java Persistence API的缩写,即Java持久化API。最新版的JPA 2.2为JSR-338规范也属于Jakarta EE的一部分。 JPA是规范,它对数据库的各种操作的是JPA提供者(如:Hibernate)提供的实现;我们在使用规范开发时,只需要和规范的API打交道而无需关心规范的实现。Spring Data JPA是在JPA提供者之上所做的更高界别的抽象,让原创 2020-05-22 10:10:38 · 336 阅读 · 0 评论 -
Spring Boot 2.x实战59 - Spring Data 3 - DDD下Spring Data JPA(聚合、值对象、库的定义与使用)
2.4 定义聚合2.4.1 定义实体我们使用javax.persistence.Entity注解来定实体类:@Entitypublic class Person {}一个实体类会映射数据库的一张表,我们启用了spring.jpa.hibernate.ddl-auto: update,Spring Data会自动为我们建一个首字母小写的表person。我们可以通过@Table(name = "tb_person")来定制的表名。2.4.2 定义Id我们使用javax.persistence.原创 2020-05-25 10:16:27 · 1019 阅读 · 0 评论 -
Spring Boot 2.x实战60 - Spring Data 4 - Spring Data JPA查询(根据实体属性名推导查询)
2.6 查询2.6.1 查询方法2.6.1.1 推导查询Spring Data JPA支持方法名来中的属性来推导出查询语句。public interface PersonRepository extends JpaRepository<Person, Long> { List<Person> findByNameAndAge(String name, Integer age);}根据方法名findByNameAndAge翻译成查询JPQL语句:select p原创 2020-05-26 08:07:51 · 329 阅读 · 0 评论 -
Spring Boot 2.x实战61 - Spring Data 5 - Spring Data JPA查询(JPA命名查询、JPQL、原生SQL查询)
2.6.1.2 JPA命名查询我们使用@NamedQuery注解在实体上来做命名查询。@Entity@NamedQuery(name = "Person.findByNameWyf", query = "select p from Person p where p.name = 'wyf'")public class Person {若命名的方法和推导查询的方法同名将会覆盖推导查询的方法。在PersonRepository中声明方法:public interface PersonRe原创 2020-05-27 08:12:33 · 228 阅读 · 0 评论 -
Spring Boot 2.x实战62 - Spring Data 6 - Spring Data JPA查询(排序和分页、命名参数、修改查询)
2.6.1.5 排序和分页我们只需要在Repository的方法里使用Sort作为参数即可;方法接受Pageable参数即可分页也可排序。public interface PersonRepository extends JpaRepository<Person, Long> { List<Person> findByAgeLessThan(Integer age, Sort sort); @Query("select p from Person p wher原创 2020-05-28 08:10:23 · 428 阅读 · 0 评论 -
Spring Boot 2.x实战63 - Spring Data 7 - Spring Data JPA查询(定制查询返回Projection:接口或对象)
2.6.1.8 ProjectionSpring Data JPA的查询方法一般返回的是聚合根的一个多或多个实例。我们可以使用Projection,通过聚合根的属性来定制查询返回。我们可以使用接口来定制返回值public interface PersonProjectionInterface { String getName(); //1 Address getAddress(); //2 @Value("#{target.name + ' s age is' + tar原创 2020-05-29 08:03:29 · 327 阅读 · 0 评论 -
Spring Boot 2.x实战64 - Spring Data 8 - Spring Data JPA调用数据库函数/存储过程@Procedure
2.6.2 存储过程Spring Data JPA支持使用@Procedure注解调用数据库的存储过程。我们先定义一个存储过程,入参为name,出差为prefix_name在入参的name前加上Mr./Mrs.。DROP PROCEDURE IF EXISTS add_name_prefix;DELIMITER $$CREATE PROCEDURE add_name_prefix(IN name VARCHAR(255), OUT prefix_name VARCHAR(255))BEGIN原创 2020-06-01 08:11:18 · 606 阅读 · 0 评论 -
Spring Boot 2.x实战65 - Spring Data 9 - Spring Data JPA定制查询Specification
2.6.3 Specification我们可以定义Specification来定制查询,我们需要Repository继承JpaSpecificationExecutor接口;这样我们就可以在方法中使用Specification参数了。Specification是函数接口,只有一个方法:Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder);ro原创 2020-06-02 08:28:04 · 360 阅读 · 0 评论 -
Spring Boot 2.x实战66 - Spring Data 10 - Spring Data JPA动态条件组合查询Query by Example
2.6.4 Query by ExampleQurery by Example简称QBE,它会根据部分属性已经设置的实体,动态进行查询。它主要分为3个部分:Probe:设置属性的实体;ExampleMatcher:对于实体的属性的匹配规则的设置;Example :组合Probe和ExampleMatcher进行查询。直接看代码:@BeanCommandLineRunner queryByExample(PersonRepository personRepository){ retur原创 2020-06-03 08:18:59 · 337 阅读 · 0 评论 -
Spring Boot 2.x实战67 - Spring Data 11 - Spring Data JPA事件监听
2.7 事件监听我们可以在聚合根实体上注解下面的注解来监听聚合操作的事件。@PrePersist:监听实体保存前事件;@PostPersist:监听实体保存后事件;@PreUpdate:监听实体更新前事件;@PostUpdate:监听实体更新后事件;@PreRemove:监听实体删除前事件;@PostRemove:监听实体删除后事件;@PostLoad:监听实体加载后事件。@Data@AllArgsConstructor@NoArgsConstructor@Entitypubl原创 2020-06-04 08:39:28 · 524 阅读 · 0 评论 -
Spring Boot 2.x实战68 - Spring Data 12 - Spring Data JPA领域事件(Domain Events)
2.8 领域事件由于在DDD中采用了“设计小聚合”的原则,因此避免了领域模型的相互关联,从而避免了在应用演进中形成“大泥球”(Big Ball of Mud),也因为上述的原因,本书将不讲解@OneToMany、@ManyToMany等关联注解。聚合之间在没有了关联关系后,聚合之间的数据通讯通过领域事件来完成,领域事件是由聚合根发出的。Spring Data对领域事件做了专门的支持,使用@DomainEvents注解注册领域事件或者继承AbstractAggregateRoot使用它的registerE原创 2020-06-05 08:58:43 · 1293 阅读 · 0 评论 -
Spring Boot 2.x实战69 - Spring Data 13 - Spring Data对Web MVC的支持
2.11 Web支持Spring Data也给Web开发做了一定的支持,他通过@EnableSpringDataWebSupport开启支持。它主要导入了SpringDataWebConfiguration配置,通过它注册了DomainClassConverter、PageableHandlerMethodArgumentResolver。由于SpringDataWebAutoConfiguration自动配置,我们无需再手工定义。通过DomainClassConverter让我们可以通过控制器方法路径原创 2020-06-08 08:54:13 · 250 阅读 · 0 评论 -
Spring Boot 2.x实战70 - Spring Data 14 - Spring Data JPA数据库结构初始化(hibernate正向生成、数据库脚本)
2.12 数据库初始化2.12.1 数据库结构初始化在Spring Boot下会根据我们的实体类的配置自动生成DDL(Data Definition Language数据定义语言,用来定义数据库结构),它可由下面两个外部配置属性开启(二选一):spring.jpa.generate-ddl: true是否在启动时初始化数据库结构。spring.jpa.hibernate.ddl-auto: create相对于上一种配置方式,更倾向使用这里hibernate提供的配置,它提供更细粒度的配置。原创 2020-06-09 08:12:48 · 452 阅读 · 0 评论 -
Spring Boot 2.x实战71 - Spring Data 15 - Spring Data JPA数据库迁移与版本控制(Flyway)
2.12.3 数据库迁移工具Spring Boot支持的数据库迁移工具有Flyway和Liquibase。本节演示着重讲解Flyway的用法。Spring Boot使用FlywayAutoConfiguration使用FlywayProperties来对Flyway进行自动配置,外部配置通过spring.flyway.*前缀进行。我们首先在build.gradle添加Flyway的依赖:dependencies { //... runtimeOnly 'org.flywaydb:flywa原创 2020-06-10 08:14:38 · 493 阅读 · 0 评论 -
Spring Boot 2.x实战72 - Spring Data 16 - Spring Data Elasticsearch环境准备(安装Elasticsearch与新建应用)
3.NoSQL - Spring Data Elasticsearch3.1 关于ElascticsearchElasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎。我们可以将它作为集中的数据存储,从而实现数据的快速检索和高级的分析。我们使用了Spring Data Elasticsearch后,我们可以使用熟悉的Repository变成模型,而无需使用Elasticsearch查询自定义语言。3.2 环境准备3.2.1 安装Elasticsearch使用docker co原创 2020-06-11 08:11:40 · 236 阅读 · 0 评论 -
Spring Boot 2.x实战73 - Spring Data 17 - Spring Data Elasticsearch的自动配置、索引定义(DDD的聚合)、数据操作
3.3 Spring Boot下的自动配置Spring Boot提供的Elasticearch的自动配置主要包括:RestClientAutoConfiguration:使用RestClientProperties通过spring.elasticsearch.rest.*来自动配置Elasticsearch REST客户端。类路径中依赖org.elasticsearch.client:elasticsearch-rest-client,会自动配置RestClient;类路径中的依赖org.ela原创 2020-06-11 08:20:59 · 808 阅读 · 0 评论 -
Spring Boot 2.x实战74 - Spring Data 18 - Spring Data Elasticsearch查询(根据实体属性名推导查询)与原生查询(@Query)
3.6 查询3.6.1 查询方法我们在PersonRepository内定义查询方法,这里的查询和Spring Data JPA推导查询保持一致。public interface PersonRepository extends ElasticsearchRepository<Person,String> { List<Person> findByName(String name); //1 List<Person> findByAddre原创 2020-06-12 08:18:13 · 476 阅读 · 0 评论 -
Spring Boot 2.x实战75 - Spring Data 19 - Spring Data Elasticsearch的search查询(SearchQuery)与统计分析
3.6.2 search查询ElasticsearchRepository除了给我们提供了CRUD和分页排序功能以外,还给我们提供了支持Elasticsearch API的search方法:@NoRepositoryBeanpublic interface ElasticsearchRepository<T, ID> extends ElasticsearchCrudRepository<T, ID> { //... Iterable<T> search(原创 2020-06-15 11:52:19 · 1670 阅读 · 1 评论 -
Spring Boot 2.x实战76 - Spring Data 20 - 数据缓存(Redis Cache 非仅限于Spring Data)
4.数据缓存4.1 Spring Boot与缓存缓存服务数据能极大的提升应用的性能。使用Spring缓存需使用@EnableCaching开启支持,使用注解:@Cacheable:注解方法可以被缓存;@Cacheable对于特定缓存key,方法只会执行一次,后续的请求将不执行方法而从缓存中取数据;@CachePut:注解方法触发缓存添加操作;@CachePut注解的方法每次请求都会执行;@CacheEvict:注解方法触发从缓存中移除旧数据的操作;@Caching:支持组合@Cacheable原创 2020-06-16 08:57:03 · 281 阅读 · 0 评论