SpringData使用與整合

来源:https://www.cnblogs.com/SimpleWu/archive/2018/10/06/9748669.html
-Advertisement-
Play Games

SpringData 整合源碼:鏈接: https://pan.baidu.com/s/1_dDEEJoqaBTfXs2ZWsvKvA 提取碼: cp6s(jar包自行尋找) author:SimpleWu time: 2018 10 06 20:51 1.SpringData概述 Spring D ...


SpringData

整合源碼:鏈接: https://pan.baidu.com/s/1_dDEEJoqaBTfXs2ZWsvKvA 提取碼: cp6s(jar包自行尋找)

author:SimpleWu

time: 2018-10-06 20:51

1.SpringData概述

Spring Data是Spring的一個子項目,主要用於簡化資料庫訪問,支持NoSQL和關係數據存儲,主要目標是使資料庫的訪問變得方便快捷。其中,所支持的NoSQL存儲有MongoDB (文檔資料庫)、Neo4j(圖形資料庫)、Redis(鍵/值存儲)和Hbase(列族資料庫),所支持的關係數據存儲技術有JDBC和JPA。JPA Spring Data致力於減少數據訪問層(DAO)的開發量。開發者唯一要做的是聲明持久層的介面和方法,其他交給Spring Data JPA來完成。

2.SpringData實現對資料庫的訪問

  1. Spring整合JPA
  2. 在Spring配置文件中配置SpringData讓 Spring 為聲明的介面創建代理對象。配置了 後,Spring 初始化容器時將會掃描 base-package 指定的包目錄及其子目錄,為繼承 Repository 或其子介面的介面創建代理對象,並將代理對象註冊為 Spring Bean,業務層便可以通過 Spring 自動封裝的特性來直接使用該對象。
  3. 聲明持久層的介面,該介面繼承 Repository,Repository 是一個標記型介面,它不包含任何方法,如必要,Spring Data 可實現 Repository 其他子介面,其中定義了一些常用的增刪改查,以及分頁相關的方法。
  4. 在介面中聲明需要的方法。Spring Data 將根據給定的策略(具體策略稍後講解)來為其生成實現代碼。

3.SpringData環境搭建

1.導包(Spring,Hibernate,Mysql,ehcache,c3p0,aspect)

2.首先使用Spring整合JPA(見JPA整合案例)

1)db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jpa
jdbc.user=root
jdbc.password=root

2)applicationContext.xml(copy註意包位置)

<!-- 引入外部資源文件 -->
    <context:property-placeholder location="classpath:db.properties" />
    <!-- 配置數據源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.user}" />
        <property name="password" value="${jdbc.password}" />
        <property name="driverClass" value="${jdbc.driver}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <!-- 隊列中的最小連接數 -->
        <property name="minPoolSize" value="15"></property>
        <!-- 隊列中的最大連接數 -->
        <property name="maxPoolSize" value="25"></property>
        <!-- 當連接耗盡時創建的連接數 -->
        <property name="acquireIncrement" value="15"></property>
        <!-- 等待時間 -->
        <property name="checkoutTimeout" value="10000"></property>
        <!-- 初始化連接數 -->
        <property name="initialPoolSize" value="20"></property>
        <!-- 最大空閑時間,超出時間連接將被丟棄 -->
        <property name="maxIdleTime" value="20"></property>
        <!-- 每隔60秒檢測空閑連接 -->
        <property name="idleConnectionTestPeriod" value="60000"></property>
    </bean>
    <!-- 配置entityManagerFactory -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <!-- 設置數據源 -->
        <property name="dataSource" ref="dataSource" />
        <!-- jpa註解所在的包 -->
        <property name="packagesToScan" value="com.simple.springdata.entitys" />
        <!-- 配置jpa提供商的適配器,可以通過內部bean的方式類配置 -->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
        </property>
        <!-- 配置JPA的基本屬性 -->
        <property name="jpaProperties">
            <!-- 配置jpa基本屬性 -->
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <!-- 配置二級緩存 -->
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.region.factory_class">
                    org.hibernate.cache.ehcache.EhCacheRegionFactory
                </prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
            </props>
        </property>
    </bean>
    <!-- 配置事務管理器 -->
    <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    <!-- 配置支持註解的事務 -->
    <tx:annotation-driven transaction-manager="txManager" />
    <!-- 配置自動掃描的包 -->
    <context:component-scan base-package="com.simple.springdata">
        <!-- 除了@Controller修飾的全部都要 -->
        <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

3.在Spring(applicationContext)XML配置下增加SpringDataJPA的支持

​ 1)entity-manager-factory-ref: 引用的是生成EntityManager的工廠

​ 2)transaction-manager-ref:需要對事物管理進行引用

<!-- 5、配置SpringData -->
    <jpa:repositories base-package="com.simple.springdata.dao"
        entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="txManager"></jpa:repositories>

4.添加Dao層介面,這個介面需要實現Repository。Repository是一個泛型介面Repository<要處理的類型,主鍵類型>。

5.在Dao層定義方法即可,方法是有命名規範的所以說是不能夠隨便亂寫名字。

package com.simple.springdata.service;

import org.springframework.transaction.annotation.Transactional;

import com.simple.springdata.entitys.Employee;

public interface EmployeeService {
    /**
     * 保存員工方法
     */
    @Transactional
    Employee save(Employee employee);
}

這樣就已經與我們SpringData已經與我們Spring整合完畢了。

4.繼續整合SpringMVC

在上面我們已經對Spring進行了整合,現在我們來繼續整合上SpringMVC。

1)創建SpringMVC配置文件
<!-- 掃描所有@Controller註解修飾的類 -->
    <context:component-scan base-package="com.simple.springdata">
        <context:include-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
    
    <!--將非mapping配置下的請求交給預設的Servlet來處理 -->
    <mvc:default-servlet-handler />
    <!--如果添加了預設servlet,mvc請求將無效,需要添加annotation-driven -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 配置試圖解析器 -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
2)配置WEB.XML
<!-- 解決JPA懶載入問題 -->
    <filter>
        <filter-name>OpenEntityManager</filter-name>
        <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>OpenEntityManager</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 添加Spring容器的監聽 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 編碼過濾器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 啟動SpringMVC核心控制器 -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!-- 添加PUT DELETE支持 -->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

5.Repository介面介紹

Repository 介面是 Spring Data 中的一個空介面,它不提供任何方法,我們稱為標記介面,可以在介面中聲明需要的方法。

public interface Repository<T, ID extends Serializable> { } 若我們定義的介面繼承了Repository介面,則該介面會被Spring容器識別為一個Repository類,並納入到Spring容器中。

Spring Data可以讓我們只定義介面,只要遵循 Spring Data的規範,就無需寫實現類。

與繼承 Repository 等價的一種方式,就是在持久層介面上使用 @RepositoryDefinition 註解,併為其指定 domainClass 和 idClass 屬性。

package com.simple.springdata.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.RepositoryDefinition;

import com.simple.springdata.entitys.Dept;

/**
 * @author SimpleWu
 * @RepositoryDefinition(domainClass=Dept.class,idClass=Integer.class)與繼承
 * JpaRepository<Dept, Integer>效果一致
 */
@RepositoryDefinition(domainClass=Dept.class,idClass=Integer.class)
public interface DeptDao /*extends JpaRepository<Dept, Integer>*/{

}

6.Repository 的子介面

基礎的 Repository 提供了最基本的數據訪問功能,其幾個子介面則擴展了一些功能。它們的繼承關係如下:

Repository: 僅僅是一個標識,表明任何繼承它的均為倉庫介面類

1)CrudRepository: 繼承 Repository,實現了一組 CRUD 相關的方法

2)PagingAndSortingRepository: 繼承 CrudRepository,實現了一組分頁排序相關的方法 

3)JpaRepository: 繼承 PagingAndSortingRepository,實現一組 JPA 規範相關的方法 自定義的 5)XxxxRepository 需要繼承 JpaRepository,這樣的 XxxxRepository 介面就具備了通用的數據訪問控制層的能力。4)JpaSpecificationExecutor: 不屬於Repository體系,實現一組 JPA Criteria 查詢相關的方法 

7.SpringData方法定義規範

在SpringData的Repository 介面中的方法必須滿足一定的規則。

按照 Spring Data 的規範,查詢方法以 find | read | get 開頭,涉及條件查詢時,條件的屬性用條件關鍵字連接,要註意的是:條件屬性以首字母大寫。 

public Employee getByLastNameAndGender(String lastName,String gender)

這個介面中需要處理的類型Employee,在這個類中必須有個屬性叫做LastName與gender,And是條件連接

條件的屬性名稱與個數要與參數的位置與個數一一對應

1538831364545

1538831376175

8.@Query註解

使用這個註解可以擺脫在Reponsitory介面中方法命名的規範,我們將查詢的語句直接生命在方法上

1)索引

查詢中 “?X” 個數需要與方法定義的參數個數相一致,並且順序也要一致

@Query("select d from Dept d where dno = ?1 and deptName = ?2")
    public Dept testQuery(Integer dno,String deptName);
2)命名查詢
@Query("select d from Dept d where dno = :dno and deptName = :deptName")
    public Dept testQuery(@Param("dno")Integer dno,@Param("deptName")String deptName);

9.本地SQL查詢

在註解@Query中有個參數nativeQuery將他設置為true即可開啟本地SQL查詢

@Query(value="select * from tal_dept",nativeQuery=true)
    public List<Dept> testQuery3();
註意事項

前面我們基本都是在執行查詢操作,@Query也可以做修改和刪除的操作,但不支持增加。執行修改操作時,必須使用@Modifying註解。

@Modifyingjava
@Query("UPDATE tal_dept set name = :name WHERE dno = :dno")
public int updateTest(@Param("dno")Integer id,@Param("name")String name);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 報錯: github 問題地址 https://github.com/facebook/react-native/issues/19774 如果是因為下載了新的插件或者遷移項目導致構建出現這種問題在項目根目錄下運行: 1 cd ./node_modules/react-native/third-pa ...
  • 結合設計模式,通過代碼理解面向切麵編程,有代碼的很好理解的,5分鐘可以看三遍 通過,結構型設計模式,裝飾器模式來實現AOP,代碼如下 通過,結構型設計模式,代理模式來實現AOP,代碼如下 通過Unity實現AOP,配置太複雜就不貼了。。。就一個實現類的代碼,可以用於添加方法的日誌,異常處理,不用修改 ...
  • 有效內容不超過100字,總共200字,非常建議閱讀!!! 設計模式被稱之為程式開發、系統設計、代碼優化必備之良品,老少咸宜!那究竟什麼是設計模式呢?其實設計模式就是在面向對象語言開發過程中, 遇到的種種場景和問題,提出的解決方案和思路,沉澱下來就是設計模式了!其實設計模式也就是套路,解決問題的套路。 ...
  • 1.<c:set/>給域對象賦值 2.<c:out/>獲取域對象的數據 3.<c:if/>單條件判斷 test:條件表達式。返貨true的時候,就會執行if標簽體的內容,否則不執行。 4.<c:choose/>+<c:when/>+<c:otherwise/>多條件判斷 5.<c:forEach/> ...
  • 函數(方法) 定義:如果一個功能的代碼要被覆用起來,那麼這時候可以把這裡的功能代碼封裝起來,在java中把功能代碼封裝起來的是以函數的形式體現的。 函數的格式: 修飾符 返回值類型 函數名(形式參數.....){ 需要被封裝的功能代碼; return 結果; } 例如: public static ...
  • 1. 對原元組進行插入 2. 元組的嵌套使用 3. for迴圈使用嵌套元組實例 4. 命名元組避免對分片混淆 ...
  • 題意: 設一個1-n的空間,初始1-k位置占了人,每次操作將x位置的人移動到y位置,保證輸入操作合法,求,每次操作後,空間無人的間隔,有多少個(比如01000100100有4個)。 思路: 題目給的N很大,無法用數組去模擬,一開始很蒙,但是感謝隊友的想法,我寫了很短的代碼解了這道題。首先,要觀察到, ...
  • 一、本節課程 Arx二次開發創建直線、圓、圓弧和修改對象屬性 二、本節要講解的知識點 1、如何應用C++ ARX二次開發創建直線。 2、如何應用C++ ARX二次開發創建圓。 3、如何應用C++ ARX二次開發創建圓弧。 4、如何修改對象的屬性。 5、騰訊課堂雲幽學院詳細的內容講解。 三、具體內容 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...