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

資訊專欄INFORMATION COLUMN

Learn Spring - Spring DAO

高璐 / 2024人閱讀

摘要:概念的異常體系建立在運行期異常的基礎上,封裝了源異常數據訪問流程準備資源啟動事務在事務中執行具體數據訪問操作提交回滾事務關閉資源,處理異常將相同的數據訪問流程固化到模板類中,把數據訪問中固定和變化的部分分開,同時保證模板類是線程安全的。

1. 概念

Spring的DAO異常體系建立在運行期異常的基礎上,封裝了源異常

JDBC數據訪問流程:

準備資源

啟動事務

在事務中執行具體數據訪問操作

提交/回滾事務

關閉資源,處理異常

Spring將相同的數據訪問流程固化到模板類中,把數據訪問中固定和變化的部分分開,同時保證模板類是線程安全的。Spring為不同的持久化技術都提供了簡化操作的模板和回調

數據庫事務:原子性,一致性,隔離性和持久性(ACID)

5類數據庫并發問題:

臟讀:A事務讀取到B事務尚未提交的數據

不可重復讀:A事務中讀取到B事務已經提交的==更新==數據,即連續兩次讀取結果不同

幻讀:A事務讀取B事務的==新增==數據

第一類更新丟失:A事務撤銷時覆蓋了B事務的提交

第二類更新丟失:A事務覆蓋B事務已經提交的數據

JDBC默認情況下自動提交,即每條執行的SQL語句都對應一個事務,AutoCommit = TRUE

Spring基于ThreadLocal解決有狀態的Connetion的并發問題,事務同步管理器org.springframework.transaction.support.TransactionSynchronizationManager使用ThreadLocal為不同事務線程提供獨立的資源副本

Spring事務管理基于3個接口:TransactionDefinitionTransactionStatusPlatformTransactionManager

Spring為不同持久化技術提供了從TransactionSynchronizationManager獲取對應線程綁定資源的工具類,如DataSourceUtils.getConnection(DataSource dataSource)。模板類在內部通過工具類訪問TransactionSynchronizationManager中的線程綁定資源

Spring通過事務傳播行為控制當前的事務如何傳播到被嵌套調用的目標服務接口方法中

使用對標注@Transactional注解的bean進行加工處理,織入事務管理切面

@Transactional注解的屬性

事務傳播行為:propagation,默認PROPAGATION_REQUIRED,即如果當前沒有事務,就新建一個事務;否則加入到當前事務

事務隔離級別:isolation,默認ISOLATION_DEFAULT

讀寫事務屬性:readOnly

超時時間:timeout

回滾設置:rollbackForrollbackForClassNamenoRollbackFornoRollbackForClassName

在相同線程中進行相互嵌套調用的事務方法工作于相同的事務中;如果在不同線程中,則工作在獨立的事務中

特殊方法:

注解不能被繼承,所以業務接口中的@Transactional注解不會被業務實現類繼承;方法處的注解會覆蓋類定義處的注解

對于基于接口動態代理的AOP事務,由于接口方法都是public的,實現類的實現方法必須是public的,同時不能使用static修飾符。因此,可以通過接口動態代理實施AOP增強、實現Spring事務的方法只能是publicpublic final

基于CGLib動態代理實施AOP的時候,由于使用finalstaticprivate的方法不能被子類覆蓋,相應的,這些方法不能實施AOP增強,實現事務

不能被Spring進行AOP事務增強的方法不能啟動事務,但是外層方法的事務上下文仍然可以傳播到這些方法中

2. Spring中使用JDBC編程示例

本地mysql建表

CREATE TABLE `t_user` (
  `user_id` varchar(256) NOT NULL,
  `user_name` varchar(256) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

springDAO.xml




    

    

    

    

User

package com.data;

public class User {

    private String userId;

    private String userName;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

}

BaseDAO

package com.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

public class BaseDAO {

    @Autowired
    protected JdbcTemplate jdbcTemplate;
}

UserDAO

package com.dao;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.data.User;
import com.mapper.UserRowMapper;

@Repository
public class UserDAO extends BaseDAO {

    private static final String SQL_GET_USER = "select * from t_user where " + "user_id = ?;";

    private static final String SQL_INSERT_USER = "insert into t_user values(?, ?);";

    private static final String SQL_CLEAN_USER = "delete from t_user where 1=1;";

    @Transactional
    public User getUserById(String userId) {
    return jdbcTemplate.queryForObject(SQL_GET_USER, new Object[]{userId}, new UserRowMapper());
    }

    @Transactional
    public int insertUser(User user) {
        return jdbcTemplate.update(SQL_INSERT_USER, user.getUserId(), user.getUserName());
    }

    @Transactional
    public int cleanUser() {
        return jdbcTemplate.update(SQL_CLEAN_USER);
    }
}

UserRowMapper

package com.dao;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

import com.data.User;

public class UserRowMapper implements RowMapper{

    public User mapRow(ResultSet rs, int rowNumber) throws SQLException {
        User user = new User();
        user.setUserId(rs.getString("user_id"));
        user.setUserName(rs.getString("user_name"));
        return user;
    }
}

BaseTestCase

package com;

import org.junit.Assert;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/springDAO.xml"})
public class BaseTestCase extends Assert {

}

TestUserDAO

package com.dao;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.BaseTestCase;
import com.data.User;

public class TestUserDAO extends BaseTestCase{

    @Before
    @After
    public void clean() {
        dao.cleanUser();
    }

    @Autowired
    private UserDAO dao;

    @Test
    public void getUserById() {
        User user = new User();
        String id = "id";
        String name = "name";
        user.setUserId(id);
        user.setUserName(name);
        assertEquals(dao.insertUser(user), 1);

        user = dao.getUserById(id);
        assertEquals(user.getUserId(), id);
        assertEquals(user.getUserName(), name);
    }
}

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

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

相關文章

  • 貓頭鷹的深夜翻譯:使用SpringBoot和AspectJ實現AOP

    摘要:我們會寫切面來攔截對這些業務類和類的調用。切面定義何時攔截一個方法以及做什么和在一起成為切面連接點當代碼開始執行,并且切點的條件滿足時,通知被調用。 前言 這篇文章會幫助你使用Spring Boot Starter AOP實現AOP。我們會使用AspectJ實現四個不同的通知(advice),并且新建一個自定義的注解來追蹤方法的執行時間。 你將會了解 什么是交叉分割關注點(cross...

    meislzhua 評論0 收藏0
  • Beetl 快速入門

    摘要:簡單快速了解是前端視圖填充數據的工具,是個頁面模板,可以像表達式那樣操作數據,那樣公共代碼引用,很多好用的方法。目錄結構快速接入深入了解待續。。。 簡單快速了解 Beetl 是前端視圖填充數據的工具,是個頁面模板,可以像 el 表達式那樣操作數據,jsp 那樣公共代碼引用,很多好用的方法。官方模板對比:showImg(https://segmentfault.com/img/bVbfa...

    wushuiyong 評論0 收藏0
  • SpringDAO模塊】就是這么簡單

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

    NSFish 評論0 收藏0
  • SSM : 環境搭建

    摘要:這個文件包含對對數據訪問進行封裝的所有類。為等提供的一致的聲明式和編程式事務管理。 SSM 環境搭建 目錄創建 pom.xml SSM 逐層配置 一、目錄 1.1 src/main/java 目錄下的包(以下包要放在項目包下,如:com.imooc.項目名) entity: 存放實體類 web: 存放controller,相當于Struts中的action service: 業務...

    MonoLog 評論0 收藏0
  • Spring AOP從零單排-織入時期源碼分析

    摘要:何為簡單點來定義就是切面,是一種編程范式。定義一個切面的載體定義一個切點定義一個為,并指定對應的切點一個注冊配置類,啟動容器,初始化時期獲取對象,獲取對象時期,并進行打印好了,這樣我們整體的代理就已經完成。 問題:Spring AOP代理中的運行時期,是在初始化時期織入還是獲取對象時期織入? 織入就是代理的過程,指目標對象進行封裝轉換成代理,實現了代理,就可以運用各種代理的場景模式。 ...

    honmaple 評論0 收藏0

發表評論

0條評論

高璐

|高級講師

TA的文章

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