package org.nutz.dao.test.exec;
import static org.junit.Assert.*;
import java.sql.Types;
import org.junit.Test;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Record;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.test.DaoCase;
import org.nutz.dao.test.meta.Pet;
/**
* 执行简单的存储过程,无输出参数
*
* @author wendal
*
*/
public class SimpleDaoExecTest extends DaoCase {
// H2 支持简单的CALL语句
@Test
public void test_simple_h2_call() {
if (!dao.meta().isH2())
return; // Only test for h2 now
dao.create(Pet.class, true);
dao.insert(Pet.create("wendal"));
dao.execute(Sqls.create("CALL SELECT MAX(ID) FROM t_PET"));
Sql sql = Sqls.fetchInt("CALL SELECT MAX(ID) FROM t_PET");
dao.execute(sql);
assertEquals(1, sql.getInt());
sql = Sqls.fetchInt("CALL 15*25");
dao.execute(sql);
assertEquals(15 * 25, sql.getInt());
}
// Mysql支持存储过程
@Test
public void test_simple_mysql_exec() {
if (!dao.meta().isMySql())
return; // Only test for mysql now
dao.create(Pet.class, true);
dao.insert(Pet.create("wendal"));
dao.execute(Sqls.create("DROP PROCEDURE IF EXISTS proc_pet_getCount"));
dao.execute(Sqls.create("CREATE PROCEDURE proc_pet_getCount()\nBEGIN\n\tSELECT name FROM t_pet;\nEND"));
Sql sql = Sqls.fetchString("CALL proc_pet_getCount()"); // 单一结果集,且没有输入输出参数
dao.execute(sql);
assertEquals("wendal", sql.getString());
}
// Mysql支持存储过程
@Test
public void test_simple_mysql_exec2() {
if (!dao.meta().isMySql())
return; // Only test for mysql now
dao.create(Pet.class, true);
dao.insert(Pet.create("wendal"));
dao.execute(Sqls.create("DROP PROCEDURE IF EXISTS proc_pet_fetch"));
dao.execute(Sqls.create("CREATE PROCEDURE proc_pet_fetch(IN nm varchar(1024))\nBEGIN\n\tSELECT * FROM t_pet where name=nm;\nEND"));
Sql sql = Sqls.fetchEntity("CALL proc_pet_fetch(@nm)");
sql.setEntity(dao.getEntity(Pet.class));
sql.params().set("nm", "wendal");
dao.execute(sql);
Pet pet = sql.getObject(Pet.class);
assertNotNull(pet);
assertEquals("wendal", pet.getName());
}
@Test
public void test_exec_out() {
if (!dao.meta().isMySql())
return; // Only test for mysql now
dao.create(Pet.class, true);
dao.insert(Pet.create("wendal"));
Pet pet = dao.fetch(Pet.class, "wendal");
dao.execute(Sqls.create("DROP PROCEDURE IF EXISTS proc_pet_fetch"));
dao.execute(Sqls.create("CREATE PROCEDURE proc_pet_fetch(IN nm varchar(1024), OUT outId int)\nBEGIN\n\tselect id into outId from t_pet where name=nm;\nEND"));
// 像普通自定义SQL那样创建SQL对象.
Sql sql = Sqls.create("CALL proc_pet_fetch(@nm, @OUTid)");
sql.setEntity(dao.getEntity(Pet.class));
sql.params().set("nm", "wendal"); // 设置入参
sql.params().set("OUTid", Types.INTEGER);// 设置出参类型,注意,必须加OUT开头
dao.execute(sql);
Record re = sql.getOutParams();
assertNotNull(re);
assertEquals(pet.getId(), re.get("id"));
}
}