1. 程式人生 > >Spring Data JPA 實戰(一)-體系結構及基本配置

Spring Data JPA 實戰(一)-體系結構及基本配置

Spring Data JPA 實戰(一)

一.Spring DataJPA介紹

使用Spring Data Repository將程式設計師從大量重複繁雜的資料庫層操作中解放啊出來。

二.Repository:遍歷的資料訪問層

1.  Repository的體系結構

 

2.  Repository介面介紹

2.1 Repository

Spring-Data-Commons包提供了Repository介面,該介面是一個標識介面,也是Spring dataRepository的核心介面,這個介面需要將領域類以及領域類ID的型別做為引數,主要的作用如下:

1.      能夠讓spring的基礎設定識別出使用者定義的所有Spring Data Repository。

2.      大幅簡化了各種持久化儲存的持久層實現

3.      捕獲託管的領域類和實體的ID型別

packageorg.springframework.data.repository;

import java.io.Serializable;

public abstract interface Repository<T,IDextendsSerializable> {

}

2.2  CrudRepository

CrudRepository繼承了Repository介面,並聲明瞭以下能力:

(1)儲存給定的實體。

(2)返回指定ID的實體。

(3)返回全部實體。

(4)返回實體的總數。

(5)刪除指定的實體。

(6)判斷給定的ID是否存在。

我們可以通過繼承CrudRepository介面去擴充套件我們需要的特性及服務。

CrudRepository原始碼如下:

@NoRepositoryBean

public abstract interfaceCrudRepository<T, ID extends Serializable> extends Repository<T,ID> {

         publicabstract <S extends T> S save(S paramS);

         publicabstract <S extends T> Iterable<S> save(Iterable<S>paramIterable);

         publicabstract T findOne(ID paramID);

         publicabstract boolean exists(ID paramID);

         publicabstract Iterable<T> findAll();

         publicabstract Iterable<T> findAll(Iterable<ID> paramIterable);

         publicabstract long count();

         publicabstract void delete(ID paramID);

         publicabstract void delete(T paramT);

         publicabstract void delete(Iterable<? extends T> paramIterable);

         publicabstract void deleteAll();

}

2.3  PagingAndSortingRepository

PagingAndSortingRepository 繼承了CrudRepository介面,提供了分頁與排序的功能。

例如:如果我們想查詢第二頁的20行的使用者資料,可以通過如下方式實現:

PagingAndSortingRepository<User,Long> repository = // … get access to a bean

Page<User> users =repository.findAll(new PageRequest(1, 20));

PagingAndSortingRepository原始碼如下:

public abstractinterfacePagingAndSortingRepository<T, IDextends Serializable>extends CrudRepository<T,ID> {

    public abstractIterable<T> findAll(Sort paramSort);

    public abstract Page<T>findAll(Pageable paramPageable);

}

2.4  JpaRepository

JpaRepository介面是Spring Data Jpa對Spring DataRepository的實現。該介面繼承自PagingAndSortingRepository,並進行了擴充套件。

JpaRepository原始碼如下:

@NoRepositoryBean

publicabstract interface JpaRepository<T, ID extends Serializable> extendsPagingAndSortingRepository<T, ID> {

        public abstract List<T> findAll();

        public abstract List<T>findAll(Sort paramSort);

        public abstract List<T>findAll(Iterable<ID> paramIterable);

        public abstract <S extends T>List<S> save(Iterable<S> paramIterable);

        public abstract void flush();

        public abstract <S extends T> SsaveAndFlush(S paramS);

        public abstract voiddeleteInBatch(Iterable<T> paramIterable);

        public abstract void deleteAllInBatch();

        public abstract T getOne(ID paramID);

}

3.  Repository配置

<jpa:repositories>是spring datajpa的重要配置:啟用掃描並自動建立代理。

<jpa:repositories>

    <!-- Spring Data Jpa配置 -->

    <jpa:repositoriesbase-package="com.yyjz"

        transaction-manager-ref="transactionManager"

        entity-manager-factory-ref="entityManagerFactory"

        factory-class="com.yyjz.icop.base.dao.impl.BaseDaoFactoryBean">

        <!-- <repo:exclude-filter type="regex"expression="com.yycc.construction.solr"

            />-->

    </jpa:repositories>

4.  完整JPA Xml配置檔案樣例

<?xml version="1.0" encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xmlns:tx="http://www.springframework.org/schema/tx"

      xmlns:context="http://www.springframework.org/schema/context"

      xmlns:jpa="http://www.springframework.org/schema/data/jpa"

      xmlns:task="http://www.springframework.org/schema/task"

      xmlns:aop="http://www.springframework.org/schema/aop"

      xsi:schemaLocation="http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsd

       http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd

       http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsd

       http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.0.xsd

       http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd

        http://www.springframework.org/schema/data/jpahttp://www.springframework.org/schema/data/jpa/spring-jpa.xsd"

      default-lazy-init="true">

    <description>SpringJpa配置</description>

    <!-- 如果spring用了jpa,並且型別為LocalContainerEntityManagerFactoryBean,則元件註冊在此配置檔案出現即可,其餘配置檔案可忽略

使用component來替代annotation 自動註冊bean, 並保證@Required、@Autowired的屬性被注入\ -->

    <context:component-scanbase-package="com.spring.jpa"/>

    <!-- spring啟動時掃描專案路徑下的properties檔案,後續用${key}方式取出對應值,這樣可以程式碼解耦和,後續只需修改properties檔案即可 -->

    <beanid="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

       <propertyname="locations">

           <list>

                <!-- dataSourse連線池相關屬性,程式碼不在此貼出,會放在打包好的專案裡面 -->

                <value>classpath:db.properties</value>

           </list>

       </property>

    </bean>

    <!-- 定義實體管理器工廠

        Jpa配置   LocalContainerEntityManagerFactoryBean這個選項Spring扮演了容器的角色。完全掌管JPA -->

    <beanid="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

          <!-- 指定資料來源 -->

       <propertyname="dataSource" ref="dataSource"/>

       <!-- 指定Jpa持久化實現廠商類,這裡以Hibernate為例 -->

       <propertyname="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>

       <!-- 指定Entity實體類包路徑-->

       <propertyname="packagesToScan">

           <array>

                <value>com.spring.jpa</value>

           </array>

       </property>

       <!-- 指定JPA屬性;如Hibernate中指定是否顯示SQL的是否顯示、方言等 -->

       <propertyname="jpaProperties">

           <props>

                <propkey="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>

                <propkey="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>

                <propkey="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>

                <propkey="hibernate.show_sql">true</prop>

                <propkey="hibernate.format_sql">true</prop>

                <propkey="hibernate.hbm2ddl.auto">validate</prop>

           </props>

       </property>

    </bean>

    <!-- 重要配置:啟用掃描並自動建立代理的功能  -->

    <jpa:repositoriesbase-package="com.spring.jpa" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>

    <!-- Hibernate對Jpa的實現 -->

    <beanid="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

    <!-- Jpa 事務管理器  -->

    <beanid="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

       <propertyname="entityManagerFactory" ref="entityManagerFactory"/>

    </bean>

    <!-- 開啟註解事務 -->

    <tx:annotation-driventransaction-manager="transactionManager" proxy-target-class="true"/>

    <!-- 資料來源配置,使用應用內的DBCP資料庫連線池-->

    <beanid="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">

       <!--propertyname="driverClassName" value="${db.driverClass}"/-->

       <propertyname="url" value="${db.jdbcUrl}"/>

       <propertyname="username" value="${db.user}"/>

       <propertyname="password" value="${db.password}"/>

       <!-- 配置初始化大小、最小、最大 -->

       <propertyname="initialSize" value="${db.initialSize}"/>

       <propertyname="minIdle" value="${db.minIdle}"/>

       <propertyname="maxActive" value="${db.maxActive}"/>

       <!-- 配置獲取連線等待超時的時間 -->

       <propertyname="maxWait" value="${db.maxWait}"/>

        <!--配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->

       <propertyname="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}"/>

       <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->

       <propertyname="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"/>

       <propertyname="validationQuery" value="SELECT'x' from dual"/>

       <propertyname="testWhileIdle" value="true"/>

       <propertyname="testOnBorrow" value="false"/>

       <propertyname="testOnReturn" value="false"/>

       <!-- 開啟PSCache,並且指定每個連線上PSCache的大小 -->

       <propertyname="poolPreparedStatements" value="${db.poolPreparedStatements}"/>

       <propertyname="maxPoolPreparedStatementPerConnectionSize" value="${db.maxPoolPreparedStatementPerConnectionSize}"/>

    </bean>

    <!-- 啟動對@AspectJ(面向切面)註解的支援 -->

    <aop:aspectj-autoproxy/>

</beans>