1. 程式人生 > >SSH進階(六)SSSHJ---全註解開發

SSH進階(六)SSSHJ---全註解開發

SSSHJ---全註解開發

SpringMVC、Spring、SpringDataHiberanteJPA、MySQL

之前的文章當中提及過HiberanteJPA它完成的其實就是利用註解的方式將類與表,行和物件,欄位與屬性關聯起來的一種實現,在這裡我們將其與SpringData相結合共同完成持久層的開發,即利用了HiberanteJPA的註解關聯到資料庫,又利用了SpringData的所提供的方法來操作資料庫,當然你也可以使用一些自定義的方法後面會提及到.

那麼什麼是SpringData?

SpringData相關概念:

SpringData是Spring基於ORM框架、JPA規範封裝的一套

JPA應用框架,它提供了包括增刪改查在內的常用功能,且易於擴充套件,可使開發者用極簡的程式碼實現對資料庫的訪問和操作,它的可擴充套件性就體現在在,它除了可以使用本身框架提供的方法之外,還可以自定義方法來根據需求來補充,這也是當下它流行的原因吧。

之前又一篇專門講解JPA的文章,想了解的可以去細讀,這裡再提及一下:

那麼什麼是JPA呢?

JPA其實是ELB當中的實體Bean分離出來的規範,EJB3.0推出以後,實體Bean被單獨分了出來,形成了新的規範JPA

JPA全稱Java Persistence API,是sun提出的一個物件持久化規範,各JavaEE應用伺服器自主選擇具體實現。JPA

僅僅只是一個規範,而不是產品;使用JPA本身是不能做到持久化的。所以,JPA只是一系列定義好的持久化操作的介面,在系統中使用時,需要真正的實現者,之前的博文使用的實現就是hibernateJPA.

JPA的設計者是Hibernate框架的作者,因此Hibernate EntityManager作為Jboss伺服器中JPA的預設實現;Oracle的Weblogic使用EclipseLink(以前叫TopLink)作為預設的JPA實現;IBM的Websphere和Sun的Glassfish預設使用OpenJPA(Apache的一個開源專案)作為其預設的JPA實現。

JPA的底層實現是一些流行的開源ORM(物件關係對映)框架,因此JPA其實也就是java實體物件和關係型資料庫建立起對映關係,通過面向物件程式設計的思想操作關係型資料庫的規範。

而對於Spring Data JPA 來說: 致力於減少資料訪問層 (DAO) 的開發量. 開發者唯一要做的,就只是宣告持久層的介面,其他都交給 Spring Data JPA 來幫你完成!

什麼是ORM呢?

ORM,即Object-Relational Mapping(物件關係對映),它的作用是在關係型資料庫和業務實體物件之間作一個對映,這樣,我們在具體的操作業務物件的時候,就不需要再去和複雜的SQL語句打交道,只需簡單的操作物件的屬性和方法。

只要提供了持久化類與表的對映關係,ORM框架在執行時就能參照對映檔案的資訊,把物件持久化到資料庫中。當前ORM框架主要有三種:Hibernate,iBATIS,EclipseLink

下面是SpringData提供的幾個程式設計介面:

Repository:最頂層介面,是一個空介面,目的是為了統一所有的Repository的型別,且能讓元件掃描的時候自動識別;後面的專案當中會用到,下圖就是i這個頂級的介面;

CrudRepository:提供基礎的增刪改查操作;你自己可以使用註解在此基礎之上擴充套件,下面就是這個介面,繼承了頂級介面:

PagingAndSortingRepository:提供分頁和排序的操作;根據原始碼可知,你只需要傳入兩個引數,就是Page(第幾頁),size(一頁的記錄數量),當然在傳入的時候是分裝陳一個類,這個類就是Pageable

JpaRepository:增加了批量操作的功能;

JpaSpecificationExecutor 組合查詢條件,提供原生SQL查詢

接下來我們就來開發一個,簡單的體驗一下,其中在框架提供的方法當中我麼以分頁查詢為例,自定義方法我們以模糊查詢為例,而自定義事務方法我們以updatename為例:

首先我們做的就是建立專案匯入依賴:

這次用到的除了之前SSH當中用到的依賴之外,還應該加入的就是SpringDate,具體如下圖所示:

在搭建好了基本的框架之後,我們根據我們資料庫當中的表來編寫一個實體類,我們用的環視上篇博文中的javauser表,在寫好了類之後,我們更具hibernate為JPA提供的實現,給這個實體類加入註解,完成之前提到的類和表的,物件和行,屬性和欄位的關聯,一下就是我們編寫的實體類:

在此處只是提供了註解所在的地方,其餘的get,set方法大家可以自己去加,相信大家讀過之前博文的看到下面的程式碼不會陌生,這兒在來加單的說一下;

@Entity

//表示著是一個實體類
@Table(name = "javauser")

///表示這個實體類關聯的是javauser這張表

//以上兩部完成的就是我們的第一個關聯,表和類的關聯

    public class Javauser {

    @Id
//表示這是主鍵

    @GeneratedValue(strategy = GenerationType.IDENTITY)
//定義了主鍵的生成方式此處是自增長

    @Column(name = "id")
//意思是這個屬性對應的是表當中的id這個欄位
//以上三個註解完成的就是第二個關聯,行和物件的關聯

    private Integer id;

    

    @Column(name = "name")
//表示這個類的屬性對應的是資料庫表當中的name欄位

    private String name;

    

    @Column(name = "password")
//同樣這個表示對於=應表中的欄位是pasword

    private String password;//
以上兩部就完成了屬性與物件的關聯,至此三個關聯就完成了

    

    assword, javauser.password);

    }

在此處只是提供了註解所在的地方,其餘的get,set方法大家可以自己去加,相信大家讀過之前博文的看到下面的程式碼不會陌生,這兒在來加單的說一下;

@Entity

//表示著是一個實體類
@Table(name = "javauser")

///表示這個實體類關聯的是javauser這張表

//以上兩部完成的就是我們的第一個關聯,表和類的關聯

public class Javauser {

    @Id
//表示這是主鍵

    @GeneratedValue(strategy = GenerationType.IDENTITY)
//定義了主鍵的生成方式此處是自增長

    @Column(name = "id")
//意思是這個屬性對應的是表當中的id這個欄位
//以上三個註解完成的就是第二個關聯,行和物件的關聯

    private Integer id;

    @Column(name = "name")
//表示這個類的屬性對應的是資料庫表當中的name欄位

    private String name;
    @Column(name = "password")
//同樣這個表示對於=應表中的欄位是pasword

    private String password;//
以上兩部就完成了屬性與物件的關聯,至此三個關聯就完成了

至於實體類其實是可以自動生成的,之前又一篇博文講的就是hibernate的逆向工程,在生成實體類以及對映檔案的時候我們要是隻想要生成實體類,可以只勾選去生成實體類,不去生成對映檔案;

以上我們就以及基本上完成可基本的環境搭建以及基礎資源實體類的變寫,接下來同樣的套路,:

1.Dao層的開發

但要注意的就是,這裡Dao層的開發和之前的大有不同,由於SpringData的加入,在這個介面當中我們是不需要去宣告任何的方法的,當然除了你自己自定義的,當然基本的CRDU是可以完成的,至於自定義我們後面會提到;

在這個地方,我們需要去實現一個介面,就是JpaRepository之前提到過常用的幾個介面,增加了批量操作的功能,它繼承的介面是:
我們來看一下這個介面的原始碼:
由上圖我們可以知道,實現這個介面需要傳入兩個引數,一個是類,一個是id應以序列化而且它是繼承了PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T>這兩個介面,
前者的原始碼:
我們可以從這裡看到這個介面由去繼承了CrudRepository<T, ID>而這個介面又是繼承等級介面的,所以說環環相扣使得這個類具有了前者功能的時候又自己新增的功能,所以說還是比較豐富的;而且我們可以從這裡得到的一個資訊就是,這裡有一個方法Page<T> findAll(Pageable var1);它需要的就是Pageable這樣的一個類,而這個類當中就可以封裝我們傳入的引數第幾頁page以及每一頁的大小size;
以上就是我們對這個類的解讀,下面就是Dao介面的程式碼:
2.服務層的開發
當然我們也應該首先去寫一個dto的類,用於和表現層的互動;
之前的博文都有提及,這兒就不再贅述了;
服務層有它的介面以及實現類,我們用註解的方式,類實現建立物件,以及Dao物件的注入,一下就是程式碼:
介面的方法:

實現類的註解

實現的方法:

@Override

    public List<userDto> findByPage(int page, int size) {

    List<userDto> list=new ArrayList<>();

    Pageable pageable=new PageRequest(page,size);
//這兒就是對我們傳過來的引數進行封裝,然後當作引數傳入方法

    Page<Javauser> all = userDao.findAll(pageable);

    for (Javauser javauser : all) {

        userDto userDto1=new userDto();

        BeanUtils.copyProperties(javauser,userDto1);

        list.add(userDto1);

    }
//這個迴圈的迭代就是將我們遍歷出來的集合,,轉換我為我們需要的dto

    return list;

    

這樣我們的實現層就開發完畢

3.表現層的開發

同樣我們使用註解的方式來開發

@Controller

    public class UserController {

    

    @Autowired

    private Userservie userservie;
public ModelAndView Page(HttpServletRequest request){

        ModelAndView modelAndView=new ModelAndView();

           String start = request.getParameter("start");       
 String r = request.getParameter("size"); 

        List<userDto> byPage = userservie.findByPage(Integer.parseInt(start)

    , Integer.parseInt(r));

        modelAndView.addObject("PageUser",byPage);

        modelAndView.setViewName("/UserListByPage.jsp");

        return modelAndView;

    }

到這裡就完成了功能的開發,接下來就是我們的配置,雖說是全註解開發,但配置是不可少的嘛!

4.配置檔案

資料來源

   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

      <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/user?characterEncoding=utf-8"></property>

      <property name="password" value="root2"></property>

      <property name="user" value="root"></property>

      <property name="driverClass" value="com.mysql.jdbc.Driver"></property>

   </bean> 
產生實體工廠

   <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

      <property name="dataSource" ref="dataSource"></property>

      <property name="jpaProperties">完成擴充套件屬性的配置

         <props>

            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</prop>

            <prop key="format_sql">true</prop>

            <prop key="show_sql">true</prop>

         </props>

      </property>

      <!-- 註冊實體-->

      <property name="packagesToScan" value="com.ww.pojo"></property>

           <!-- jpa的介面卡,給介面,然後建立其實現來的物件,多型,父類引用子類物件-->

      <property name="jpaVendorAdapter">

         <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>

      </property>

   </bean>

   <!-- 因為Dao是沒有實類的所以用jpa的掃描來生成動態代理的是實現類,並注入之前建立的工廠物件,關聯事務管理類物件-->

   <jpa:repositories base-package="com.qf.Dao" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"></jpa:repositories>

   <!-- 建立服務層物件-->

   <context:component-scan base-package="com.qf.service"></context:component-scan>

   <!-- 建立jpa的事務管理類物件-->

   <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"></bean>

   <!-- AOP註解事務-->

    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

    </beans>

下面是配置檔案的頭部約束:

<?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:aop="http://www.springframework.org/schema/aop"
  
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:mvc="http://www.springframework.org/schema/mvc"
  
xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/data/jpa
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd  
        http://www.springframework.org/schema/mvc  
        http://www.springframework.org/schema/mvc/spring-mvc.xsd"
>
 

下面是表現層配置:

<!-- 8,建立表現層物件 也是掃描 和服務層的掃描方式是一樣的.和服務層的註解組合 -->

<context:component-scan base-package="com.qf.controller"></context:component-scan>

<!-- 9,配置註解的處理器對映器和介面卡 -->

<mvc:annotation-driven></mvc:annotation-driven>

<!--  10,檢視解析器 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

</bean>

對於前端控制器的配置和之前的博文一樣,這裡就不再贅述了;

接下來就編寫前端頁面進行測試即可;

下圖是小編在除錯的時候截的圖,我們明顯的可以看出來的就是i最後一行userDao的代理實現類;用的就是jdk代理。

接下來我們來建立一些自定義方法:

前者是一個查詢的方法,所以它是不需要事務的所以,我們只需要@Query來在方法上面定義jsql語句即可,SpringDate會自己去動態的生成它的實現類;

但對於後者來說,因為是屬於增刪改的操做它是需要事務的,所以我們換還應該在它的上面加上@Modify來宣告這是一個更改操做,還需要做的就是,在其相應的服務層上面加上@Transactional來表面這個自定義的方法是需要事務的,所以在集團操作的時候,框架會根據這兩個註解組合給我給所在的方法加上事務,否則所做的更更改是不能同步到庫找中的,下面就是後者的服務層是現方法:

@Override

@Transactional

public void updateName(int id, String name) {

    userDao.updateName(id,name);

}

之後大家可以自行編寫實現類去測試,程式碼資源可以去小編的資源上去下載;

好了今天的分享就到這裡,後還會有,組合整合,敬請期待!

相關推薦

SSHSSSHJ---註解開發

SSSHJ---全註解開發 SpringMVC、Spring、SpringData、HiberanteJPA、MySQL 之前的文章當中提及過HiberanteJPA它完成的其實就是利用註解的方式將類與表,行和物件,欄位與屬性關聯起來的一種實現,在這裡我們將其與Sprin

http協議代理

http協議 pan 設備 廣告 自動 中間 new 邏輯 反向 web代理服務器是網絡的中間實體,位於客戶端和服務器之間,扮演“中間人”的角色,作用是在各端點之間來回傳送報文。 其原理是:客戶端向代理服務器發送請求報文,代理服務器正確的處理請求和連接,然後返回響應;同時代

SQL Server表表達式

ins upd 逗號 csdn 引用 ssd 優點 暫存 可讀性 概述   SQL Server支持四種類型的表表達式:派生表,公用表表達式,視圖和內聯表值函數。 派生表 派生表是一個查詢結果生成的表,類似於臨時表。 派生表可以簡化查詢,避免使用臨時表。相比手動生成

MySQL索引

索引的優點 (1)提供資料檢索效率 (2) 提高聚合函式效率 (3)提供排序效率 (4)使用覆蓋索引可以避免回表 索引建立的四個不要 (1)選擇性低的欄位一般不要建立索引(例如:性別sex、狀態status) 說明: 但是有特殊情況,比如如果表中有個欄位叫做

深度學習--CNN卷積神經網路除錯,錯誤歷程總結

總結一下今天的學習過程 (注:我此刻的心情與剛剛三分鐘前的心情是完全不一樣的) (昨天在想一些錯誤,今天又重拾信心重新配置GPU環境,結果很失敗,不過現在好了,在尋思著今天干了什麼的時候,無意間想到是不是自己方法入口不對啊。結果果然很幸運的被我猜到了,,,哈哈哈,我的心情又

SSH8——對Hibernate快取的理解

什麼是Hibernate快取?         Hibernate是一個持久層框架,同時是ORM原理的體現,快取的概念很重要。概括的說,Hibernate是對JDBC的進一步封裝,以實現內部狀態的一

SSH7——Hibernate使用EHCache進行二級快取

       二級快取也稱為程序級的快取或SessionFactory級的快取,二級快取可以被所有的session共享。二級快取的生命週期和SessionFactory的生命週期一致,SessionF

python基礎重點講解—— 變數理解

# 變數進階(理解) ## 目標 * 變數的引用 * 可變和不可變型別 * 區域性變數和全域性變數 ## 01. 變數的引用 > * 變數 和 資料 都是儲存在 **記憶體** 中的 > * 在 `Python` 中&

mysql之細談索引、分頁與慢日誌

連表 組合索引 rar 偏移量 最小值 num glob 要求 for 索引 1、數據庫索引   數據庫索引是一種數據結構,可以以額外的寫入和存儲空間為代價來提高數據庫表上的數據檢索操作的速度,以維護索引數據結構。索引用於快速定位數據,而無需在每次訪問數據庫表時搜索數據

python學習之函數學習

python學習之函數進階二一、內置函數 zip函數: zip()是Python的一個內建函數,它接受一系列可叠代的對象作為參數,將對象中對應的 元素按順序組合成一個tuple,每個tuple中包含的是原有序列中對應序號位置的元素,然後返回由 這些tuples組成的list。若傳入參數的長度不等,則返回li

SSH深度歷險 深入淺出----- Spring事務配置的五種方式

配置 處理 數據 data easy ont get 添加 由於 這對時間在學習SSH中Spring架構,Spring的事務配置做了具體總結。在此之間對Spring的事務配置僅僅是停留在聽說的階段,總結一下。總體把控。通過這次的學習發覺Spring的事務

Python自動化開發課堂筆記【Day06】 - Python

擴展性 程序 lex 類名 人物 優點 ini 參數 self. 類與對象 面向過程的程序設計:  優點:極大的降低了程序的復雜度  缺點:一套流水線或者流程就是用來解決一個問題,生產汽水的流水線無法生產汽車,即使能,也是得大改,改一個組件,牽一發而動全身面向對象的程序設計

mysql mysql備份

mysql備份的目的: 實現災難恢復:誤操作、硬件故障、軟件故障、自然災害、黑客攻擊 註意的要點: 1、能夠容忍丟失多少數據 2、恢復數據所用的時間 3、備份需要的時間 4、是否對業務有影響 5、備份時服務器負載 備份類型 完全備份:備份整個

蘋果新的編程語言 Swift 語言--基本數據類型

保持 popu 多條語句 常量 num access 對象 程序 進制 一 、 常量和變量 Swift語言 對常量和變量的聲明進行了明白的區分 Swift語言的常量類型比C 語言的co

mysqlMHA高可用集群

mysql mha簡介: 1、MHA目前在MySQL高可用方面是一個相對成熟的解決方案,是MySQL高可用環境下故障切換和主從提升的高可用軟件 2、MHA能在短時間內完成故障切換,並且在最大程度上保證數據的一致性,以達到真正意義上的高可用 3、MHA基於mysql協議,通過mysql主從或主主進行復制 4、

Python3_程與線程中的lock互斥鎖、遞歸鎖、信號量

fun 我們 bsp 控制 支持 發生 class 線程 數據操作 1、同步鎖 (Lock) 當各個線程需要訪問一個公共資源時,會出現數據紊亂 例如: 1 import threading,time 2 def sub(): 3 global num

自己定義ViewGroup控件-----&gt;流式布局

avi ride sch get spec tracking htm out fst main.xml <?xml version="1.0" encoding="utf-8"?> <com.exa

函數

並行 自己的 習題 文件 false 聲明 方式 關鍵字 true 1.命名空間 本質:存放名字與值的綁定關系 命名空間的分類:(1)全局命名空間(變量)->位於函數體外 (2)局部命名空間(變量)->

蘋果新的編程語言 Swift 語言十三--類型檢查與類型嵌套

兩個類 nes left p s 查詢 text edi host letter 一 類型檢查 1、 類型檢查操作符 類型檢查用來檢查或轉換一個實例的類型到另外的類型的一種方式。 在Swift中,類型檢查使用is和as操作符來實現。

ArcGIS 高級地圖緩存技術[5] 地圖緩存——緩存的更新與遷移

分享 win paste margin 地圖 com left 導入 block 1.緩存遷移 在ArcGIS 10 中新加入導入/導出緩存工具 能在緊湊和松散緩存之間轉換 可以導出為離線緩存 2.拷貝緩存 1)緊湊型緩存 可使用任意工具 2)松散型緩存 Win