NutzCN Logo
问答 自定义SQL插入如何返回自增ID?
发布于 124天前 作者 threefish 267 次浏览 复制 上一个帖子 下一个帖子
标签:

自定义SQL插入如何返回自增ID?

7 回复

用chain可以

chain方式是不用sql语句的吧

以供参考

@Override
    public Object invoke() {
        Sql sql = Sqls.create(methodSignature.getSql()).setParams(this.params);
        AtomicReference<Object> idGeneratedKey = new AtomicReference<>();
        dao.run(conn -> {
            PreparedStatement ps = conn.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);
            try {
                ps.executeUpdate();
                ResultSet rs = ps.getGeneratedKeys();
                if (rs.next()) {
                    if (ValueTypeUtil.isNumber(this.methodSignature.getReturnType())) {
                        idGeneratedKey.set(rs.getInt(1));
                    } else {
                        idGeneratedKey.set(rs.getString(1));
                    }
                }
                rs.close();
            } finally {
                Daos.safeClose(ps);
            }
        });
        return idGeneratedKey.get();
    }

把Sql对象进行toString然后执行, 并不是很安全的做法

有个优化方法,将nutzdao中的sql语句使用@符号对sql进行2次修改的逻辑,在dao.run里面执行创建pst语句和sql入参设置。

完善后

    @Override
    public Object invoke() {
        Sql sql = Sqls.create(methodSignature.getSql()).setParams(this.params);
        if (this.methodSignature.getReturnType() == void.class) {
            dao.execute(sql);
            return sql.getUpdateCount();
        } else {
            NutSql daoStatement = new NutSql(methodSignature.getSql());
            daoStatement.setExpert(dao.getJdbcExpert());
            daoStatement.setParams(this.params);
            String originalSql = daoStatement.toPreparedStatement();
            ValueAdaptor[] adaptors = daoStatement.getAdaptors();
            Object[][] paramMatrix = daoStatement.getParamMatrix();
            AtomicReference<Object> idGeneratedKey = new AtomicReference<>();
            dao.run(conn -> {
                PreparedStatement preparedStatement = conn.prepareStatement(originalSql, Statement.RETURN_GENERATED_KEYS);
                ResultSet rs = null;
                try {
                    for (int i = 0; i < paramMatrix[0].length; i++) {
                        adaptors[i].set(preparedStatement, paramMatrix[0][i], i + 1);
                    }
                    preparedStatement.executeUpdate();
                    rs = preparedStatement.getGeneratedKeys();
                    if (rs.next()) {
                        if (ValueTypeUtil.isNumber(this.methodSignature.getReturnType())) {
                            idGeneratedKey.set(rs.getInt(1));
                        } else {
                            idGeneratedKey.set(rs.getString(1));
                        }
                    }
                } finally {
                    Daos.safeClose(preparedStatement, rs);
                }
            });
            return idGeneratedKey.get();
        }
    }

还能在优化,懒的提交了

添加回复
请先登陆
回到顶部