Spring Data JPA入門_SPRING-DATA-JPA
來源:互聯網
上載者:User
Spring Data是什麼 Spring Data是一個用於簡化資料庫訪問,並支援雲端服務的開源架構。其主要目標是使得對資料的訪問變得方便快捷,並支援map-reduce架構和雲端運算資料服務。 Spring Data 包含多個子項目: Commons - 提供共用的基礎架構,適合各個子項目使用,支援跨資料庫持久化 JPA - 簡化建立 JPA 資料訪問層和跨儲存的持久層功能 Hadoop - 基於 Spring 的 Hadoop 作業配置和一個 POJO 編程模型的 MapReduce 作業 Key-Value - 整合了 Redis 和 Riak ,提供多個常用情境下的簡單封裝 Document - 整合文檔資料庫:CouchDB 和 MongoDB 並提供基本的配置映射和資料庫支援 Graph - 整合 Neo4j 提供強大的基於 POJO 的編程模型 Graph Roo AddOn - Roo support for Neo4j JDBC Extensions - 支援 Oracle RAD、進階隊列和進階資料類型 Mapping - 基於 Grails 的提供對象映射架構,支援不同的資料庫 Examples - 樣本程式、文檔和圖資料庫 Guidance - 進階文檔 Spring Data JPA是什麼 由Spring提供的一個用於簡化JPA開發的架構 nSpring Data JPA能幹什麼 可以極大的簡化JPA的寫法,可以在幾乎不用寫實現的情況下,實現對資料的訪問和操作。除了CRUD外,還包括如分頁、排序等一些常用的功能。 Spring Data JPA有什麼 主要來看看Spring Data JPA提供的介面,也是Spring Data JPA的核心概念: 1:Repository:最頂層的介面,是一個空的介面,目的是為了統一所有Repository的類型,且能讓組件掃描的時候自動識別。 2:CrudRepository :是Repository的子介面,提供CRUD的功能 3:PagingAndSortingRepository:是CrudRepository的子介面,添加分頁和排序的功能 4:JpaRepository:是PagingAndSortingRepository的子介面,增加了一些實用的功能,比如:大量操作等。 5:JpaSpecificationExecutor:用來做負責查詢的介面 6:Specification:是Spring Data JPA提供的一個查詢規範,要做複雜的查詢,只需圍繞這個規範來設定查詢條件即可 HelloWorld n環境構建 在Eclipse裡面構建一個普通的Java工程,主要就是要加入一堆的jar包。 1:首先去官網下載Spring Data Common 和 Spring Data JPA的包,把裡面dist的jar包加入到工程中,這裡是spring-data-commons-1.5.0.RELEASE.jar和spring-data-jpa-1.3.2.RELEASE.jar 2:把Spring3.2.3的jar包添加到工程中 3:JPA的實現選用的是Hibernate4.2.0,總共還需要額外加入如下的jar: antlr-2.7.7.jar、aopalliance-1.0.jar、asm-3.2.jar、aspectjrt-1.7.1.jar、aspectjweaver-1.7.1.jar、commons-beanutils-1.8.3.jar、commons-codec-1.7.jar、commons-collections-3.2.1.jar、commons-dbcp-1.4.jar、commons-fileupload-1.2.2.jar、commons-io-2.4.jar、commons-lang3-3.1.jar、commons-logging-1.1.1.jar、commons-pool-1.6.jar、dom4j-1.6.1.jar、hibernate-commons-annotations-4.0.1.Final.jar、hibernate-core-4.2.0.Final.jar、hibernate-entitymanager-4.2.0.Final.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、javassist-3.15.0-GA.jar、jboss-logging-3.1.0.GA.jar、jboss-transaction-api_1.1_spec-1.0.0.Final.jar、mysql-connector-java-5.1.9.jar、slf4j-api-1.7.3.jar n實體物件,就是以前的實現方式 @Entity @Table(name="tbl_user") public class UserModel { @Id private Integer uuid; private String name; private Integer age; //省略getter/setter } nDAO的介面 public interface UserRepository extends JpaRepository<UserModel, Integer>{ //空的,可以什麼都不用寫 } 無需提供實現,Spring Data JPA會為我們搞定一切 n寫個邏輯層的Service,其實就相當於DAO的用戶端,用來測試 @Service @Transactional public class Client { @Autowired private UserRepository ur; public void testAdd(UserModel um){ ur.save(um); } public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Client c = (Client)ctx.getBean("client"); UserModel um = new UserModel(); um.setAge(1); um.setName("張三"); um.setUuid(1); c.testAdd(um); } } n同樣需要在Spring的設定檔中配置,基本跟使用註解的配置類似: <?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: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.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd "> <context:component-scan base-package="cn.javass"> <context:exclude-filter type="annotation“ expression="org.springframework.stereotype.Controller"/> </context:component-scan> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 開啟註解事務 只對當前設定檔有效 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> <jpa:repositories base-package="cn.javass" repository-impl-postfix="Impl" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"> </jpa:repositories> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="cn.javass"/> <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="MYSQL"/> <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> <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 name="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"><value>org.gjt.mm.mysql.Driver</value></property> <property name="url"><value>jdbc:mysql://localhost:3306/cc?useUnicode=true&characterEncoding=UTF-8</value></property> <property name="username"> <value>root</value> </property> <property name="password" value="cc"/> </bean> </beans> 配置完成後,可以去運行Client測試一下了,當然資料庫和表需要先準備好 也可以在<jpa:repositories>下面添加filter,形如: <repositories base-package="com.acme.repositories"> <context:exclude-filter type="regex" expression=".*SomeRepository" /> </repositories> 第二章:JpaRepository準系統 JpaRepository的準系統示範 具體的看代碼示範 其中:Pageable介面的實作類別是PageRequest,Page介面的實作類別是PageImpl。 樣本如下: Page<UserModel> p = ur.findAll(new PageRequest(0,2,new Sort(new Order(Direction. DESC,"uuid")))); System. out.println("list="+p.getContent()); 第三章:JpaRepository的查詢 直接在介面中定義查詢方法,如果是符合規範的,可以不用寫實現,目前支援的關鍵字寫法如下: Spring Data JPA架構在進行方法名解析時,會先把方法名多餘的首碼截取掉,比如 find、findBy、read、readBy、get、getBy,然後對剩下部分進行解析。 假如建立如下的查詢:findByUserDepUuid(),架構在解析該方法時,首先剔除 findBy,然後對剩下的屬性進行解析,假設查詢實體為Doc 1:先判斷 userDepUuid (根據 POJO 規範,首字母變為小寫)是否為查詢實體的一個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,繼續第二步; 2:從右往左截取第一個大寫字母開頭的字串此處為Uuid),然後檢查剩下的字串是否為查詢實體的一個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,則重複第二步,繼續從右往左