前言:
JPA全稱Java Persistence API,即Java持久化API,它為Java開發人員提供了一種對象/關系映射工具來管理Java應用中的關系數據,結合其他ORM的使用,能達到簡化開發流程的目的,使開發者能夠專注於實現自己的業務邏輯上。
Spring Jpa 能夠簡化創建 JPA 數據訪問層和跨存儲的持久層功能,用戶的持久層Dao接口只需要繼承他自己定義好的(倉庫)接口,無需再寫實現類,就可以實現對象的CRUD操作,還有分頁排序等功能。
寫本章之前本來想寫一個SpringMVC的,后來發現Jpa的配置可以大大簡化MVC框架的配置,就先研究研究Spring Data Jpa。
准備工作:
- jar包支持(不用說都知道,本章jar包待我會放在115網盤供下載)
- web.xml配置(監聽Spring容器的裝載)
- 本章采用的是阿里連接池(Druid),所以web.xml要有相關的配置
- Spring容器的配置(主要為beans和jpa)
- Jpa的主要配置(實體類管理、數據源、連接池、事務等)
- 實體類、持久層接口、業務層的創建
- 測試放在下一章節中(因為采用了SpringJunit單元測試,點擊前往)
先來看一下本章節用到的包結構--如下圖:
實例代碼演示:
****************最后我會把本章的項目打包供下載************注釋部分我盡可能詳細講解****************
jar包導入.....(略)
web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>springMVC</display-name><!-- 同時加載多個spring配置文件可用 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-config/*.xml
</param-value>
</context-param><!-- spring全局監聽 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener><!-- 下面為Druid默認配置,過濾掉多余的url地址 -->
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>.js,.gif,.jpg,.png,.css,.ico,/druid/</param-value>
</init-param>
<init-param>
<param-name>principalSessionName</param-name>
<param-value>dest_login</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping><!-- StatViewServlet是一個標准的Servlet -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping><!-- Spring Servlet,由於把bean全部交給了SpringJap,所以Spring-mvc里面現在為空 -->
<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping><!-- 首頁 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
spring-mvc.xml
<?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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 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-3.1.xsd"><span style="color: #008000;"><!--</span><span style="color: #008000;"> bean配置在spring-jpa.xml里,所以這里暫為空,用來初始化spring容器</span><span style="color: #008000;">--></span>
</beans>
spring-jpa.xml
<?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: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/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd" default-lazy-init="true"><span style="color: #0000ff;"><</span><span style="color: #800000;">description</span><span style="color: #0000ff;">></span>SpringJpa配置<span style="color: #0000ff;"></</span><span style="color: #800000;">description</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 如果spring用了jpa,並且類型為LocalContainerEntityManagerFactoryBean,則組件注冊在此配置文件出現即可,其余配置文件可忽略 使用component來替代annotation 自動注冊bean, 並保證@Required、@Autowired的屬性被注入\ </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">context:component-scan </span><span style="color: #ff0000;">base-package</span><span style="color: #0000ff;">="com.spring.jpa"</span><span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> spring啟動時掃描項目路徑下的properties文件,后續用${key }方式取出對應值,這樣可以代碼解耦和,后續只需修改properties文件即可 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="propertyPlaceholderConfigurer"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="locations"</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">list</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> dataSourse連接池相關屬性,代碼不在此貼出,會放在打包好的項目里面 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">value</span><span style="color: #0000ff;">></span>classpath:db.properties<span style="color: #0000ff;"></</span><span style="color: #800000;">value</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">list</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">property</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 定義實體管理器工廠 Jpa配置 LocalContainerEntityManagerFactoryBean這個選項Spring扮演了容器的角色。完全掌管JPA <span style="color: #008000;">--></span> <em><a title="點我跳轉" href="http://www.cnblogs.com/beiyeren/archive/2013/01/23/2873210.html" target="_blank">點我查看</a></em><span style="color: #0000ff;"><em><a title="點我跳轉" href="http://www.cnblogs.com/beiyeren/archive/2013/01/23/2873210.html" target="_blank"><span style="color: #0000ff;"> spring生成EntityManagerFactory的三種方式 </span></a></em></span></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="entityManagerFactory"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 指定數據源 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 指定Jpa持久化實現廠商類,這里以Hibernate為例 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="jpaVendorAdapter"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="hibernateJpaVendorAdapter"</span><span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 指定Entity實體類包路徑 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="packagesToScan"</span> <span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">array</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">value</span><span style="color: #0000ff;">></span>com.spring.jpa<span style="color: #0000ff;"></</span><span style="color: #800000;">value</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">array</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">property</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 指定JPA屬性;如Hibernate中指定是否顯示SQL的是否顯示、方言等 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="jpaProperties"</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">props</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">prop </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="hibernate.dialect"</span><span style="color: #0000ff;">></span>org.hibernate.dialect.Oracle10gDialect<span style="color: #0000ff;"></</span><span style="color: #800000;">prop</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">prop </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="hibernate.ejb.naming_strategy"</span><span style="color: #0000ff;">></span>org.hibernate.cfg.ImprovedNamingStrategy<span style="color: #0000ff;"></</span><span style="color: #800000;">prop</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">prop </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="hibernate.cache.provider_class"</span><span style="color: #0000ff;">></span>org.hibernate.cache.NoCacheProvider<span style="color: #0000ff;"></</span><span style="color: #800000;">prop</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">prop </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="hibernate.show_sql"</span><span style="color: #0000ff;">></span>true<span style="color: #0000ff;"></</span><span style="color: #800000;">prop</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">prop </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="hibernate.format_sql"</span><span style="color: #0000ff;">></span>true<span style="color: #0000ff;"></</span><span style="color: #800000;">prop</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">prop </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="hibernate.hbm2ddl.auto"</span><span style="color: #0000ff;">></span>validate<span style="color: #0000ff;"></</span><span style="color: #800000;">prop</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">props</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">property</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 重要配置:啟用掃描並自動創建代理的功能 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">jpa:repositories </span><span style="color: #ff0000;">base-package</span><span style="color: #0000ff;">="com.spring.jpa"</span><span style="color: #ff0000;"> transaction-manager-ref</span><span style="color: #0000ff;">="transactionManager"</span><span style="color: #ff0000;"> entity-manager-factory-ref</span><span style="color: #0000ff;">="entityManagerFactory"</span><span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> Hibernate對Jpa的實現 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="hibernateJpaVendorAdapter"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"</span><span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> Jpa 事務管理器 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="transactionManager"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.orm.jpa.JpaTransactionManager"</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="entityManagerFactory"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="entityManagerFactory"</span><span style="color: #0000ff;">/></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 開啟注解事務 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">tx:annotation-driven </span><span style="color: #ff0000;">transaction-manager</span><span style="color: #0000ff;">="transactionManager"</span><span style="color: #ff0000;"> proxy-target-class</span><span style="color: #0000ff;">="true"</span> <span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 數據源配置,使用應用內的DBCP數據庫連接池 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="com.alibaba.druid.pool.DruidDataSource"</span><span style="color: #ff0000;"> init-method</span><span style="color: #0000ff;">="init"</span><span style="color: #ff0000;"> destroy-method</span><span style="color: #0000ff;">="close"</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;">property name="driverClassName" value="${db.driverClass}"/</span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="url"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.jdbcUrl}"</span> <span style="color: #0000ff;">/></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="username"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.user}"</span> <span style="color: #0000ff;">/></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="password"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.password}"</span> <span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 配置初始化大小、最小、最大 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="initialSize"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.initialSize}"</span> <span style="color: #0000ff;">/></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="minIdle"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.minIdle}"</span> <span style="color: #0000ff;">/></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxActive"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.maxActive}"</span> <span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 配置獲取連接等待超時的時間 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxWait"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.maxWait}"</span> <span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="timeBetweenEvictionRunsMillis"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.timeBetweenEvictionRunsMillis}"</span> <span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 配置一個連接在池中最小生存的時間,單位是毫秒 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="minEvictableIdleTimeMillis"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.minEvictableIdleTimeMillis}"</span> <span style="color: #0000ff;">/></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="validationQuery"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="SELECT 'x' from dual"</span> <span style="color: #0000ff;">/></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="testWhileIdle"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="true"</span> <span style="color: #0000ff;">/></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="testOnBorrow"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="false"</span> <span style="color: #0000ff;">/></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="testOnReturn"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="false"</span> <span style="color: #0000ff;">/></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 打開PSCache,並且指定每個連接上PSCache的大小 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="poolPreparedStatements"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.poolPreparedStatements}"</span> <span style="color: #0000ff;">/></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxPoolPreparedStatementPerConnectionSize"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${db.maxPoolPreparedStatementPerConnectionSize}"</span> <span style="color: #0000ff;">/></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span> <span style="color: #008000;"><!--</span><span style="color: #008000;"> 啟動對@AspectJ(面向切面)注解的支持 </span><span style="color: #008000;">--></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">aop:aspectj-autoproxy </span><span style="color: #0000ff;">/></span>
</beans>
配置好了配置文件后,我們該來寫對應的實體類,Dao,和service了,下面給出簡單的3個類:
User 實體類

package com.spring.jpa.user;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;/**
User實體類
@author liuyt
@date 2014-10-30 下午2:27:37
*/
@Entity
@Table(name="T_SPRINGJPA_USER")
public class User {
/**
- 主鍵序列:DEFAULT_SUQUENCE 是我在oracle數據庫中創建的一個序列
MY_SUQUENCE 是給自定義的序列創建一個引用名稱
- 指我的主鍵生成策略 MY_SUQUENCE 使用的是 DEFAULT_SUQUENCE 這個序列。
*/
@SequenceGenerator(name = "MY_SUQUENCE", sequenceName = "DEFAULT_SUQUENCE")
@Id
@GeneratedValue(generator="MY_SUQUENCE")
private Long id;@Column(name="USER_NAME")
private String userName;@Column(name="USER_PASSWORD")
private String passWord;/GET***************SET*****/
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", passWord="
+ passWord + "]";
}
}
IUserDao 持久層(jpa對持久層簡化的核心基礎)
package com.spring.jpa.user;import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;/**
- 持久層接口
- @author liuyt
- @date 2014-10-30 下午2:09:48
*/
@Repository
public interface IUserDao extends PagingAndSortingRepository<User, Long>{
/**
- 通過前面的配置可以看出,Spring 對 JPA 的支持已經非常強大,開發者無需過多關注 EntityManager 的創建、事務處理等 JPA 相關的處理
- 然而spring對Jpa的支持不止於此,它要從根本上來簡化我們的業務代碼 **
- 在沒用使用jpa支持的時候,我們的代碼應該是這樣的: **
1、IUserDao 持久層接口 **
2、IUserDaoImpl 持久層實現類 **
3、IUserService 業務層接口.....后面不在列舉 **
- 每寫一個實體類,都要衍生出5、6個類來對他進行操作,即使有了注解,我們可以依賴注入方式來拿到實現類, **
- 但是通用的CRUD等操作卻不免在每個實現類里聲明,你又說,我可以定義一個父類,利用泛型反射原理就可以了, **
- 但那樣你還需要為每個Dao聲明自己的實現類來繼承你的父類 **
- 那么問題來了...(不是挖掘機技術)對持久層的簡化技術哪家強? Spring Data Jpa **
- 你唯一要做的就只是聲明持久層的接口,來繼承他自身已經封裝好的持久層接口,正如本類IUserDao一樣 **
- 可使用的接口有: **********
Repository:是 Spring Data的一個核心接口,它不提供任何方法,開發者需要在自己定義的接口中聲明需要的方法。*CrudRepository:繼承Repository,提供增刪改查方法,可以直接調用。 **
PagingAndSortingRepository:繼承CrudRepository,具有分頁查詢和排序功能(本類實例) **
JpaRepository: 繼承PagingAndSortingRepository,針對JPA技術提供的接口 **
JpaSpecificationExecutor: 可以執行原生SQL查詢 **
- 繼承不同的接口,有兩個不同的泛型參數,他們是該持久層操作的類對象和主鍵類型。 **
*/
}
這里為了方便演示,就不寫業務層接口了,直接上業務層service代碼
UserService 業務層
package com.spring.jpa.user;import java.util.List;
import javax.annotation.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
/**
User業務層,依賴持久層 IUserDao
@author liuyt
@date 2014-10-30 下午2:37:21
*/
@Service
public class UserService {
// 推薦用Resource來替代AutoWrite注解
@Resource
private IUserDao userDao;// 新增用戶
public void saveUser(User user) {
userDao.save(user);
}// 刪除用戶,參數也可以為一個含有id的User對象
public void deleteUser(Long id) {
userDao.delete(id);
}// 查詢所有user對象,findOne為查詢單個
public List<User> findAllUsers() {
return (List<User>) userDao.findAll();
}/**
- 根據一個分頁對象查詢user集合(還可以添加一個Store排序屬性)
- PageRequest 是spring自己封裝的請求分頁類,實現了Pageable接口,包涵從請求中獲得的分頁屬性(當前頁和大小)和獲取方法
- 通過調用分頁方法,返回一個Page<>一個泛型集合的分頁對象,里面包涵了通過查詢計算出的各個屬性和結果集
- 詳細類結構和屬性請參閱源碼
- @param page
- @return
*/
public Page<User> findAllUserByPage(PageRequest page) {
return (Page<User>) userDao.findAll(page);
}
}
至此,整體SpringJpa框架就搭建好了,剩下的就是寫頁面和控制器進行測試了,這里不做演示,因為會在下一章節利用SpringJUnit單元測試,通過注解的方式進行方法測試,詳情請移步:SpringJUnit4單元測試
項目源碼下載:點我下載
總結:
- 在學習期間可能jar包的導入會很頭疼,因為各類框架的jar有時候會出現不兼容的情況(點擊下載本章節jar包)(目前所用百度雲盤)到期請提醒
- 本章節用到的Druid連接池配置,詳細配置請異步度娘
- spring-jpa.xml里面可以針對不同需求,可以選擇不同的EntityManagerFactory實體類管理
- 別忘記<jpa:repositories />標簽的配置,他用來聲明Jpa涉及到的包路徑
- SpringJpa集成了聲明式事務,記得開啟注解事務即可
- 持久層的實現接口有很多,根據需求靈活選擇(本章演示有關分頁的接口,因為網上對該接口的介紹都比較粗略)
- 未涉及:其他功能:如Query查詢,Dao接口方法的新增
寫作不易,難免有疏漏和錯誤,還請慷慨指正,覺得有幫助幫忙推薦哦
ps:歡迎轉載,轉載請注明出處:http://www.cnblogs.com/liuyitian/p/4062748.html
每天多學一點點 代碼少敲一點點