dan penggunaan SimpleJdbcInsert.
Berikut contoh penggunaan :
BookManagerImpl merupakan class yang mengatur proses DML pada table 'book' pada database 'spring_book'. Object BookManagerImpl akan dibungkus dengan Transaction pada mode 'read-only' secara default. Method insertBooks(List
CREATE DATABASE spring_book; CREATE TABLE `book` ( `id` varchar(10) NOT NULL, `name` varchar(50) NOT NULL, PRIMARY KEY(`id`) );
package greenhornsjava.spring.entity;
public class Book {
private String id;
private String name;
public Book(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package greenhornsjava.spring.trx;
import java.util.List;
public interface BookManager {
public void insertBooks(List books);
}
package greenhornsjava.spring.trx;
import greenhornsjava.spring.entity.Book;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* BookManagerImpl adalah contoh class yang mengimplementasikan
* Kemampuan Spring dalam mengatur transaksi secara declarative.
*/
@Transactional(readOnly = true)
public class BookManagerImpl implements BookManager {
// SimpleJdbcInsert adalah Object JDBC Template yang disediakan oleh Spring Framework
private SimpleJdbcInsert insertBook;
public BookManagerImpl(DataSource dataSource) {
insertBook = new SimpleJdbcInsert(dataSource).withTableName("book");
}
/**
* Secara declarative menjadikan method ini 'terbungkus' oleh transaksi baru.
* Sehingga jika terjadi Exception maka keseluruhan proses insert pada method ini
* akan di-rollback.
*/
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void insertBooks(List books) {
for(Object o : books) {
Book b = (Book) o;
Map parameters = new HashMap();
parameters.put("id", b.getId());
parameters.put("Name", b.getName());
insertBook.execute(parameters);
}
}
public static void main(String[] args) {
AbstractApplicationContext context = new FileSystemXmlApplicationContext(
new String[] { "DataAccessContext.xml" });
context.registerShutdownHook();
final BeanFactory bf = (BeanFactory) context;
BookManager bookManager = (BookManager) bf.getBean("bookManager");
Book b1 = new Book("book1", "Harry Potter");
Book b2 = new Book("book2", "The Lost Symbol");
Book b3 = new Book("book3", "The Adv of Donald Duck");
List books = new ArrayList();
books.add(b1);
books.add(b2);
books.add(b3);
// Proses Insert Book akan berhasil dan tercatat secara fisik di DB
bookManager.insertBooks(books);
Book b4 = new Book("Book4", "The Destination");
List books2 = new ArrayList();
books2.add(b4);
books2.add(b1);
// Proses Insert Book akan gagal dan Book dengan id:Book4 tidak akan tersimpan
// karena method telah 'terbungkus' transaksi
bookManager.insertBooks(books2);
}
}
<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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="bookManager" class="greenhornsjava.spring.trx.BookManagerImpl">
<constructor-arg ref="dataSource" />
</bean>
<!-- Bagian ini akan memberitahukan container agar men-scan semua
object/method yang ber-anotasi @Transactional agar transaksinya dimanage
oleh Spring -->
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/spring_book" />
<property name="username" value="root" />
<property name="password" value="keriting" />
</bean>
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
Catatan : Object yang akan menggunakan Spring Declarative Transaction HARUS mengimplement sebuah Interface dimana method2 yang dimaksudkan agar 'dibungkus' dengan transaksi dapat dimanage oleh Spring.
Tidak ada komentar:
Posting Komentar