【问题标题】:Spring getJdbcTemplate().update insert dynamic objectSpring getJdbcTemplate().update 插入动态对象
【发布时间】:2016-12-16 07:31:20
【问题描述】:

我从来没有遇到过这样的问题,谷歌没有帮助。

我使用 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 之后插入动态对象。 但是,在这种情况下,动态对象的顺序可以改变,查询失败..

如何解决这种情况?

【问题讨论】:

标签: java sql spring postgresql spring-mvc


【解决方案1】:

您几乎可以通过在创建 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());

【讨论】:

    【解决方案2】:

    你得到什么错误???。

    check this link jdbcTemplate API中没有四个参数的更新方法。你说的是四个参数..

    【讨论】:

    • 无效值,导致“condo_id”和“provider”的位置是动态的
    【解决方案3】:

    我不确定我的解决方案是否适合您的问题,但在我的项目中,我使用如下所示的“插入”构造:

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

    【讨论】:

      【解决方案4】:

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

          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()
      );
      

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 2021-10-03
        • 2017-08-30
        • 2016-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多