在我们编写代码的过程中,spring data jpa为我们的持久层提供的极大的方便,但有时spring data jpa提供的repository并不能完全满足我们开发的需求,因此就需要进行扩展。spring data jpa的repository的扩展可以对对单个repository的扩展,也可以对全局的扩展,本博客考虑的是对全局的扩展。 对单个repository的扩展可以考虑看这篇文章。
思路:(大致参考spring data jpa的官方文档,链接如下:http://docs.spring.io/spring-data/jpa/docs/1.11.1.RELEASE/reference/html/#repositories.custom-behaviour-for-all-repositories)
1、自己写一个接口继承spring data jpa 提供的Repository接口
2、编写一个自己的接口的实现类并继承SimpleJpaRepository接口
3、使用@EnableJpaRepositories注解的repositoryBaseClass属性指定我们上一步的实现类
注意事项:
1、自定义的接口上需要加上@NoRepositoryBean注解,这个注解表示我们自定义的这个接口不让spring 帮我们自动创建代理类。(为什么需要加这个注解,可以看这个。)
2、我自定义的接口中返回的是Map,这个依赖jpa的底层是hibernate的实现,如果是别的实现代码需要修改。
3、代码采用的技术是spring boot + spring data jpa
代码:
1、引入pom依赖(引入spring io,这个可以帮我们管理好jar的版本,防止jar包冲突)
<dependencyManagement> <dependencies> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>Brussels-SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
2、编写自定义的Repository接口(接口上需要加上@NoRepositoryBean这个注解)
/** * <pre> * sql repository用于执行sql语句 * @NoRepositoryBean 表示spring data jpa不为这个注解标注的接口创建实现了类 * </pre> * * @描述 * @作者 huan * @时间 2017年5月21日 - 下午7:26:01 */ @NoRepositoryBean public interface SqlRepository<T, ID extends Serializable> extends JpaRepository<T, Serializable> { Map<String, Object> executeDynamicSelectOneSql(String sql); }
3、编写接口的实现(返回Map使用了hibernate的一个特性)
/** * sql repository的基础实现 * * @描述 * @作者 huan * @时间 2017年5月21日 - 下午7:27:24 */ public class SqlRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, Serializable> implements SqlRepository<T, Serializable> { private EntityManager entityManager; public SqlRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) { super(entityInformation, entityManager); this.entityManager = entityManager; } @Override @SuppressWarnings("unchecked") public Map<String, Object> executeDynamicSelectOneSql(String sql) { Query query = entityManager.createNativeQuery(sql); return (Map<String, Object>) query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).uniqueResult(); } }
4、在spring boot的启动类上加上@EnableJpaRepositories注解,启用我们自己写的Repository
@SpringBootApplication @EnableJpaRepositories(repositoryBaseClass = SqlRepositoryImpl.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
5、application.yml中jpa的配置
server: port: 80 context-path: /bs spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost/huan?useUnicode=true&characterEncoding=utf-8 username: root password: root jpa: generate-ddl: true # show-sql: true properties: hibernate.format_sql : true
6、测试 (这个SqlRepository中的泛型Book是我的一个实体类,在这个例子中没有影响)
相关推荐
开发者可以通过 `EntityManager` 和 `EntityManagerFactory` 进行这些操作,但 Spring Data JPA 提供的 Repository 接口让这些操作更加简洁。 3. **Query Methods**:Spring Data JPA 支持通过方法名自动转换为 JPA...
通过继承`JpaRepository`或自定义Repository接口,可以轻松实现数据访问。例如,`findById`、`save`等方法都由Spring Data JPA自动提供。 3. **Querydsl**:Spring Data JPA可以与Querydsl结合使用,提供更强大的...
'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...
Spring Data JPA提供了强大的Repository抽象,允许开发者以声明式的方式定义数据操作,如查询方法。只需要在接口上定义方法名,Spring Data JPA就能自动生成对应的SQL语句。例如,`findAll()`会执行SELECT ALL查询,...
Spring Boot JpaRepository知识学习(Spring Data JPA) Spring Boot与JpaRepository是Java开发中常见的组合,它们简化了数据库操作,使得开发者可以快速构建基于Spring的应用。本文将深入探讨Spring Data JPA,它...
JpaRepository 是 Spring Data JPA 中提供的一个基础接口,它扩展自 PagingAndSortingRepository,并且增加了一些额外的、常用的操作方法。通过实现 JpaRepository 接口,开发者可以得到一系列的预定义方法,例如...
- Spring Data JPA通过提供自动化的 Repository 实现,减少了大量手动编写SQL和DAO层代码的工作。开发者只需定义Repository接口,通过简单的查询方法名即可实现复杂的数据库查询。例如,`...
5. JpaRepository接口:定义数据库操作,Spring Data JPA会自动生成实现。 6. Service层接口及实现:业务逻辑处理,调用JpaRepository接口进行数据操作。 7. FreeMarker模板文件(`.ftl`):用于生成视图。 8. 控制...
`JpaRepository`是Spring Data JPA提供的一种高级抽象,它允许我们以声明式的方式处理CRUD操作,以及执行基本的查询。 首先,我们需要理解`JpaRepository`接口的作用。它是由Spring Data JPA提供的一个基础接口,...
定义接口继承 `JpaRepository` 或自定义接口,并注入到 Spring 容器中。通过接口的方法即可完成数据的增删改查。 **6. 查询方法命名规则** Spring Data JPA 支持根据方法名自动转换为 SQL 查询,例如 `findAll()`、...
Spring Data JPA 基于Repository 模式,我们定义一个接口,继承`JpaRepository` 或`PagingAndSortingRepository`,然后可以不用编写实现类,Spring Data JPA 将自动为这些接口生成实现。 5. **自定义查询** 如果...
6. **分页和排序**:Spring Data JPA支持在查询结果中进行分页和排序,可以方便地通过Repository接口实现。 7. **存储过程**:Spring Data JPA也支持调用数据库存储过程,并将其结果转换为Java对象。 8. **JPA实体...
import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository, Long> { } ``` 无需编写任何实现,Spring Data JPA 会自动处理这些操作。 ### 5. 使用...
**SpringBoot整合SpringData JPA** 是一个现代Java开发中的常见技术栈,它结合了Spring Boot的便捷性和Spring Data JPA的数据访问效率。Spring Boot简化了应用的初始搭建以及配置,而Spring Data JPA则是Spring ...
我们可以通过继承`JpaRepository`或`CrudRepository`来创建自定义的Repository,无需编写任何DAO层的代码。例如,假设我们有一个`User`实体,我们可以定义一个`UserRepository`: ```java public interface ...
5. 创建Repository接口:定义Repository接口并继承自Spring Data JPA提供的接口,如`JpaRepository`或`PagingAndSortingRepository`。 6. 使用Repository:在服务层,通过@Autowired注解注入Repository接口,然后...
SpringDataJPA是Spring框架中用于简化数据持久层操作的一个模块,它基于Java持久层API(Java Persistence API,JPA)标准。在实际的项目开发中,SpringDataJPA能够极大程度上减少我们对于数据访问层代码的编写工作。...
4. **维护**:Spring Data JPA的Repository模式降低了代码的耦合度,而MyBatis的DAO层需要手动维护。 综上所述,Spring Data JPA在许多方面提供了便利,尤其是对于快速开发和维护,但在特定场景下,如需要高度定制...