扩展spring data jpa的repository

阅读更多

    在我们编写代码的过程中,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包冲突


	
		
			io.spring.platform
			platform-bom
			Brussels-SR1
			pom
			import
		
	


	
		org.springframework.boot
		spring-boot-starter-data-jpa
	
	
		org.springframework.boot
		spring-boot-starter-web
	
	
		org.springframework.boot
		spring-boot-starter-test
	
	
		mysql
		mysql-connector-java
	

 2、编写自定义的Repository接口(接口上需要加上@NoRepositoryBean这个注解

/**
 * 
 * sql repository用于执行sql语句
 * @NoRepositoryBean 表示spring data jpa不为这个注解标注的接口创建实现了类
 * 
* * @描述 * @作者 huan * @时间 2017年5月21日 - 下午7:26:01 */ @NoRepositoryBean public interface SqlRepository extends JpaRepository { Map executeDynamicSelectOneSql(String sql); }

 3、编写接口的实现(返回Map使用了hibernate的一个特性

/**
 * sql repository的基础实现
 * 
 * @描述
 * @作者 huan
 * @时间 2017年5月21日 - 下午7:27:24
 */
public class SqlRepositoryImpl extends SimpleJpaRepository implements SqlRepository {
	private EntityManager entityManager;
	public SqlRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) {
		super(entityInformation, entityManager);
		this.entityManager = entityManager;
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map executeDynamicSelectOneSql(String sql) {
		Query query = entityManager.createNativeQuery(sql);
		return (Map) 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是我的一个实体类,在这个例子中没有影响
扩展spring data jpa的repository_第1张图片
 

  • 扩展spring data jpa的repository_第2张图片
  • 大小: 149.5 KB
  • 查看图片附件

你可能感兴趣的:(spring,data,jpa,spring,boot)