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>