国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring筆記04_AOP注解開發_模板_事務

youkede / 1833人閱讀

摘要:后置增強周杰倫環繞通知在切面類中添加以下方法環繞通知環繞前增強環繞前增強測試前置增強保存訂單。。。不使用事務管理。

1. Spring基于AspectJ的注解的AOP開發 1. 1 SpringAOP的注解入門

創建項目,導入jar包

需要導入Spring基礎包4+2

需要導入AOP聯盟包、AspectJ包、Spring整合Aspect包Spring-aop包

Spring整合單元測試包

引入配置文件applicationContext.xml



    

編寫目標類并配置

package com.itzhouq.spring.demo1;

public class OrderDao {
    public void save() {
        System.out.println("保存訂單。。。");
    }
    public void update() {
        System.out.println("修改訂單。。。");
    }
    public void find() {
        System.out.println("查找訂單。。。");
    }
    public String delete() {
        System.out.println("刪除訂單。。。");
        return "周杰倫";
    }
}

配置目標類,將目標類OrderDao交給Spring管理

在applicationContext.xml中添加


    

編寫切面類并配置

  package com.itzhouq.spring.demo1;
  /*
   * 切面類:注解的切面類
   */
  public class MyAspectAnno {
      
      public void before() {
          System.out.println("前置增強===============");
      }
  }

    

使用注解的AOP對目標類的方法進行增強

首先在配置文件中打開注解的AOP開發


    

在切面類上使用注解

/*
     * 切面類:注解的切面類
     */
    @Aspect    //標記該類為切面類
    public class MyAspectAnno {
        
        @Before(value="execution(* com.itzhouq.spring.demo1.OrderDao.save(..))")
        public void before() {//這個注解用來標記目標類的哪個方法使用何種增強
            System.out.println("前置增強===============");
        }
    }

測試

package com.itzhouq.spring.demo1;
  
  import javax.annotation.Resource;
  
  import org.junit.Test;
  import org.junit.runner.RunWith;
  import org.springframework.test.context.ContextConfiguration;
  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  
  /*
   * Spring的AOP注解開發測試
   */
  
  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration("classpath:applicationContext.xml")
  public class SpringDemo1 {
      @Resource(name="orderDao")    //注入OrderDao
      private OrderDao orderDao;
      
      @Test
      public void test1() {
          orderDao.save();
          orderDao.update();
          orderDao.find();
          orderDao.delete();
  //        前置增強===============
  //        保存訂單。。。
  //        修改訂單。。。
  //        查找訂單。。。
  //        刪除訂單。。。
  
      }
  }
1.2 Spring的AOP的注解通知類型 1.2.1 @Before:前置通知 1.2.2 @AfterReturning:后置通知

在刪除delete方法上使用后置通知

在切面類中添加以下方法

//后置通知
    @AfterReturning("execution(* com.itzhouq.spring.demo1.OrderDao.delete(..))")
    public void afterReturning() {
        System.out.println("后置增強==================");
    }

不用修改目標類直接測試就能實現效果

前置增強===============
保存訂單。。。
修改訂單。。。
查找訂單。。。
刪除訂單。。。
后置增強==================

后置通知還可以使用返回值

//后置通知
    @AfterReturning(value="execution(* com.itzhouq.spring.demo1.OrderDao.delete(..))", returning="result")
    public void afterReturning(Object result) {
        System.out.println("后置增強=================="+result);
    }
前置增強===============
保存訂單。。。
修改訂單。。。
查找訂單。。。
刪除訂單。。。
后置增強==================周杰倫

1.2.3 環繞通知

在切面類中添加以下方法:

//環繞通知
    @Around(value="execution(* com.itzhouq.spring.demo1.OrderDao.update(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("環繞前增強===========");
        Object obj = joinPoint.proceed();
        System.out.println("環繞前增強===========");
        return obj;
    }

測試

前置增強===============
保存訂單。。。
環繞前增強===========
修改訂單。。。
環繞前增強===========
查找訂單。。。
刪除訂單。。。
后置增強==================周杰倫

1.2.4 異常拋出通知

異常拋出通知可以獲得異常信息

在切面類中添加方法

    //異常拋出通知
    @AfterThrowing(value="execution(* com.itzhouq.spring.demo1.OrderDao.find(..))",throwing="e")
    public void afterThrowing(Throwable e) {
        System.out.println("異常拋出通知============"+e);
    }

在find方法中模擬異常

public void find() {
        System.out.println("查找訂單。。。");
        int i = 1 / 0;
    }

測試

前置增強===============
保存訂單。。。
環繞前增強===========
修改訂單。。。
環繞前增強===========
查找訂單。。。
異常拋出通知============java.lang.ArithmeticException: / by zero

1.2.5 最終通知‘

在切面類中添加方法

//最終通知
    @After(value="execution(* com.itzhouq.spring.demo1.OrderDao.find(..))")
    public void after() {
        System.out.println("最終增強============");
    }

測試

前置增強===============
保存訂單。。。
環繞前增強===========
修改訂單。。。
環繞前增強===========
查找訂單。。。
最終增強============
異常拋出通知============java.lang.ArithmeticException: / by zero

1.3 Spring的AOP的注解的切入點的注解

修改切面類

package com.itzhouq.spring.demo1;
  
  import org.aspectj.lang.ProceedingJoinPoint;
  import org.aspectj.lang.annotation.After;
  import org.aspectj.lang.annotation.AfterReturning;
  import org.aspectj.lang.annotation.AfterThrowing;
  import org.aspectj.lang.annotation.Around;
  import org.aspectj.lang.annotation.Aspect;
  import org.aspectj.lang.annotation.Before;
  import org.aspectj.lang.annotation.Pointcut;
  
  /*
   * 切面類:注解的切面類
   */
  @Aspect    //標記該類為切面類
  public class MyAspectAnno {
      
      @Before(value="MyAspectAnno.pointcut2()")
      public void before() {//這個注解用來標記目標類的哪個方法使用何種增強
          System.out.println("前置增強===============");
      }
      
      //后置通知
      @AfterReturning(value="execution(* com.itzhouq.spring.demo1.OrderDao.delete(..))", returning="result")
      public void afterReturning(Object result) {
          System.out.println("后置增強=================="+result);
      }
      
      //環繞通知
      @Around(value="MyAspectAnno.pointcut3()")
      public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
          System.out.println("環繞前增強===========");
          Object obj = joinPoint.proceed();
          System.out.println("環繞前增強===========");
          return obj;
      }
      
      //異常拋出通知
      @AfterThrowing(value="MyAspectAnno.pointcut4()",throwing="e")
      public void afterThrowing(Throwable e) {
          System.out.println("異常拋出通知============"+e);
      }
      
      //最終通知
      @After(value="MyAspectAnno.pointcut1()")
      public void after() {
          System.out.println("最終增強============");
      }
      
      //切入點注解
      @Pointcut(value="execution(* com.itzhouq.spring.demo1.OrderDao.find(..))")
      private void pointcut1() {}
      @Pointcut(value="execution(* com.itzhouq.spring.demo1.OrderDao.save(..))")
      private void pointcut2() {}
      @Pointcut(value="execution(* com.itzhouq.spring.demo1.OrderDao.update(..))")
      private void pointcut3() {}
      @Pointcut(value="execution(* com.itzhouq.spring.demo1.OrderDao.delete(..))")
      private void pointcut4() {}
  }

通過切入點的注解,可以簡化注解的代碼量

注意:使用類名.pointcut1()時候不要忘記pointcut1()是一個方法,需要帶上()才有效

2. Spring的JDBC的模板的使用 2.1 Spring的JDBC的模板

Spring的EE開發的一站式的框架,有EE開發中每一層的解決方案。Spring對持久層也提供了解決方案:ORM模塊和JDBC的模塊。

Spring提供了很多的模板用于簡化開發。

2.1.1 JDBC模板使用的入門

創建項目,引入jar包

引入基本的4+2包

數據庫驅動包

Spring的JDBC模板的jar包:事務管理tx和jdbc的包

單元測試包

創建數據庫和表

create database spring4_day03;
use spring4_day03;
create table account(
    id int primary key auto_increment,
    name varchar(20),
    money double
)

使用JDBC模板:保存數據

package com.itzhouq.spring.jdbc.demo1;
  
  import org.junit.Test;
  import org.springframework.jdbc.core.JdbcTemplate;
  import org.springframework.jdbc.datasource.DriverManagerDataSource;
  
  /*
   * JDBC的模板使用
   */
  public class JdbcDemo1 {
      @Test    //JDBC的模板的使用類似于Dbutils
      public void test1() {
          //創建連接池    這里使用Spring默認的連接池
          DriverManagerDataSource dataSource = new DriverManagerDataSource();
          dataSource.setDriverClassName("com.mysql.jdbc.Driver");
          dataSource.setUrl("jdbc:mysql:///spring4_day03");
          dataSource.setUsername("root");
          dataSource.setPassword("2626");
          
          //創建jdbc模板
          JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
          jdbcTemplate.update("insert into account values (null, ?,?)", "周杰倫",10000d);
      }
  
  }

將日志記錄的配置文件jdbc.properties拷貝到src下

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring4_day03
jdbc.username=root
jdbc.password=2626

測試能插入數據

2.1.2 將連接池和模板交給Spring管理

引入aop的jar包

引入Spring的配置文件applicationContext.xml



    
    

配置Spring的內置連接池,將連接池交給Spring管理


    
        
        
        
        
        
    

配置Spring的jdbc模板,將模板交給Spring管理


    
        
    

使用JDBC的模板

package com.itzhouq.spring.jdbc.demo1;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value="classpath:applicationContext.xml")
public class JdbcDemo2 {
    @Resource(name="jdbcTemplate")
    private JdbcTemplate jdbcTemplate;
    
    @Test
    public void test1() {
        jdbcTemplate.update("insert into account values (null, ?,?)", "趙雷",10000d);
    }
}

測試能插入數據

2.2 使用開源的數據庫連接池 2.2.1 C3P0的使用

導入jar包

com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

路徑

..spring-framework-3.0.2.RELEASE-dependenciescom.mchange.c3p0com.springsource.com.mchange.v2.c3p0

配置C3P0連接池


    
        
        
        
        
        
     
    
    
        
    

注意:C3P0連接池的核心類是:com.mchange.v2.c3p0.ComboPooledDataSource

測試能插入數據

2.2.2 DBCP的使用

引入jar包

com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar

com.springsource.org.apache.commons.pool-1.5.3.jar

路徑

..spring-framework-3.0.2.RELEASE-dependenciesorg.apache.commonscom.springsource.org.apache.commons.dbcp

..spring-framework-3.0.2.RELEASE-dependenciesorg.apache.commonscom.springsource.org.apache.commons.pool

配置DBCP的連接池


    
        屬性注入 ===============
        
        
        
        
    
    
    
    
        
    

注意:DBCP的核心類為org.apache.commons.dbcp.BasicDataSource

測試能插入數據

2.3 抽取配置到屬性文件

在src下新建配置文件jdbc.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring4_day03
jdbc.username=root
jdbc.password=2626

在Spring的配置文件中引入屬性文件


    
    
    
        
        
        
        
        
     

測試能插入數據

2.4 使用JDBC模板進行CURD操作 2.4.1 增
package com.itzhouq.spring.jdbc.demo1;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value="classpath:applicationContext.xml")
public class JdbcDemo2 {
    @Resource(name="jdbcTemplate")
    private JdbcTemplate jdbcTemplate;
    
    @Test
    public void test1() {
        jdbcTemplate.update("insert into account values (null, ?,?)", "YYY",10000d);
    }
}
2.4.2 刪
@Test
    public void test3() {//刪除
        jdbcTemplate.update("delete from account where id = ?", 5);
    }
2.4.3 改
@Test
    public void test2() {//修改
        jdbcTemplate.update("update account set name = ?, money =  ? where id = ?", "何巨濤",10000d, 6);
    }
2.4.4 查

查詢某個屬性

@Test
    public void test4() {//查詢某個屬性
        String name = jdbcTemplate.queryForObject("select name from account where id = ?", String.class, 6);
        System.out.println(name);
    }

查詢個數

@Test
    public void test5() {//查詢個數
        Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
        System.out.println(count);
    }

返回的是對象

首先要創建一個實體Account

@Test
    public void test6() {//封裝到一個對象中
        Account  account = jdbcTemplate.queryForObject("select * from account where id = ?", new MyRowMapper(), 4);
        System.out.println(account);
    }
    
    class MyRowMapper  implements RowMapper{

        @Override
        public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
            Account account = new Account();
            account.setId(rs.getInt("id"));
            account.setName(rs.getString("name"));
            account.setMoney(rs.getDouble("money"));
            return account;
        }
    }

queryForObject的第二個參數需要實現一個接口RowMapper

查詢多條記錄

@Test
    public void test7() {
        List listAccount = jdbcTemplate.query("select * from account", new MyRowMapper());
        for (Account account : listAccount) {
            System.out.println(account);
        }
    }
    
    class MyRowMapper  implements RowMapper{

        @Override
        public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
            Account account = new Account();
            account.setId(rs.getInt("id"));
            account.setName(rs.getString("name"));
            account.setMoney(rs.getDouble("money"));
            return account;
        }
    }

3. Spring的事務管理 3.1 事務的回顧 3.1.1 什么是事務

事務:邏輯上的一組操作,組成這組操作的各個單元,要么全都成功,要么全都失敗。

3.1.2 事務的特性

原子性:事務不可分割

一致性:事務執行前后數據完整性保持一致

隔離性:一個事務的執行不應該受到其他事務的影響

持久性:一旦事務結束,數據就持久化到數據庫中

3.1.3 不考慮事務的隔離性引發安全問題

讀問題

臟讀:一個事務讀到另一個事務未提交的數據

不可重復讀:一個事務讀取到另一個事務已經提交的update的數據,導致一個事務中多次查詢結果不一致

虛讀、幻讀:一個事務讀到另一個事務已經提交的insert數據,導致一個事務中多次查詢結果不一致

寫問題

丟失更新

3.1.4 解決讀問題

設置事務的隔離級別

read uncommited:未提交讀,任何讀問題都解決不了

Read commited:已提交讀,解決臟讀,但是不可重復讀和虛讀有可能發生

Repeatable read:重復讀,解決臟讀和不可重復讀,但是虛讀有可能發生

Serializable:解決所有讀問題

3.2 Spring的事務管理的API 3.2. 1 PlatformTransactionManager:平臺事務管理器

平臺事務管理器:接口,是Spring用于管理事務的真正的對象。

DataSourceTransactionManager:底層使用JDBC管理事務

HibernateTransactionManager:底層使用Hibernate管理事務

3.2.2 TransactionDefinition:事務定義信息

事務定義:用于定義事務的相關的信息,隔離級別、超時信息、傳播行為、是否只讀

3.2.3 TransactionStatus:事務的狀態

l 事務狀態:用于記錄在事務管理過程中,事務的狀態的對象。

3.2.4 事務管理的API的關系

Spring進行事務管理的時候,首先平臺事務管理器根據事務定義信息進行事務的管理,在事務管理過程中,產生各種狀態,將這些狀態的信息記錄到事務狀態的對象中。

3.3 事務的傳播行為

Spring中提供了七種事務的傳播行為

3.3.1 保證多個操作在同一個事務中

PROPAGATION_REQUIRED:默認值,如果A中有事務,使用A中的事務,如果A沒有,創建一個新的事務,將操作包含進來

PROPAGATION_SUPPORTS:支持事務,如果A中有事務,使用A中的事務。如果A沒有事務,不使用事務。

PROPAGATION_MANDATORY:如果A中有事務,使用A中的事務。如果A沒有事務,拋出異常。

3.3.2 保證多個操作不在同一個事務中

PROPAGATION_REQUIRES_NEW:如果A中有事務,將A的事務掛起(暫停),創建新事務,只包含自身操作。如果A中沒有事務,創建一個新事務,包含自身操作。

PROPAGATION_NOT_SUPPORTED:如果A中有事務,將A的事務掛起。不使用事務管理。

PROPAGATION_NEVER:如果A中有事務,報異常。

3.3.3 嵌套式事務

PROPAGATION_NESTED:嵌套事務,如果A中有事務,按照A的事務執行,執行完成后,設置一個保存點,執行B中的操作,如果沒有異常,執行通過,如果有異常,可以選擇回滾到最初始位置,也可以回滾到保存點。

3.4 事務的管理 3.4.1 案例:轉賬

創建AccountService接口

package com.itzhouq.spring.tx.demo1;
  /*
   * 轉賬的業務層的接口
   */
  public interface AccountService {
      public void transfer(String from, String to, Double money);
  }

創建接口實現類AccountServiceImpl

package com.itzhouq.spring.tx.demo1;
  /*
   * 轉賬的業務層的實現類
   */
  public class AccountServiceImpl implements AccountService {
      
      //注入DAO
      private AccountDao accountDao;
      public void setAccountDao(AccountDao accountDao) {
          this.accountDao = accountDao;
      }
  
      /**
       *     from:轉出賬戶
       *     to:轉入賬戶
       *     money:轉賬金額
       */
      @Override
      public void transfer(String from, String to, Double money) {
          accountDao.outMoney(from, money);
          int i = 1 / 0;
          accountDao.inMoney(to, money);
      }
  }

創建AccountDao接口

 package com.itzhouq.spring.tx.demo1;
  /*
   * 轉賬的DAO的接口
   */
  public interface AccountDao {
      public void outMoney(String from, Double money);
      public void inMoney(String to, Double money);
  }

創建AccountDao實現類AccountDaoImpl

package com.itzhouq.spring.tx.demo1;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
    
    @Override
    public void outMoney(String from, Double money) {
        this.getJdbcTemplate().update("update account set money=money-? where name=?", money,from);
    }

    @Override
    public void inMoney(String to, Double money) {
        this.getJdbcTemplate().update("update account set money=money+? where name=?", money,to);
    }
}

配置Service和Dao:交給Spring管理

復制applicationContext.xml文件,新建配置文件tx.xml


    
        
    
    
    
    
        
    

在Dao中編寫扣錢和加錢

配置連接池和JDBC的模板





    
    
    
    
    
 


    

在Dao中注入jdbc的模板

方法一:在Dao中直接注入

package com.itzhouq.spring.tx.demo1;

import org.springframework.jdbc.core.JdbcTemplate;

public class AccountDaoImpl implements AccountDao {
    
    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void outMoney(String from, Double money) {
        

    }

    @Override
    public void inMoney(String to, Double money) {

    }
}

方法二:AccountDaoImpl繼承JdbcDaoSupport

JdbcDaoSupport類中提供了模板,也提供了set方法

package com.itzhouq.spring.tx.demo1;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
    
    @Override
    public void outMoney(String from, Double money) {

    }

    @Override
    public void inMoney(String to, Double money) {

    }
}

所以直接在xml文件中的dao注入模板


    
        
    

方法三:繼承JdbcDaoSupport類之后直接注入連接池,這樣連接池可以自動創建模板

不用配置模板,直接dao中注入連接池



    
        
    

    
        
    

配置文件



    
    
    
        
    
    
    
    
        
     
    
    
    
    
    
        
        
        
        
        
     
    
    
        

測試

package com.itzhouq.spring.tx.demo1;
  
  import javax.annotation.Resource;
  
  import org.junit.Test;
  import org.junit.runner.RunWith;
  import org.springframework.test.context.ContextConfiguration;
  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  
  /*
   * 測試轉賬
   */
  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration("classpath:tx.xml")
  public class SpringDemo1 {
      @Resource(name="accountService")
      private AccountService accountService;
      
      @Test
      public void test1() {
          accountService.transfer("周杰倫", "鄧超", 1000d);
      }
  }

如果沒有異常能夠轉賬成功。但是沒有事務控制,一旦轉賬過程中出現異常就會出現數據丟失的現象。

3.4.2 Spring的事務管理

方式一:編程式事務,需要手動編碼【了解】

方式二:聲明式事務,通過配置實現---AOP

3.4.3 聲明式事務

XML方式的聲明式的事務管理

引入jar包

aop聯盟包

aspectJ包

aop包

Spring整合aspectJ包

配置事務管理器


    
        
    

配置增強


    
        
            
            
            
        
    

AOP的配置


    
        
        
    

測試:如果轉賬出現異常,事務自動回滾

注解方式聲明事務

引入aop的開發包

配置事務管理


    
        
    

開啟注解事務


    

在業務層添加注解

@Transactional
public class AccountServiceImpl implements AccountService {
    

測試:如果轉賬過程中出現異常,則自動回滾。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74400.html

相關文章

  • Spring學習筆記

    摘要:介紹并不局限于某一層是對象的容器幫我們管理項目中的所有對象搭建導包直接新建項目,一般的都有,除了依賴準備類書寫配置書寫代碼測試中的概念反轉控制創建對象的方式反轉了從我們自己創建對象反轉給程序來創建依賴注入將必須的屬性注入到對象當中是實現思想 1.spring介紹 spring并不局限于某一層.spring是對象的容器,幫我們管理項目中的所有對象 2.spring搭建 1.導包(idea...

    FleyX 評論0 收藏0
  • spring 入門 3 整合JDBC和AOP事務

    摘要:整合提供了很多模板整合技術持久化技術模板類中提供了一個可以操作數據庫的對象對象封裝了技術模板對象與中的非常相似準備連接池創建模板對象書寫并執行步驟導包基礎包類庫新增連接池驅動包包事務包準備數據庫本地數據庫和表書寫使用模板實現增刪改查 spring整合JDBC spring提供了很多模板整合Dao技術 ORM持久化技術 模板類 JDBC o...

    CHENGKANG 評論0 收藏0
  • SpringAOP模塊】就是這么簡單

    摘要:可以通過切入點表達式,指定攔截哪些類的哪些方法給指定的類在運行的時候植入切面類代碼。 前言 到目前為止,已經簡單學習了Spring的Core模塊、....于是我們就開啟了Spring的AOP模塊了...在講解AOP模塊之前,首先我們來講解一下cglib代理、以及怎么手動實現AOP編程 cglib代理 在講解cglib之前,首先我們來回顧一下靜態代理和動態代理....我之前就寫過了靜態代...

    whjin 評論0 收藏0
  • Spring【DAO模塊】就是這么簡單

    摘要:連接對象執行命令對象執行關閉值得注意的是,對數據庫連接池是有很好的支持的。給我們提供了事務的管理器類,事務管理器類又分為兩種,因為的事務和的事務是不一樣的。 前言 上一篇Spring博文主要講解了如何使用Spring來實現AOP編程,本博文主要講解Spring的DAO模塊對JDBC的支持,以及Spring對事務的控制... 對于JDBC而言,我們肯定不會陌生,我們在初學的時候肯定寫過非...

    NSFish 評論0 收藏0
  • 慕課網_Spring入門篇》學習總結

    摘要:入門篇學習總結時間年月日星期三說明本文部分內容均來自慕課網。主要的功能是日志記錄,性能統計,安全控制,事務處理,異常處理等等。 《Spring入門篇》學習總結 時間:2017年1月18日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:https://git...

    Ververica 評論0 收藏0

發表評論

0條評論

youkede

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<