Spring 事務管理(編程式事務實現)

Spring的事務管理:概述不多講,這裏直接上案例,主要是針對於編程式的事務案例

假設現在我們有一個數據庫test,裏面有一張表books

CREATE TABLE books (
isbn varchar(26) NOT NULL,
name varchar(80) NOT NULL,
price float(10,2) NOT NULL,
pubdate date DEFAULT NULL
);

接下來創建三個類,Book實體類,TemplateUtils工具類,ProTrans類

/**
 * 書籍實體類
 */
public class Book {
    private String isbn;
    private String bookname;
    private float bookprice;
    private Date bookdate;

    public Book() {
    }

    public Book(String isbn, String bookname, float bookprice, Date bookdate) {
        super();
        this.isbn = isbn;
        this.bookname= bookname;
        this.bookprice= bookprice;
        this.bookdate= bookdate;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getBookName() {
        return bookname;
    }

    public void setBookName(String bookname) {
        this.bookname= bookname;
    }

    public float getBookPrice() {
        return bookprice;
    }

    public void setBookPrice(float bookprice) {
        this.bookprice= bookprice;
    }

    public Date getBookdate() {
        return bookdate;
    }

    public void setBookdate(Date bookdate) {
        this.bookdate = bookdate;
    }

    @Override
    public String toString() {
        return "Book{" +
                "isbn='" + isbn + '\'' +
                ", bookname='" + bookname+ '\'' +
                ", bookprice=" + bookprice+
                ", bookdate=" + bookdate+
                '}';
    }
}

/**
 * Spring數據庫操作工具類
 */
public class TemplateUtils {
	 private final static  String nDriver = "com.mysql.cj.jdbc.Driver" ;
    private final static  String nUrl = "jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC" ;
    private final static  String nUser = "root";
    private final static  String nPwd = "010126";

    private static BasicDataSource dataSource;

	//靜態初識:創建連接數據源
	static {
	//創建DBCP簡單數據源並初始化相關數據源屬性
		dataSource = new BasicDataSource() ;
		dataSource.setDriverClassName(nDriver);
		dataSource.setUrl(nUrl);
		dataSource.setUsername(nUser);

		dataSource.setPassword(nPwd);
		//指定數據庫連接池初始連接數
		dataSource.setInitialSize(10);
		//設定同時向數據庫申請的最大連接數
		dataSource.setMaxTotal(50);
		//設置連接池中保持的最少連接數量
		dataSource.setMinIdle(5);
	
	}
	public static TransactionTemplate getTransactionTemplate() {  
        PlatformTransactionManager platformTransactionManager = new DataSourceTransactionManager(  
                dataSource);  
        return new TransactionTemplate(platformTransactionManager );  
    }  
  
    public static JdbcTemplate getJdbcTemplate() {  
        return new JdbcTemplate(dataSource);  
    } 
  
    public static SimpleJdbcInsert getSimpleJdbcInsert () {  
        return new SimpleJdbcInsert(dataSource);  
    }  
    
    public static DataSourceTransactionManager getDataSourceTransactionManager(){
    	 DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    	 // 設置數據源:此事務數據源須和正式事務管理器的數據源一致
    	 dataSourceTransactionManager.setDataSource(dataSource);
    	 return dataSourceTransactionManager;
    }
}
/**
 * Spring的兩種編程模式演示
 * 模板事務,平臺事務
 */
public class ProTransExample {
	//編程式事務管理:事務管理器PlatformTransactionManager方式實現
	public void updateBookByIsbn(Book book) {
		//第一步:獲取JDBC事務管理器,TemplateUtils.getDataSourceTransactionManager(),工具類中實現
		DataSourceTransactionManager dataSourceTransactionManager = TemplateUtils.getDataSourceTransactionManager();
		// 第二步:創建事務管理器屬性對象,設置傳播行爲屬性
		DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
		defaultTransactionDefinition .setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
		// 第三步:獲得事務狀態對象
		TransactionStatus transactionStatus = dataSourceTransactionManager .getTransaction(defaultTransactionDefinition );
		// 第四步:基於當前事務管理器,獲取數據源,創建操作數據庫的JDBC模板對象
		JdbcTemplate jt = new JdbcTemplate(dataSourceTransactionManager .getDataSource());
		try {//第五步:業務操作
			jt.update("update books set bookprice="+book.getBookPrice()+",name='"+book.getBookName()
			              +"'  where isbn='"+book.getIsbn()+"' ");
			//第六步:提交事務
			dataSourceTransactionManager .commit(transactionStatus ); 
		} catch (Exception e) {
			dataSourceTransactionManager .rollback(transactionStatus );
			e.printStackTrace();
		}
	}


	// 事務模板:第二種事務編程模式
	
	//沒有返回值的操作
	public void addBook(Book book) {
		// 獲取事務模板對象
		TransactionTemplate transactionTemplate = TemplateUtils.getTransactionTemplate();
		transactionTemplate .execute(new TransactionCallbackWithoutResult() {
			@Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus ) {
				try {
					// 簡單模板化新增數據
					SimpleJdbcInsert simpleJdbcInsert = TemplateUtils.getSimpleJdbcTemplate();
					simpleJdbcInsert .withTableName("books").usingColumns("isbn", "bookname", "bookprice", "bookdate");
					Map<String, Object> map= new HashMap<String, Object>();
					map.put("isbn", book.getIsbn());
					map.put("bookname", book.getName());
					map.put("bookprice", book.getPrice());
					map.put("bookdate", book.getPubdate());
					simpleJdbcInsert .execute(parameters);
					System.out.println("新增數據");
					
				} catch (Exception e) {
					transactionStatus .setRollbackOnly();
					e.printStackTrace();
				}
			}
		});
	}
//有返回值的操作
	public Book findBookByIsbn(String isbn) {
		TransactionTemplate transactionTemplate = TemplateUtils.getTransactionTemplate();
		Book book = null;
		List<Map<String, Object>> books = (List<Map<String, Object>>) transactionTemplate .execute(new TransactionCallback<Object>() {
			@Override
            public Object doInTransaction(TransactionStatus arg0) {
				JdbcTemplate jdbcTemplate = TemplateUtils.getJdbcTemplate();
				return jdbcTemplate
						.queryForList("select isbn,bookname,bookprice,bookdate from books where isbn ='" + isbn + "'");
			}
		});
		// 獲取數據
		if (books != null) {
			//拿到第一條數據
			Map<String, Object> m = (Map) books.get(0);
			book = new Book();
			book.setIsbn(m.get("isbn").toString());
			book.setName(m.get("bookname").toString());
			book.setPrice((Float) m.get("bookprice"));
			book.setPubdate((Date) m.get("bookdate"));
		}
		return book;
	}

	public static void main(String[] args) {
		//調用方法即可
	}

}

以上便是Spring 事務管理編程式事務的實現,講的不都清楚的,或者將錯的,歡迎在評論區評論,點贊關注哈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章