NutzCN Logo
问答 如何 batch 的 update
发布于 3250天前 作者 helloppx 4221 次浏览 复制 上一个帖子 下一个帖子
标签: dao

update name set one = 123 where date = '2011-11-11' and a =0 and b = 0 and c = 2 and d = 147

我有大量的上述语句需要执行,咱们这里有没有走batch的方式呢?

12 回复
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...) 变长参数的方法

addBatch快很多的

@wendal 我入坑了-。-
我原始的doule和long都被下面的代码给转成int了,爬了半天才找到原因

NutDaoExecutor#_runPreparedStatement() -> adaptors[i].set(pstat, params[i], i + 1);

version: 1.r.54

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;
            }
        } 

addBatch就得全部数据类型一致

@Rekoe 显示的指定适配器就安全了

sql.setValueAdaptor("num", Jdbcs.Adaptor.asLong);
添加回复
请先登陆
回到顶部