Spring getJdbcTemplate()。update insert dynamic object

时间:2016-08-10 04:53:23

标签: java sql spring postgresql spring-mvc

我之前从未见过这样的问题,谷歌没有帮助。

我使用Spring Framework,JdbcDaoSupportgetJdbcTemplate().update()方法。 我有一个带有2个可选参数的动态查询。

不知道输入动态对象的正确方法。 这是我尝试的方式:

    StringBuilder sbUserRegQuery = new StringBuilder();
    sbUserRegQuery.append("INSERT INTO users (username, password , email, enabled, datetime_condo_changed, datetime_last_login");
    if(user.getCondo_id()!=null) sbUserRegQuery.append(", condo_id");
    if(user.getProvider()!=null) sbUserRegQuery.append(", provider");
    sbUserRegQuery.append(")");
    sbUserRegQuery.append(" VALUES ( ?, ?, ? , ? , ?, ?");
    if(user.getCondo_id()!=null) sbUserRegQuery.append(", ?");
    if(user.getProvider()!=null) sbUserRegQuery.append(", ?"); //default - "local"
    sbUserRegQuery.append(");");

        Object regObject = new Object[]{
            user.getUsername(), PasswordEncoderGenerator.main(user.getPassword()), user.getEmail(), enabled, user.getDatetime_condo_changed(), currentTimeStamp, user.getCondo_id()
        };

       int row = getJdbcTemplate().update(sbUserRegQuery.toString(), regObject, user.getCondo_id(), user.getProvider());

即。我正试图在regObject之后插入动态对象。 但是,在这种情况下,动态对象的顺序可以改变,查询失败..

如何解决此案?

4 个答案:

答案 0 :(得分:2)

您几乎可以通过使用创建SQL的条件检查来获得它,但是您不必为传递给update()方法的变量参数执行此操作。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html#update-java.lang.String-java.lang.Object...-

StringBuilder sbUserRegQuery = new StringBuilder();
sbUserRegQuery.append("INSERT INTO users (username, password , email, enabled, datetime_condo_changed, datetime_last_login");
if(user.getCondo_id()!=null) sbUserRegQuery.append(", condo_id");
if(user.getProvider()!=null) sbUserRegQuery.append(", provider");
sbUserRegQuery.append(")");
sbUserRegQuery.append(" VALUES ( ?, ?, ? , ? , ?, ?");
if(user.getCondo_id()!=null) sbUserRegQuery.append(", ?");
if(user.getProvider()!=null) sbUserRegQuery.append(", ?");
sbUserRegQuery.append(");");

ArrayList<Object> params = new ArrayList<Object>();
params.add(user.getUsername());
params.add(PasswordEncoderGenerator.main(user.getPassword()));
params.add(user.getEmail());
params.add(enabled);
params.add(user.getDatetime_condo_changed());
params.add(currentTimeStamp);
if(user.getCondo_id()!=null) params.add(user.getCondo_id());
if(user.getProvider()!=null) params.add(user.getProvider());

int row = getJdbcTemplate().update(sbUserRegQuery.toString(), params.toArray());

答案 1 :(得分:0)

你得到的错误是什么???。

check this link jdbcTemplate API中没有包含四个参数的更新方法。您提到了四个参数..

答案 2 :(得分:0)

我不确定我的解决方案是否适合您的问题,但在我的项目中,我使用&#34;插入&#34;看起来像这样的结构:

public void insert(User u) {
    final String sql = "insert into user(firstName, lastName, email, password) values(?,?,?,?)";

    final String firstName = u.getFirstName();
    final String lastName = u.getLastName();
    final String email = u.getEmail();
    final String password = u.getPassword();

    jdbcTemplate.update(new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(
                Connection connection) throws SQLException {
            PreparedStatement ps = connection.prepareStatement(sql,
                    new String[] { "id" });
            ps.setString(1, firstName);
            ps.setString(2, lastName);
            ps.setString(3, email);
            ps.setString(4, password);
            return ps;
        }
    }, idHolder);

答案 3 :(得分:0)

您在控制台中遇到了什么错误?你最好把它贴在这里。
     我建议你改变这个:

    Object regObject = new Object[]{
        user.getUsername(), PasswordEncoderGenerator.main(user.getPassword()), user.getEmail(), enabled, user.getDatetime_condo_changed(), currentTimeStamp, user.getCondo_id()
    };


   int row = getJdbcTemplate().update(sbUserRegQuery.toString(), regObject, user.getCondo_id(), user.getProvider());

为:

int row = getJdbcTemplate().update(
                    sbUserRegQuery,
                    user.getUsername(),
                    user.getPassword(),
                    user.getEmail(),
                    enabled,
                    user.getDatetime_condo_changed(),
                    currentTimeStamp,
                    user.getCondo_id(),
                    user.getCondo_id(),
                    user.getProvider()
);