package net.paoding.rose.jade; import java.util.LinkedList; import java.util.List; import javax.sql.DataSource; import net.paoding.rose.jade.annotation.DAO; import net.paoding.rose.jade.annotation.SQL; import net.paoding.rose.jade.annotation.ShardBy; import net.paoding.rose.jade.context.application.JadeFactory; import org.junit.Assert; import org.junit.Before; import org.junit.Test; /** * 验证批量更新功能 * * @author 王志亮 [qieqie.wang@gmail.com] * */ public class BatchUpdateTest { @DAO interface UserDAO { @SQL("create table user (id int, name varchar(200));") void createTable(); @SQL("create table $user (id int, name varchar(200));") void createTableAt(@ShardBy int hash); @SQL("insert into user (id, name) values(:1.id, :1.name);") int[] insertIntoOneTable(List<User> users); @SQL("insert into $user (id, name) values(:1.id, :1.name);") int[] insertIntoHashTables(@ShardBy("id") List<User> users); @SQL("select id, name from user order by id") List<User> findAll(); @SQL("select id, name from $user order by id") List<User> findAllAt(@ShardBy int hash); @SQL("delete from user") void deleteAll(); } public static class User { long id; String name; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { return (int) id; } @Override public boolean equals(Object obj) { if (!(obj instanceof User)) { return false; } User that = (User) obj; return this.id == that.id && this.name.equals(that.name); } @Override public String toString() { return "user:" + id + "(" + name + ")"; } } @Before public void init() { } @Test public void testBatchInsertIntoHashTables() { UserDAO dao = getHashTables(); // List<User> users0 = new LinkedList<BatchUpdateTest.User>(); List<User> users1 = new LinkedList<BatchUpdateTest.User>(); User user = new User(); user.id = 1; user.name = "zhiliang.wang"; users1.add(user); // user = new User(); user.id = 2; user.name = "helen.wang"; users0.add(user); // user = new User(); user.id = 3; user.name = "bad boy"; users1.add(user); // List<User> users = new LinkedList<BatchUpdateTest.User>(); users.addAll(users0); users.addAll(users1); dao.insertIntoHashTables(users); // List<User> users0FromDB = dao.findAllAt(0); List<User> users1FromDB = dao.findAllAt(1); Assert.assertEquals(users0, users0FromDB); Assert.assertEquals(users1, users1FromDB); } @Test public void testBatchInsertIntoOneTable() { UserDAO dao = getOneTable(); // List<User> users = new LinkedList<BatchUpdateTest.User>(); User user = new User(); user.id = 1; user.name = "zhiliang.wang"; users.add(user); // user = new User(); user.id = 2; user.name = "helen.wang"; users.add(user); // user = new User(); user.id = 3; user.name = "bad boy"; users.add(user); // dao.insertIntoOneTable(users); // List<User> usersFromDB = dao.findAll(); Assert.assertEquals(users, usersFromDB); } private UserDAO getOneTable() { DataSource dataSource = DataSources.createUniqueDataSource(); JadeFactory factory = new JadeFactory(dataSource); UserDAO dao = factory.create(UserDAO.class); dao.createTable(); return dao; } /** * 散表的一个实现 * @return */ private UserDAO getHashTables() { DataSource dataSource = DataSources.createUniqueDataSource(); JadeFactory factory = new JadeFactory(dataSource); factory.addInterpreter(new ShardInterpreter('$', 2));// Spring下可以配置ShardInterpreter在xml中让jade自动载入 UserDAO dao = factory.create(UserDAO.class); dao.createTableAt(0); dao.createTableAt(1); return dao; } }