update name set one = 123 where date = '2011-11-11' and a =0 and b = 0 and c = 2 and d = 147
我有大量的上述语句需要执行,咱们这里有没有走batch的方式呢?
Sql sql = Sqls.create("update t_user set name=@name where id=@id");
for(User user : list) {
sql.setParam("name", user.getName()).setParam("id", user.getId());
sql.addBatch();
}
dao.execute(sql);
@wendal 谢谢, 我昨天后来用的 dao.exeucte(sql...) 变长参数的方法
@wendal 我入坑了-。-
我原始的doule和long都被下面的代码给转成int了,爬了半天才找到原因
NutDaoExecutor#_runPreparedStatement() -> adaptors[i].set(pstat, params[i], i + 1);
sql.params().set("num", Long.parseLong(headerOversea));
这是这种,我去set了一些double和long
最后在批量走的时候,类NutDaoExecutor的方法_runPreparedStatement(),执行了这句代码adaptors[i].set(pstat, params[i], i + 1);
就是这个, 它最终放入'语句‘的都是int
public void set(PreparedStatement stat, Object obj, int i) throws SQLException {
if (null == obj) {
stat.setNull(i, Types.INTEGER);
} else {
long v;
if (obj instanceof Number)
v = ((Number) obj).longValue();
else
v = Castors.me().castTo(obj.toString(), long.class);
stat.setLong(i, v);
}
}
@wendal 找到最终的原因了
是获取’适配器‘的原因
我的num在数据库里是double
下面这行代码通过第一个row来判断adapter
Object val = rows.get(0).get(name);
可当第一次我设置为了0,后续都是double,那么下面的代码就会’错意‘adapter,选择了integer的adapter
sql.params().set("num", 0);
sql.params().set("num", 1.11111);
NutSql#joinAdaptor()
public int joinAdaptor(final Entity<?> en, final ValueAdaptor[] adaptors, final int off) {
if (!customValueAdaptor.isEmpty()) {
ValueAdaptor custom = customValueAdaptor.get(name);
if (custom != null) {
adaptors[off] = custom;
return off + 1;
}
}
Object val = rows.get(0).get(name);
if (val == null) {
adaptors[off] = Jdbcs.getAdaptorBy(null);
return off + 1;
} else if (val instanceof PItem) {
return ((PItem) val).joinAdaptor(en, adaptors, off);
} else if (val.getClass().isArray()) {
int len = Lang.length(val);
Lang.each(val, new Each<Object>() {
public void invoke(int index, Object ele, int length) {
adaptors[off + index] = Jdbcs.getAdaptorBy(ele);
}
});
return off + len;
// } else if (val instanceof Condition) {
} else {
adaptors[off] = Jdbcs.getAdaptorBy(val);
return off + 1;
}
}
结论是啥
@helloppx
@Rekoe 显示的指定适配器就安全了
sql.setValueAdaptor("num", Jdbcs.Adaptor.asLong);