亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Spring Data Jpa 詳解 (配置篇)

2019-11-14 21:41:49
字體:
來源:轉載
供稿:網友
SPRing Data Jpa 詳解 (配置篇)

前言:

  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">    <!-- bean配置在spring-jpa.xml里,所以這里暫為空,用來初始化spring容器--></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">    <description>SpringJpa配置</description>        <!-- 如果spring用了jpa,并且類型為LocalContainerEntityManagerFactoryBean,則組件注冊在此配置文件出現即可,其余配置文件可忽略           使用component來替代annotation 自動注冊bean, 并保證@Required、@Autowired的屬性被注入/ -->    <context:component-scan base-package="com.spring.jpa"/>        <!-- spring啟動時掃描項目路徑下的properties文件,后續用${key }方式取出對應值,這樣可以代碼解耦和,后續只需修改properties文件即可 -->    <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">        <property name="locations">            <list>                <!-- dataSourse連接池相關屬性,代碼不在此貼出,會放在打包好的項目里面 -->                <value>classpath:db.properties</value>            </list>        </property>    </bean>        <!-- 定義實體管理器工廠         Jpa配置   LocalContainerEntityManagerFactoryBean這個選項Spring扮演了容器的角色。完全掌管JPA -->          點我查看 spring生成EntityManagerFactory的三種方式     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">           <!-- 指定數據源 -->        <property name="dataSource" ref="dataSource"/>        <!-- 指定Jpa持久化實現廠商類,這里以Hibernate為例 -->        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>        <!-- 指定Entity實體類包路徑 -->        <property name="packagesToScan" >            <array>                <value>com.spring.jpa</value>            </array>        </property>        <!-- 指定JPA屬性;如Hibernate中指定是否顯示SQL的是否顯示、方言等 -->        <property name="jpaProperties">            <props>                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>                <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>                <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>                <prop key="hibernate.show_sql">true</prop>                <prop key="hibernate.format_sql">true</prop>                <prop key="hibernate.hbm2ddl.auto">validate</prop>            </props>        </property>    </bean>        <!-- 重要配置:啟用掃描并自動創建代理的功能  -->    <jpa:repositories base-package="com.spring.jpa"  transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>        <!-- Hibernate對Jpa的實現 -->    <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>    <!-- Jpa 事務管理器  -->    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">        <property name="entityManagerFactory" ref="entityManagerFactory"/>    </bean>    <!-- 開啟注解事務 -->    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />    <!-- 數據源配置,使用應用內的DBCP數據庫連接池 -->    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">        <!--property name="driverClassName" value="${db.driverClass}"/-->        <property name="url" value="${db.jdbcUrl}" />        <property name="username" value="${db.user}" />        <property name="passWord" value="${db.password}" />        <!-- 配置初始化大小、最小、最大 -->        <property name="initialSize" value="${db.initialSize}" />        <property name="minIdle" value="${db.minIdle}" />        <property name="maxActive" value="${db.maxActive}" />        <!-- 配置獲取連接等待超時的時間 -->         <property name="maxWait" value="${db.maxWait}" />        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->        <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}" />        <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->        <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}" />        <property name="validationQuery" value="SELECT 'x' from dual" />        <property name="testWhileIdle" value="true" />        <property name="testOnBorrow" value="false" />        <property name="testOnReturn" value="false" />        <!-- 打開PSCache,并且指定每個連接上PSCache的大小 -->        <property name="poolPreparedStatements" value="${db.poolPreparedStatements}" />         <property name="maxPoolPreparedStatementPerConnectionSize" value="${db.maxPoolPreparedStatementPerConnectionSize}" />    </bean>        <!-- 啟動對@aspectJ(面向切面)注解的支持 -->     <aop:aspectj-autoproxy />    </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 + "]";    }}
User Entity

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 */@Repositorypublic 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 */@Servicepublic 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包)(由于115升級需會員,有需要留言)到期請提醒
  • 本章節用到的Druid連接池配置,詳細配置請異步度娘
  • spring-jpa.xml里面可以針對不同需求,可以選擇不同的EntityManagerFactory實體類管理
  • 別忘記<jpa:repositories />標簽的配置,他用來聲明Jpa涉及到的包路徑
  • SpringJpa集成了聲明式事務,記得開啟注解事務即可
  • 持久層的實現接口有很多,根據需求靈活選擇(本章演示有關分頁的接口,因為網上對該接口的介紹都比較粗略)
  • 未涉及:其他功能:如Query查詢,Dao接口方法的新增                    

                            寫作不易,難免有疏漏和錯誤,還請慷慨指正,覺得有幫助幫忙推薦哦

  ps:歡迎轉載,轉載請注明出處:http://www.49028c.com/liuyitian/p/4062748.html


                                             每天多學一點點 代碼少敲一點點                 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区二区三区毛片淫片| 欧美午夜影院在线视频| 国产成人极品视频| 亚洲精品91美女久久久久久久| 国产精欧美一区二区三区| 欧美又大又硬又粗bbbbb| 国产精品狼人色视频一区| 日韩亚洲第一页| 97avcom| 亚洲精选在线观看| 国内精品400部情侣激情| 国产91精品高潮白浆喷水| 久久久久这里只有精品| 国产精品无码专区在线观看| 最好看的2019年中文视频| 亚洲成色www8888| 91精品国产综合久久久久久蜜臀| 国内精品国产三级国产在线专| 久久久噜噜噜久噜久久| 日韩av最新在线观看| 久久99精品视频一区97| 亚洲人成伊人成综合网久久久| 97视频在线观看播放| 亚洲性无码av在线| 亚洲美女中文字幕| 最新69国产成人精品视频免费| 亚洲精品720p| 国产色婷婷国产综合在线理论片a| 美女视频黄免费的亚洲男人天堂| 日韩美女中文字幕| 精品一区二区三区四区在线| 91免费看国产| 91大神福利视频在线| 日韩a**中文字幕| 亚洲色在线视频| 国产福利视频一区| 亚洲午夜小视频| 91伊人影院在线播放| 91中文字幕在线观看| 久久久久久一区二区三区| 性色av一区二区三区| 日韩欧美国产高清91| 色偷偷av亚洲男人的天堂| 亚洲色图第一页| 91在线直播亚洲| 亚洲一区二区少妇| 538国产精品一区二区免费视频| 欧美激情第1页| 国色天香2019中文字幕在线观看| 国产女人18毛片水18精品| 91免费的视频在线播放| 懂色av中文一区二区三区天美| 国产精品入口福利| 日韩视频亚洲视频| 亚洲国产精品国自产拍av秋霞| 美女精品久久久| 68精品久久久久久欧美| 日韩电影免费观看在线观看| 97激碰免费视频| 一区二区三区动漫| 久久这里只有精品99| 日韩成人在线视频网站| 国产精品欧美一区二区三区奶水| 亚洲精品自在久久| 亚洲欧美国产视频| 欧美久久久精品| 色狠狠久久aa北条麻妃| 国产精品成久久久久三级| 中文字幕日韩欧美在线| 亚洲欧美日韩中文在线| 国产亚洲成精品久久| 精品一区电影国产| 黑人巨大精品欧美一区二区三区| 日韩成人黄色av| 欧美性猛交xxxx乱大交蜜桃| 日韩经典一区二区三区| 91经典在线视频| 欧美成人免费va影院高清| 国产91露脸中文字幕在线| …久久精品99久久香蕉国产| 欧美日韩国产黄| 成人激情视频小说免费下载| 久久人人爽人人| 成人黄色免费片| 欧美性猛交xxxx| 国产精品xxx视频| 在线观看欧美成人| 国产精品成久久久久三级| 久久这里有精品视频| 中文字幕亚洲欧美一区二区三区| 国产精品久久久久av免费| 亚洲欧美成人网| 欧美日在线观看| 久久国内精品一国内精品| 亚洲欧美精品在线| 在线播放日韩av| 国产成人精品免高潮在线观看| 日韩av最新在线观看| 免费99精品国产自在在线| 成人免费福利在线| 亚洲国产成人精品电影| 亚洲国产日韩欧美在线图片| 久久精品久久久久久国产 免费| 欧美性在线观看| 亚洲精品自拍视频| 97涩涩爰在线观看亚洲| 91视频九色网站| 姬川优奈aav一区二区| 日韩在线观看视频免费| 欧美多人乱p欧美4p久久| 欧美精品午夜视频| 丝袜亚洲欧美日韩综合| 亚洲欧洲免费视频| 美日韩在线视频| 日本韩国在线不卡| 欧美性videos高清精品| 九九热最新视频//这里只有精品| 日韩麻豆第一页| 国产精品久久久久av| 91精品视频免费看| 高跟丝袜一区二区三区| 久久免费视频在线| 日韩va亚洲va欧洲va国产| 亚洲精品白浆高清久久久久久| 国产精品免费视频久久久| 亚洲xxxx3d| 亚洲综合色激情五月| 国产精品伦子伦免费视频| 亚洲福利小视频| 久久久久久网站| 中文字幕亚洲欧美在线| 97超级碰碰人国产在线观看| 欧美日韩在线第一页| 欧美色视频日本版| 亚洲精品国精品久久99热一| 97精品在线观看| 欧美黄网免费在线观看| 久久精品中文字幕| 中文字幕免费国产精品| 国产国语videosex另类| 国产亚洲视频在线观看| 亚洲石原莉奈一区二区在线观看| 亚洲精品一区av在线播放| 欧美成人精品h版在线观看| 日韩av在线一区| 欧美色欧美亚洲高清在线视频| 久久久久久久一区二区三区| www.亚洲成人| 国产精品老女人精品视频| 亚洲精品一区在线观看香蕉| 日本国产一区二区三区| 欧美在线激情网| 欧美激情国产精品| 在线免费看av不卡| 九九视频直播综合网| 成人av电影天堂| 欧美综合在线第二页| 欧美精品一区在线播放| 欧美日韩中文在线观看| 亚洲一区二区三区久久| 亚洲精品美女久久久久| 亚洲加勒比久久88色综合| 亚洲人午夜精品免费| 日韩美女在线播放|