package org.easyframe.tutorial.lesson7;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.PersistenceException;
import javax.sql.DataSource;
import jef.codegen.EntityEnhancer;
import jef.database.DbClient;
import jef.database.ORMConfig;
import jef.database.SqlTemplate;
import jef.database.datasource.MapDataSourceLookup;
import jef.database.datasource.RoutingDataSource;
import jef.database.datasource.SimpleDataSource;
import jef.database.meta.MetaHolder;
import jef.database.meta.AbstractMetadata;
import junit.framework.Assert;
import org.easyframe.tutorial.lesson4.entity.Person;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* nativeQuery支持路由功能(多数据库)
*
*/
public class Case2 {
private static DbClient db;
/**
* 准备测试数据
* @throws SQLException
*/
@BeforeClass
public static void setup() throws SQLException{
//准备多个数据源
Map<String,DataSource> datasources=new HashMap<String,DataSource>();
datasources.put("datasource1", new SimpleDataSource("jdbc:derby:./db;create=true",null,null));
datasources.put("datasource2", new SimpleDataSource("jdbc:derby:./db2;create=true",null,null));
MapDataSourceLookup lookup=new MapDataSourceLookup(datasources);
lookup.setDefaultKey("datasource1");//指定datasource1是默认的操作数据源
//构造一个多数据源的DbClient
db=new DbClient(new RoutingDataSource(lookup));
ORMConfig.getInstance().setDebugMode(true);
db.dropTable(Person.class);
//将Person对象的对应数据库修改为datasource2。(默认应该用注解 @BindDataSource来设置)
((AbstractMetadata)MetaHolder.getMeta(Person.class)).setBindDsName("datasource2");
db.dropTable(Person.class);
db.createTable(Person.class);
Person p=new Person();
p.setName("张三");
p.setGender('F');
db.insert(p);
ORMConfig.getInstance().setDebugMode(true);
}
/**
* 测试多数据源下,命名查询可以指定数据源
* @throws SQLException
*/
@Test(expected=PersistenceException.class)
public void testDataSourceBind() throws SQLException{
//Person对象所在的数据源为DataSource2
//由于配置中指定默认数据源为datasource2,因此可以正常查出
List<Person> persons=db.createNamedQuery("getUserById",Person.class).setParameter("name", "张三").getResultList();
System.out.println(persons);
//这个配置未指定绑定的数据源,因此会抛出异常
try{
List<Person> p2=db.createNamedQuery("getUserById-not-bind-ds",Person.class).setParameter("name", "张三").getResultList();
}catch(RuntimeException e){
throw e;
}
}
@Test
public void testSqlTemplate() throws SQLException{
System.out.println("============================");
//获得在datasource2上执行SQL操作的句柄
SqlTemplate t=db.getSqlTemplate("datasource2");
List<Person> person=t.selectBySql("select * from t_person where gender=?", Person.class, "F");
Assert.assertEquals(1, person.size());
}
}