use of org.nutz.dao.entity.Record in project nutz by nutzam.
the class SimpleDaoExecTest method test_exec_out.
@Test
public void test_exec_out() {
if (!dao.meta().isMySql())
// Only test for mysql now
return;
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");
// 设置出参类型,注意,必须加OUT开头
sql.params().set("OUTid", Types.INTEGER);
dao.execute(sql);
Record re = sql.getOutParams();
assertNotNull(re);
assertEquals(pet.getId(), re.get("id"));
}
use of org.nutz.dao.entity.Record in project nutz by nutzam.
the class NutDaoExecutor method _runExec.
// 执行存储过程,简单实现
protected void _runExec(Connection conn, DaoStatement st) throws SQLException {
if (st.getContext().getPager() != null) {
throw Lang.makeThrow(DaoException.class, "NOT Pageable : " + st);
}
// 打印调试信息
String sql = st.toPreparedStatement();
if (log.isDebugEnabled())
log.debug(sql);
Object[][] paramMatrix = st.getParamMatrix();
CallableStatement stmt = null;
ResultSet rs = null;
try {
stmt = conn.prepareCall(sql);
ValueAdaptor[] adaptors = st.getAdaptors();
HashMap<Integer, OutParam> outParams = new HashMap<Integer, OutParam>();
if (st instanceof Sql) {
VarIndex varIndex = ((Sql) st).paramIndex();
VarSet varSet = ((Sql) st).params();
for (int i = 0; i < varIndex.size(); i++) {
String name = varIndex.getOrderName(i);
if (name.startsWith("OUT") && varSet.get(name).getClass() == Integer.class) {
Integer t = (Integer) varSet.get(name);
outParams.put(i, new OutParam(name, t));
}
}
}
// 创建语句并设置参数
if (paramMatrix != null && paramMatrix.length > 0) {
PreparedStatement pst = (PreparedStatement) stmt;
Object[] pm = paramMatrix[0];
for (int i = 0; i < pm.length; i++) {
OutParam outParam = outParams.get(i);
if (outParam == null)
adaptors[i].set(pst, pm[i], i + 1);
else
stmt.registerOutParameter(i + 1, outParam.jdbcType);
}
}
stmt.execute();
if (outParams.size() > 0) {
Record r = Record.create();
for (Entry<Integer, OutParam> en : outParams.entrySet()) {
OutParam outParam = en.getValue();
int jdbcIndex = en.getKey() + 1;
Object value;
switch(outParam.jdbcType) {
case Types.INTEGER:
value = stmt.getInt(jdbcIndex);
break;
case Types.TIMESTAMP:
value = stmt.getTimestamp(jdbcIndex);
break;
case Types.CLOB:
value = stmt.getString(jdbcIndex);
break;
case Types.DATE:
value = stmt.getDate(jdbcIndex);
break;
default:
value = stmt.getObject(jdbcIndex);
break;
}
r.set(outParam.name.substring(3), value);
}
st.getContext().attr("OUT", r);
}
//先尝试读取第一个,并调用一次回调
rs = stmt.getResultSet();
try {
st.onAfter(conn, rs, null);
} finally {
if (rs != null)
rs.close();
}
while (true) {
if (stmt.getMoreResults()) {
rs = stmt.getResultSet();
try {
if (rs != null)
st.onAfter(conn, rs, null);
} finally {
if (rs != null)
rs.close();
}
}
break;
}
} finally {
if (stmt != null)
stmt.close();
}
}
use of org.nutz.dao.entity.Record in project nutz by nutzam.
the class DaoUpTest method test_sql.
/**
* 自定义SQL, 解决绝大部分Dao接口无法满足你的sql调用
*/
@Test
public void test_sql() {
// 不再啰嗦, 不然你也烦了..
Dao dao = DaoUp.me().dao();
// 首先,我们用前一个test的pojo建表
dao.create(SystemUser.class, true);
dao.create(SystemTeam.class, true);
// 建1个用户,一个Team
SystemUser user = new SystemUser();
user.setName("wendal");
SystemTeam team = new SystemTeam();
team.setName("root");
user.setTeam(team);
dao.insertWith(user, "team");
// Dao接口大部分操作都生成单表SQL, 除了@ManyMany.
// 所以很多人觉得@One也查2次很浪费啊, 那这里写一条
String str = "select u.*,t.* from $user_table u INNER JOIN $team_table t ON u.t_id = t.id where u.nm=@name";
// 创建一个自定义Sql对象, 还有各种形式哦
Sql sql = Sqls.create(str);
// $开头的是变量,会直接拼入sql哦
sql.vars().set("user_table", dao.getEntity(SystemUser.class).getTableName());
// 同上
sql.vars().set("team_table", dao.getEntity(SystemTeam.class).getTableName());
// @开头的是参数, 会变成问号哦
sql.params().set("name", "wendal");
// Sqls.callback提供N种常用的回调,你需要的一般都在里面了
sql.setCallback(Sqls.callback.record());
// 注意, execute是没有返回值的, 所需要的值都通过callback来获取
dao.execute(sql);
// 不抛出异常就是执行成功
//Sqls.callback.record()的返回值就是Record
Record record = sql.getObject(Record.class);
// 从Record还原出Pojo来
SystemUser u = record.toEntity(dao.getEntity(SystemUser.class), "u.");
assertNotNull(u);
SystemTeam t = record.toEntity(dao.getEntity(SystemTeam.class), "t.");
assertNotNull(t);
u.setTeam(t);
}
use of org.nutz.dao.entity.Record in project nutz by nutzam.
the class QueryTest method test_record_to_entity.
@Test
public void test_record_to_entity() {
if (dao.meta().isH2())
// h2死活过不去啊
return;
dao.each(Pet.class, null, new Each<Pet>() {
public void invoke(int index, Pet pet, int length) {
pet.setNickName("AA_" + pet.getName().toUpperCase());
// 不知道为啥h2数据库会抛出表不存在的异常
dao.update(pet);
}
});
Entity<Pet> en = dao.getEntity(Pet.class);
Sql sql = Sqls.queryRecord("SELECT * FROM t_pet");
dao.execute(sql);
List<Record> recs = sql.getList(Record.class);
Pet[] pets = new Pet[recs.size()];
int i = 0;
for (Record rec : recs) pets[i++] = rec.toEntity(en);
for (Pet pet : pets) assertEquals("AA_" + pet.getName().toUpperCase(), pet.getNickName());
}
use of org.nutz.dao.entity.Record in project nutz by nutzam.
the class QueryTest method fetch_record.
@Test
public void fetch_record() {
Record re = dao.fetch("t_pet", Cnd.where("name", "=", "pet3"));
if (dao.meta().isOracle())
re.remove("rn");
if (dao.meta().isSqlServer()) {
re.remove("__rn__");
re.remove("__tc__");
}
System.out.println(re.keySet());
Pet pet = re.toPojo(Pet.class);
assertEquals(7, re.getColumnCount());
assertEquals(4, pet.getId());
assertEquals("pet3", pet.getName());
dao.create(Pet.class, true);
dao.insert(Pet.create("中文啊中文"));
}
Aggregations