`

spring data jpa 学习笔记

阅读更多

Spring Data Jpa是Spring中为简化数据库操作,基于JPA封装的一套框架。这个框架的主要作用是为了把我们从反复,复杂的数据库操作中解放出来。

首先,Spring Data Jpa的官方学习地址:http://docs.spring.io/spring-data/jpa/docs/current/reference/html/

其次,该项目测试代码地址:https://github.com/mj3018/7-4test/tree/master/springjpaTest 这个项目上面测试了CRUDRepository接口,JpaRepository接口,JpaSpecificationExecutor接口中的

CRUD操作,多条件分页查询,自定义接口,自定义接口实现根据EntityManager进行数据库操作等

1.1 核心概念

  •      Spring Data Jpa的核心接口是Repository,这个接口是一个空接口,在使用的时候需要只需要指定该接口的Entity类(对应泛型T)及id类型(对应ID)即可。
public interface Repository<T, ID extends Serializable> {

}
  •  CRUDRepository接口,这个接口继承Repository接口,添加CRUD方法。
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {

	<S extends T> S save(S entity);	
	<S extends T> Iterable<S> save(Iterable<S> entities);	
	T findOne(ID id);	
	boolean exists(ID id);
	Iterable<T> findAll();
	Iterable<T> findAll(Iterable<ID> ids);	
	long count();
	void delete(ID id);
	void delete(T entity);	
	void delete(Iterable<? extends T> entities);
	void deleteAll();
}

 

  • PagingAndSortingRepository 继承CRUDRepository接口,新增分页与排序的功能。
public interface PagingAndSortingRepository<T, ID extends Serializable>   extends CrudRepository<T, ID> { 
  Iterable<T> findAll(Sort sort); 
  Page<T> findAll(Pageable pageable); 
}

 

  • JpaRepository 继承PagingAndSortingRepository接口,在PagingAndSortingRepository接口基础上新增了一些比较常用的数据库操作,比如:多条件查询。
@Override
<S extends T> List<S> findAll(Example<S> example);
  •  另外在SpringDataJpa中一个比较重要的接口:JpaSpecificationExecutor。通过这个接口可以实现多条件分页查询。
//多条件查询某一个具体的entity
T findOne(Specification<T> spec);


//多条件查询满足条件的所有的entity
List<T> findAll(Specification<T> spec);

//多条件分页查询
Page<T> findAll(Specification<T> spec, Pageable pageable);

//多条件排序查询
List<T> findAll(Specification<T> spec, Sort sort);

//多条件统计满足条件的总数
long count(Specification<T> spec);

 

 Specification这个是查询的条件,构造这个查询条件的方式为:User对应的是Entity类,UserDto是查询条件。

private Specification<User> buildSpecification(final UserDto userDto) {
        return new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                Predicate predicate = cb.conjunction();
                if(userDto.getName() != null) {
                    predicate.getExpressions().add(
                            cb.like(root.<String>get("name"),userDto.getName()+"%")
                    );
                }
                if(userDto.getAddress() != null) {
                    predicate.getExpressions().add(
                            cb.like(root.<String>get("address"),userDto.getAddress()+"%")
                    );
                }
                if(userDto.getPhone() != null) {
                    predicate.getExpressions().add(
                            cb.like(root.<String>get("phone"),userDto.getPhone()+"%")
                    );
                }
                return predicate;
            }
        };
    }

 

这里也把一个多条件分页查询的使用代码贴在这里吧:UserDto是查询的条件,Specification是根据UserDto封装出来的查询条件,Pageable对应的是分页条件。

@Test
    public void testMultiQueryPage(){
        UserDto userDto = new UserDto();
        userDto.setName("name");
        Specification<User> specs = buildSpecification(userDto);

        Pageable pageable = new PageRequest(1,2);
        Page<User> page = this.userService.findAdd(specs,pageable);
        Iterator<User> iterator = page.iterator();
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
            System.out.println("************************************************");
        }
        System.out.println(page.getContent());
    }
  •  spring Data Jpa配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"

       xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-4.1.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
          http://www.springframework.org/schema/cache
          http://www.springframework.org/schema/cache/spring-cache-4.1.xsd
          http://www.springframework.org/schema/data/jpa
          http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
          http://www.springframework.org/schema/data/repository
        http://www.springframework.org/schema/data/repository/spring-repository-1.5.xsd">

    <!-- scan the package and the sub package -->
    <context:component-scan base-package="com.spring"/>


    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp" />
    </bean>

    <!--配置数据库-->
    <bean class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close" id="dataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:5432/demo" />
        <property name="username" value="demo" />
        <property name="password" value="demo" />
        <property name="testOnBorrow" value="true" />
        <property name="testOnReturn" value="true" />
        <property name="testWhileIdle" value="true" />
        <property name="timeBetweenEvictionRunsMillis" value="1800000" />
        <property name="numTestsPerEvictionRun" value="3" />
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <property name="validationQuery" value="SELECT version();" />
        <property name="initialSize" value="1" />
        <property name="maxActive" value="32" />
        <property name="maxIdle" value="16" />
    </bean>
    
    <!-- 使用cglib进行动态代理 -->
    <aop:aspectj-autoproxy proxy-target-class="true" />
    <!-- 支持注解方式声明式事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
    <!-- dao -->
    <jpa:repositories base-package="com.spring.repository" repository-impl-postfix="Impl" 
                      entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager" />
    <!-- 实体管理器 -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="com.spring" />
        <property name="persistenceProvider">
            <bean class="org.hibernate.ejb.HibernatePersistence" />
        </property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="false" />
                <property name="database" value="POSTGRESQL" />
                <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
                <property name="showSql" value="true" />
            </bean>
        </property>
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
        </property>
        <property name="jpaPropertyMap">
            <map>
                <entry key="hibernate.query.substitutions" value="true 1, false 0" />
                <entry key="hibernate.default_batch_fetch_size" value="16" />
                <entry key="hibernate.max_fetch_depth" value="2" />
                <entry key="hibernate.generate_statistics" value="true" />
                <entry key="hibernate.bytecode.use_reflection_optimizer" value="true" />
                <entry key="hibernate.cache.use_second_level_cache" value="false" />
                <entry key="hibernate.cache.use_query_cache" value="false" />
            </map>
        </property>
    </bean>

    <!-- 事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <bean class="org.springframework.data.web.config.SpringDataWebConfiguration"></bean>
</beans>

 在上面这个配置文件中几个比较重要的配置有:

  • 支持SpringDataJpa数据库操作的包采用base-package、配置自定义实现Dao操作的类采用repository-impl-postfix、指定EntityManagerFactory采用entity-manager-factory-ref、事物的指定采用transaction-manager-ref
  • 接下来是实体管理器,这里需要指定persistenceProvider(就是使用SpringDataJpa的时候需要指定实现这个数据库操作的具体的实现ORM框架,这里采用Hibernate)的值为org.hibernate.ejb.HibernatePersistence。指定一个packageToScan指定扫描的包。接下来其他的配置基本上都是数据库的一些配置。

 

<!-- dao -->
    <jpa:repositories base-package="com.spring.repository" repository-impl-postfix="Impl"
                      entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager" />

 

 

<!-- 实体管理器 -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="com.spring" />
        <property name="persistenceProvider">
            <bean class="org.hibernate.ejb.HibernatePersistence" />
        </property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="false" />
                <property name="database" value="POSTGRESQL" />
                <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
                <property name="showSql" value="true" />
            </bean>
        </property>
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
        </property>
        <property name="jpaPropertyMap">
            <map>
                <entry key="hibernate.query.substitutions" value="true 1, false 0" />
                <entry key="hibernate.default_batch_fetch_size" value="16" />
                <entry key="hibernate.max_fetch_depth" value="2" />
                <entry key="hibernate.generate_statistics" value="true" />
                <entry key="hibernate.bytecode.use_reflection_optimizer" value="true" />
                <entry key="hibernate.cache.use_second_level_cache" value="false" />
                <entry key="hibernate.cache.use_query_cache" value="false" />
            </map>
        </property>
    </bean>
<!-- 事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

 

 

分享到:
评论

相关推荐

    超全面综合笔记!Spring Data Jpa 学习

    综合多家视频,超全面综合笔记!Spring Data Jpa 学习

    SpringDataJPA.md

    SpringDataJPA学习笔记

    Spring Data JPA笔记.zip

    JPA 的全称是 Java Persistence API, 即 Java 持久化 API,是 SUN 公司推出的一套基于 ORM 的规范,内部是由一系列的接口和抽象类构成。JPA 的查询语言是面向对象而非面向... 本文档包含了JPA的课件笔记与学习标注。

    Spring-data-jpa 学习笔记.docx

    ### Spring-data-jpa 学习笔记 #### 一、spring-data-jpa的简单介绍 Spring Data JPA 是 Spring Data 的一部分,它简化了基于 Java Persistence API (JPA) 的数据访问层开发工作。Spring Data 旨在减少数据访问层...

    spring-data-JPA学习笔记

    在"spring-data-JPA学习笔记"中,我们主要关注的是如何使用JPA进行CRUD操作以及一些常用的查询方法。 首先,Spring Data JPA 提供了一种基于方法名的自动查询映射机制。例如,`findByUsernameAndPassword(String ...

    优秀实践分享 Spring Data JPA2

    本文是介绍Spring-data-jpa的PPT的学习笔记,整理了Spring Data JPA相关知识配置和实践源码. 本文介绍知识点有: JPA与Spring的相关配置 JPA 方法名常用查询 JPA 使用@Query注解实现JPQL和本地自定义查询 JPA API 条件...

    spring-data的学习笔记

    ### SpringData知识点详解 #### SpringData简介 SpringData是Spring框架下的一个重要子项目,它的主要目标是为开发者提供一种统一的方式来访问不同的数据存储系统。通过SpringData,开发者能够以一致的方式处理不同...

    JPA学习笔记

    【JPA学习笔记】 JPA(Java Persistence API)是Java平台上的一个ORM(Object-Relational Mapping)规范,它提供了一种将Java对象与数据库表进行映射的机制,简化了数据库操作。JPA允许开发者使用面向对象的方式...

    2.0jpa查询学习笔记1

    在本文中,我们将深入探讨Spring Data JPA中的JpaRepository查询功能。Spring Data JPA是Spring框架的一个模块,它简化了与Java Persistence API (JPA)的交互,提供了强大的数据访问抽象,使得数据库操作变得更加...

    Spring Data JPA精讲

    **Spring Data JPA精讲** 在Java开发领域,Spring Data JPA是一个不可或缺的工具,它为开发者提供了方便快捷的方式来操作...通过学习这门课程,你将具备使用Spring Data JPA构建高效、可维护的Java应用程序的能力。

    spring Data笔记和代码

    通过学习和应用Spring Data,开发者可以更专注于业务逻辑,而不是数据访问层的实现细节,从而提高开发效率和代码质量。无论是使用关系型数据库还是NoSQL数据库,Spring Data都能提供一致的编程模型和强大的查询能力...

    《深入理解Spring Cloud与微服务构建》学习笔记(五)~SpringBoot 整合 JPA

    在本篇《深入理解Spring Cloud与微服务构建》的学习笔记中,我们将重点探讨Spring Boot如何与Java Persistence API (JPA)进行整合,从而实现高效、便捷的数据库操作。Spring Boot以其快速开发特性,大大简化了应用...

    sxau-山西农大21级 实训

    在学习Spring Data JPA时,我们还需要关注以下几个关键点: 1. **实体(Entity)**:这些是与数据库表相对应的Java类,使用`@Entity`注解标识。 2. **实体管理工厂(EntityManagerFactory)**:这是Spring Data JPA...

    Spring面试专题及答案 SpringMVC SpringCloud SpringBoot面试笔试及答案学习笔记合集.zip

    Spring Data JPA中文文档[1.4.3].pdf SpringBoot实战.pdf springboot知识导图笔记.xmind SpringBoot面试专题及答案.pdf SpringCloud参考指南.pdf SpringCloud面试专题及答案.pdf SpringMVC面试专题及答案.pdf Spring...

    基于Spring面试专题及答案 SpringMVC SpringCloud SpringBoot面试笔试及答案学习笔记合集

    Spring Data JPA中文文档[1.4.3].pdf SpringBoot实战.pdf springboot知识导图笔记.xmind SpringBoot面试专题及答案.pdf SpringCloud参考指南.pdf SpringCloud面试专题及答案.pdf SpringMVC面试专题及答案.pdf Spring...

    Spring 入门教程资料(源码源代码及课程笔记)

    8. **课程笔记**:文件名中的 "spring" 可能包含关于 Spring 框架的详细笔记,这将帮助学习者巩固理论知识,理解讲师讲解的重点。 通过这些教程,初学者能够逐步建立起对 Spring 框架的整体认识,并通过实际操作...

    spring编程学习笔记

    在"Spring笔记.pdf"、"Spring笔记1.pdf"和"Spring编程学习笔记2.pdf"中,你将找到关于这些概念的详细解释和实例,包括XML配置、注解驱动的编程、AOP的实现方式、Spring Boot的快速启动指南以及Spring MVC的...

    Spring学习笔记.zip

    Spring Data支持多种持久化技术,包括JPA(Java Persistence API)、MongoDB等,提供了统一的API和CRUD操作,以及强大的查询构造器。 **Spring Security** Spring Security是Spring生态中的安全框架,它提供了认证...

Global site tag (gtag.js) - Google Analytics