package net.paoding.rose.jade;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.commons.collections.CollectionUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import net.paoding.rose.jade.annotation.DAO;
import net.paoding.rose.jade.annotation.SQL;
import net.paoding.rose.jade.annotation.SQLParam;
import net.paoding.rose.jade.context.application.JadeFactory;
/**
*
* 验证查询返回类型能力
*
* @author 王志亮 [qieqie.wang@gmail.com]
*
*/
public class SelectTest {
@DAO
interface UserDAO {
// 准备数据 (DDL)
@SQL("create table user (id int, name varchar(200));")
void createTable();
@SQL("insert into user (id, name) values(:1.id, :1.name);")
int[] insert(List<User> users);
// 查询数据(DML)
@SQL("select id, name from user order by id")
List<User> findAll();
@SQL("select id, name from user order by id")
Collection<User> findAllAsCollection();
@SQL("select id, name from user order by id")
ArrayList<User> findAllAsArrayList();
@SQL("select id, name from user order by id")
LinkedList<User> findAllAsLinkedList();
@SQL("select id, name from user order by id")
Iterable<User> findAllAsIterable();
@SQL("select name,id from user ")
Map<String, Long> findAllAsAsMap();
@SQL("select id, name from user ")
HashMap<Long, String> findAllAsAsHashMap();
@SQL("select id, name from user ")
Hashtable<Long, User> findAllAsAsHashtable();
@SQL("select id, name from user where id=:id")
User getById(@SQLParam("id") long id);
@SQL("select count(*) from user")
int countUser();
@SQL("select name from user where id=:id")
String getUserName(@SQLParam("id") long id);
}
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 test() {
UserDAO dao = getUserDAO();
//
List<User> users = new LinkedList<SelectTest.User>();
User user1 = new User();
user1.id = 1;
user1.name = "zhiliang.wang";
users.add(user1);
//
User user2 = new User();
user2.id = 2;
user2.name = "helen.wang";
users.add(user2);
//
User user3 = new User();
user3.id = 3;
user3.name = "bad boy";
users.add(user3);
//
dao.insert(users);
//
Assert.assertEquals(3, dao.countUser());
Assert.assertEquals(3, dao.findAll().size());
Assert.assertTrue(CollectionUtils.isEqualCollection(users, dao.findAll()));
Assert.assertEquals(3, dao.findAllAsArrayList().size());
Assert.assertTrue(CollectionUtils.isEqualCollection(users, dao.findAllAsArrayList()));
Assert.assertEquals(3, dao.findAllAsLinkedList().size());
Assert.assertTrue(CollectionUtils.isEqualCollection(users, dao.findAllAsLinkedList()));
Assert.assertEquals(3, dao.findAllAsCollection().size());
Assert.assertTrue(CollectionUtils.isEqualCollection(users, dao.findAllAsCollection()));
Assert.assertEquals(3, dao.findAllAsAsMap().size());
Assert.assertEquals(Long.valueOf(user1.getId()), dao.findAllAsAsMap().get(user1.getName()));
Assert.assertEquals(Long.valueOf(user2.getId()), dao.findAllAsAsMap().get(user2.getName()));
Assert.assertEquals(Long.valueOf(user3.getId()), dao.findAllAsAsMap().get(user3.getName()));
Assert.assertEquals(3, dao.findAllAsAsHashMap().size());
Assert.assertEquals(user1.getName(), dao.findAllAsAsHashMap().get(1L));
Assert.assertEquals(user2.getName(), dao.findAllAsAsHashMap().get(2L));
Assert.assertEquals(user3.getName(), dao.findAllAsAsHashMap().get(3L));
Assert.assertEquals(3, dao.findAllAsAsHashtable().size());
Assert.assertEquals(user1, dao.findAllAsAsHashtable().get(1L));
Assert.assertEquals(user2, dao.findAllAsAsHashtable().get(2L));
Assert.assertEquals(user3, dao.findAllAsAsHashtable().get(3L));
Iterator<User> iterable = dao.findAllAsIterable().iterator();
List<User> users2 = new LinkedList<SelectTest.User>(users);
while (iterable.hasNext()) {
User item = (User) iterable.next();
Assert.assertTrue(users2.contains(item));
users2.remove(item);
}
Assert.assertEquals("zhiliang.wang", dao.getById(1).getName());
Assert.assertEquals("helen.wang", dao.getById(2).getName());
Assert.assertEquals("bad boy", dao.getById(3).getName());
Assert.assertEquals("zhiliang.wang", dao.getUserName(1));
Assert.assertEquals("helen.wang", dao.getUserName(2));
Assert.assertEquals("bad boy", dao.getUserName(3));
}
/**
* @return
*/
private UserDAO getUserDAO() {
DataSource dataSource = DataSources.createUniqueDataSource();
JadeFactory factory = new JadeFactory(dataSource);
UserDAO dao = factory.create(UserDAO.class);
dao.createTable();
return dao;
}
}