package test.db; import com.firefly.db.TransactionalJDBCHelper; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.List; import static org.hamcrest.Matchers.is; public class TestTransactionalJdbcHelper { private TransactionalJDBCHelper jdbcHelper; private int size = 10; public TestTransactionalJdbcHelper() { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:h2:mem:test"); config.setDriverClassName("org.h2.Driver"); config.setAutoCommit(false); HikariDataSource ds = new HikariDataSource(config); jdbcHelper = new TransactionalJDBCHelper(ds); } @Before public void before() { jdbcHelper.update("drop schema if exists test"); jdbcHelper.update("create schema test"); jdbcHelper.update("set mode MySQL"); jdbcHelper.update( "CREATE TABLE `test`.`user`(id BIGINT AUTO_INCREMENT PRIMARY KEY, pt_name VARCHAR(255), pt_password VARCHAR(255), other_info VARCHAR(255))"); Object[][] params = new Object[10][2]; for (int i = 0; i < size; i++) { params[i][0] = "test transaction " + i; params[i][1] = "pwd transaction " + i; } String sql = "insert into `test`.`user`(pt_name, pt_password) values(?,?)"; // jdbcHelper.batch("insert into `test`.`user`(pt_name, pt_password) values(?,?)", params); List<Integer> idList = jdbcHelper.insertBatch(sql, (rs) -> { List<Integer> ids = new ArrayList<>(); while (rs.next()) { ids.add(rs.getInt(1)); } return ids; }, params); System.out.println(idList.toString()); } @Test public void test() { for (long i = 1; i <= size; i++) { User user = jdbcHelper.queryById(User.class, i); Assert.assertThat(user.getId(), is(i)); Assert.assertThat(user.getName(), is("test transaction " + (i - 1))); Assert.assertThat(user.getPassword(), is("pwd transaction " + (i - 1))); } } @Test public void testRollback() { Long id = 1L; int r = jdbcHelper.executeTransaction((helper) -> { User user = new User(); user.setId(1L); user.setName("apple"); int row = helper.updateObject(user); Assert.assertThat(row, is(1)); User user1 = helper.queryById(User.class, id); Assert.assertThat(user1.getName(), is("apple")); helper.rollback(); return 0; }); Assert.assertThat(r, is(0)); User user2 = jdbcHelper.queryById(User.class, id); Assert.assertThat(user2.getName(), is("test transaction 0")); } @Test public void testRollback2() { int ret = jdbcHelper.executeTransaction((helper0) -> { User user0 = new User(); user0.setId(2L); user0.setName("orange"); int row0 = helper0.updateObject(user0); Assert.assertThat(row0, is(1)); user0 = helper0.queryById(User.class, 2L); System.out.println(user0); Assert.assertThat(user0.getName(), is("orange")); int r = jdbcHelper.executeTransaction((helper) -> { User user1 = new User(); user1.setId(1L); user1.setName("apple"); int row = helper.updateObject(user1); Assert.assertThat(row, is(1)); user1 = helper.queryById(User.class, 1L); System.out.println(user1); Assert.assertThat(user1.getName(), is("apple")); helper.rollback(); return 0; }); Assert.assertThat(r, is(0)); return 0; }); Assert.assertThat(ret, is(0)); User user1 = jdbcHelper.queryById(User.class, 1L); Assert.assertThat(user1.getName(), is("test transaction 0")); User user2 = jdbcHelper.queryById(User.class, 2L); Assert.assertThat(user2.getName(), is("test transaction 1")); } @After public void after() { jdbcHelper.update("DROP TABLE IF EXISTS `test`.`user`"); } }