1. 程式人生 > >SSM進階(四)Spring整合Mybatis-----Aop事務

SSM進階(四)Spring整合Mybatis-----Aop事務

Spring整合Mybatis-----Aop事務

首先對於Spring整合Mybatis有兩種方式那就是使用sql絕對定位以及使用Mapper代理來進行開發,本篇博文先來介紹第一種。

       所謂的Sql絕對定位就是namespace+id得方式來進行定位;

首先對於Mybatis得介紹後面會有博文詳細介紹,簡單的說Mybatis得核心配置檔案完成得就兩個功能,一就是資料來源得設定,而就是實體得註冊(mapper層對映得註冊);

接下來就開始建立專案:

1首先建立Maven專案,匯入依賴

需要得包有Mybatis核心包,Spring,Mysql,log4j,dbcp

此外還需要generator.xml,log4j.properties得兩個資原始檔,前著是用自動生成pojo,mapper,Dao層得一個外掛,後者主要是用來產生日誌得;

建好了專案以後則通過這個外掛來生成相應得類和檔案,但是在此處我們不生產Dao及其介面,一步一步來,否則一下生成了我們也就不用幹什麼了,而且這樣分開寫便於理解,最主要得原因就是,底層完成得操做是增刪改查,但是查是不需要事務的,所以這樣我們可以提前對查進行測試;

不生成Dao介面及其實現類,只需要將這裡的Dao介面生成的位置刪除即可;

2.接下來我們就來建立Dao及其實現類

首先編寫Dao介面,裡面喜喪基本的增刪改查,

注意的地方就是:方法名要和自動生成的Mapper檔案的id一致,而其引數也要一致這樣才能通過namespace+id來絕對定位到sql語句上,從而操作資料庫;

     再就是編寫其實現類,但是這裡為例方便操作,就不用以前的QuerruRunner了,這裡Dao介面的實現類,再來繼承一個類就是SqlsessionDaosupport,因為這個類會提供Sqlsession這個物件,但前提是我們要進行注入;

分析:小編通過原始碼得是SqlsessionDaosupport這個類得內部是:

this.sqlsession=newsqlsessionTemplate(sqlsessionFactory)

所以在注入得時候,我們應該注入得就是工廠,根據注入得工廠來得到sqlsesion物件。

那麼sqlsession這個物件有什麼用呢?

我們看一個新增使用者得底層程式碼:

@Override
public void insert(User user) {
    this.getSqlSession().insert("com.qf.mapper.UserMapper.insert",user);
}

很顯然,程式碼得簡潔性一目瞭然,對於使用者得田間一句話搞定;

那麼我們來解釋一下這條語句:

1首先因為我們注入了SqlsessionFactory,SqlsessionDaosupport這個類得內部對他進行了賦值,所以我們可以通過getSqlSession()來得到這個物件,在呼叫增刪改查得方法;

2com.qf.mapper.UserMapper.insert這就花就是我們所謂得nameSpace+id通過這條語句我們就可以來定位到,生成得mapper對映檔案中得某個具體id方法,從而對資料庫進行操作;

再接下來對刪,改查的方法進行重寫即可;

@Override
public void deleteByPrimaryKey(Long id) {
        this.getSqlSession().delete("com.qf.mapper.UserMapper.insert.deleteByPrimaryKey",id);
}

@Override
public void updateByPrimaryKey(User user) {
        this.getSqlSession().update("com.qf.mapper.UserMapper.insert.updateByPrimaryKey",user);
}

@Override
public User selectByPrimaryKey(Long id) {
    User user=this.getSqlSession().selectOne("com.qf.mapper.UserMapper.insert.selectByPrimaryKey",id);
    return user;
}

通過以上的操所我們以及完成了Dad層的建立

3 整合持久層

1) 首先我們要做的就是資料來源的配置,

這個大家都比較熟悉了,再這裡就不過多的贅述,就是url Driver username password 著寫資料

2) 我們來建立sqlsession物件

同時為其關聯資料來源依據前面提到的注入;

因為第層的增刪改都是通過sqlsession來實現的所以得到的Sqlsession物件應該關聯資料庫;

下面就是具體的程式碼

建立Sqlsession物件

<bean id="SqlSessionFactoryBean"class="org.mybatis.spring.SqlSessionFactoryBean">

關聯資料來源
   <property name="dataSource"value="datasource"></property>

註冊實體相當於mybatis當中的註冊對映
    <propertyname="mapperLocations" >
        <array>
           <value>com/qf/mapper/UserMapper.xml</value>
        </array>
    </property>
</bean>

此處工廠用到的就是: SqlSessionFactoryBean

3)接下來我們就應該船艦UserDao物件

<bean name="UserDao"class="com.qf.Dao.UserDaoImpl">

在這裡我們就對sqlsession物件進行了注入
    <propertyname="sqlSessionFactory" value="SqlSessionFactoryBean"></property>
</bean>

Value就來自於之前建立的sqlsession物件的id

這樣我們就完成了初次的整合,之後進行查詢的測試即可;編寫測試類

@Test
public  void testselectByPrimaryKey(){
    ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    UserDao userDao=(UserDao) context.getBean("UserDao");
    user user=userDao.selectByPrimaryKey(5L);
    System.out.println(user.getUsername()+"--"+user.getPassword());
    context.close();
}
@Test這個宣告是junit當中的測試註解,使用這個註解就可以對單個的方法進行測試而步驟使用main函式

以上就是對查詢的測試。

4.Aop事務的整合

 首先來編寫服務層及其實現類

因為以後的資料都是從View層過來的,所以才這裡我們需要額外船艦Dto層,來建立和玉面保持一致的實體類,因為有些資料使用者是不會提交的需要我們自己設定,從而方便資料庫的管理。

編寫好服務層及其實現類之後,我們就對其進行配置以及Aop程式設計;

1)首先來說一下ServiceImpl實現類的寫法

 因為服務層接受的是頁面傳過來的引數,所以可能會有Dto型別,這是就牽扯到一個數據搬移的問題,我們有兩種方法來解決這個問題:

   一個就是建立一個底層引數的物件,用get方法將Dto的值得到

再用set方法將這個值植入剛剛建好的物件中;

   第二個就是使用BeanUtils.copypropertise(a,b)這個方法就是將a種的的資料複製到b中,但是它有一個使用的前提就是二者的型別是一致的;

廢話不多說看一段程式碼就明白了:

@Override
public void updataUser(UserDto dto) {

    User user=new User();
    BeanUtils.copyProperties(dto,user);
    userDao.updateByPrimaryKey(user);

}

2)就是我們應該再配置檔案當中注入UserDao這樣這兒才能使用userdao來呼叫底層的方法;

3)接下倆我們就來整合

ii)首先建立目標類物件,也就是服務層物件,程式碼如下

<bean id="UserService"class="com.qf.service.UserServiceImpl">

再此處對UserServiceImpl該類當中的userDao屬性來注入
    <property name="userDao"value="UserDao"></property>
</bean>

III)船艦事務管理物件

因為事務是直接由Spring框架類提供的所以我們只需建立事務管理類的物件程式碼如下:

<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <propertyname="dataSource" value="dataSource"></property>
</bean>

Class用到的就是DataSourceTransactionManager這個管理類。從而產生物件

再這個物件的內部 關聯資料來源因為事務也是可以操作資料庫的比如說時間等。

Iv)定義事務通知切面,讓事務應用到具體的方法,程式碼如下:

<tx:advice id="advice" transaction-manager="transactionManager">

讓具體的方法加事務:add,del,update加事務,find不加
           <tx:attributes>
                <tx:method name="add*"propagation="REQUIRED"/>
                <tx:method name="del*"propagation="REQUIRED"/>
                <tx:method name="updata*"propagation="REQUIRED"/>
                <tx:method name="find*"read-only="true"></tx:method>
            </tx:attributes>
</tx:advice>

Find設定為只讀;*好表示以前面的名稱開頭的方法,當然事務時應用到服務層的方法,所以指的就是服務層目標類的方法;

v)最後就是Aop程式設計

程式碼如下:

<aop:config>

建立切入點,用到的就是execution表示式即切入點表示式:
    <aop:pointcut id="mypoint"expression="execution(* com.qf.service.*.*(..))"></aop:pointcut>

形成切面advice-ref關聯公共類,pointcut-ref關聯切點所以將通知和切入點關聯就形成了切面
    <aop:advisor advice-ref="advice"pointcut-ref="mypoint"></aop:advisor>
</aop:config>

vi)最後就是對服務層編寫好的方法程序測試,程式碼如下:

@Test
public  void testInsert(){
    ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService=(UserService) context.getBean("UserService");
    UserDto user1=new UserDto();
    user1.setUsername("傅筱");
    user1.setPassword("123456");
    userService.addUser(user1);

}
@Test
public  void test(){
    ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService=(UserService) context.getBean("UserService");
    UserDto user1=new UserDto();
    user1.setId(15L);
    user1.setUsername("傅筱");
    user1.setPassword("1111");
    userService.updateUser(user1);

}

在這只是測試了兩個,其餘讀者自測。

相關推薦

SSMSpring整合Mybatis-----Aop事務

Spring整合Mybatis-----Aop事務 首先對於Spring整合Mybatis有兩種方式那就是使用sql絕對定位以及使用Mapper代理來進行開發,本篇博文先來介紹第一種。        所謂的Sql絕對定位就是namespace+id得方式來進行定位

MongoDBSpring整合MongoDBSpring Data MongoDB

        最近比較忙,忙的都沒空理csdn了,今天我繼續邁著魔鬼般的步伐,摩擦摩擦……總結下最近學到的MongoDB的知識。 1.認識Spring Data MongoDB         之前還的確不知道Spring連整合Nosql的東西都實現了,還以為自己又要

springboot-web——單元測試

context ice 通過 contex png www. throws .com 基礎知識 一、概述   基礎知識,參考:https://www.cnblogs.com/ysw-go/p/5447056.html 二、springboot的單元測試   1.入門測

CSSmargin

off clas gin 提升 list div 保持 tom 觸發 margin 元素尺寸:border-box DOM屬性裏的offsetWidth 和offsetHeight 元素內部尺寸: padding-box DOM屬性裏的clientWidth 和 clie

SpringCloud從入門到——使用SpringBoot搭建微服務

wid web api 進入 con cloud val 讀取 pat ase 內容   SpringBoot整合SpringCloud的Eureka、Zuul等組件,快速實現簡單易懂且具有服務熔斷、負載均衡的分布式架構1.0,體驗微服務的魅力。 版本   IDE:IDEA

Jdbc

***************************資料庫的隔離級別**************************** mysql 資料庫 這4種隔離級別都支援 預設的隔離級別 可重複讀 oracle 只支援 讀已提交、序列化 預設的隔離級別是 讀已提交   一.讀未提交 會出現髒

SpringCloud從入門到——生產環境下Eureka的完全分布式部署

分開 -s rip linux mas 此外 實例名 leo 版本 內容   由於前兩節的內容我們知道,開啟了preferIpAddress後,Eureka的偽分布式部署會提示replica不可用。這一節我們講解如何在生產環境下部署完全分布式的Eureka集群,確保開啟了p

SpringCloud從入門到——生產環境下Eureka的完全分散式部署

內容   由於前兩節的內容我們知道,開啟了preferIpAddress後,Eureka的偽分散式部署會提示replica不可用。這一節我們講解如何在生產環境下部署完全分散式的Eureka叢集,確保開啟了preferIpAddress後replica的可用性。 版本   IDE:IDEA 2017.2.

JavaScriptform表單校驗

前言       本章將學習表單的校驗,作為一個前面學習的總結! 方法 1.概念 我們知道,在學習HTML的時候,我們做了一個非常醜陋的表單,裡面有文字框、單選鈕、複選框等一系列表單元素。這些都是隨便填寫的,沒有加任何的校驗。也就是說正常情況下我們需

Android:Activity啟動過程(最詳細&最簡單)

1.前言 最近一直在看 《Android進階解密》 的一本書,這本書編寫邏輯、流程都非常好,而且很容易看懂,非常推薦大家去看看(沒有收廣告費,單純覺得作者寫的很好)。 上一篇簡單的介紹了Android進階(三):Application啟動過程(最詳細&最簡單)

DataBinding

自定義屬性: Databinding提供了@BindingAdapter(“屬性名”)註解來完成自定義屬性。 如果要繫結多個屬性,屬性之間用英文的逗號隔開,例如@BindingAdapter(“bind:image” , “bind:test” ) 在JavaBean中定義

maven 專案 spring整合springMVC開發統一接入API準備工作:第二部分

介面虛擬碼流程(為啥是虛擬碼,這裡就是很一般的寫法,給人蔘考吧):/** @Controller:宣告是springMVC的響應元件 @RequestMapping(value = "/apicenter"):定義介面路徑 */ @Controller public class Api

前端React和Redux

React和Redux是相互獨立的兩個框架。 一、React React 是一個採用宣告式,高效而且靈活的用來構建使用者介面的框架。具體參考React中文。 React解決的問題(或者說React的優勢)是: (1)通過給予程式設計師一個虛擬DOM供其渲染,這樣就

ActiveMQ學習Spring整合ActiveMQ

因為2018年的第一場雪,比以往時候來的更晚一些,所以,本篇文章隔了近5個月才更新,抱歉來的有點晚了各位,不是人造革,皮是真的皮,啊彌陀佛,罪過罪過……本篇,將繼續跟隨以往的腳步,使用Spring MVC+ActiveMQ+Maven+Tomcat,做一個

Dagger2

組織Component Component之間的關係有 依賴(dependencies),包含(SubComponent),繼承方式(extends)。我們在一個專案之中不可能只使用一個Component聯結器來注入物件完成注入工作,一般除了一個全域性的App

Android:Activity啟動過程(最詳細&最簡單)

1.前言 最近一直在看 《Android進階解密》 的一本書,這本書編寫邏輯、流程都非常好,而

Spring Boot 2.x整合Mybatis種方式

前言 目前的大環境下,使用Mybatis作為持久層框架還是佔了絕大多數的,下面我們來說一下使用Mybatis的幾種姿勢。 姿勢一:

Mybatis學習————— Spring整合mybatis

一、Spring整合mybatis思路           非常簡單,這裡先回顧一下mybatis最基礎的根基,       mybatis,有兩個配置檔案         全域性配置檔案SqlMapConfig.xml(配置資料來源,全域性變數,載入對映檔案等東西)         對映檔案xxxM

mybatis7---spring整合mybatis進行自動生成程式碼

1、引入mybatis的generator包 <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-

springMVC系列之 spring+springMVC+hibernate 三大框架整合

         首先我們要知道Hibernate五大物件:,本例項通過深入的使用這五大物件和spring+springMVC相互結合,體會到框架的好處,提高我們的開發效率          Hibernate有五大核心介面,分別是:Session Transaction