Java Spring getJdbcTemplate()。更新插入动态对象
我以前从未遇到过这样的问题,谷歌帮不上忙 我使用Spring框架,Java Spring getJdbcTemplate()。更新插入动态对象,java,sql,spring,postgresql,spring-mvc,Java,Sql,Spring,Postgresql,Spring Mvc,我以前从未遇到过这样的问题,谷歌帮不上忙 我使用Spring框架,JdbcDaoSupport,getJdbcTemplate().update()方法。 我有一个带有2个可选参数的动态查询 不知道输入动态对象的正确方法。 我就是这样尝试的: StringBuilder sbUserRegQuery = new StringBuilder(); sbUserRegQuery.append("INSERT INTO users (username, password , email
JdbcDaoSupport
,getJdbcTemplate().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());
i、 e.我试图在regObject
之后插入动态对象。
但是,在这种情况下,可以更改动态对象的顺序,并且查询失败
如何解决这个问题?您得到的错误是什么
jdbcTemplate API中没有包含四个参数的更新方法。您提到的是四个参数。我不确定我的解决方案是否适合您的问题,但在我的项目中,我使用了如下“插入”结构:
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);
通过在创建SQL时使用条件检查,您几乎可以做到这一点,但是对于传递到update()方法中的变量参数,您不会这样做
StringBuilder sbUserRegQuery=new StringBuilder();
追加(“插入到用户中(用户名、密码、电子邮件、已启用、datetime\u condo\u更改、datetime\u上次登录”);
if(user.getCondo_id()!=null)sbUserRegQuery.append(“,condo_id”);
if(user.getProvider()!=null)sbUserRegQuery.append(“,provider”);
sbUserRegQuery.append(“)”;
追加(“值(?,,,,,,,,?”;
if(user.getCondo_id()!=null)sbUserRegQuery.append(“,?”);
如果(user.getProvider()!=null)sbUserRegQuery.append(“,?”);
sbUserRegQuery.append(“);”;
ArrayList params=新的ArrayList();
params.add(user.getUsername());
add(PasswordEncoderGenerator.main(user.getPassword());
params.add(user.getEmail());
参数添加(已启用);
params.add(user.getDatetime_condo_changed());
参数添加(当前时间戳);
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());
您在控制台中遇到了什么错误?你最好把它贴在这里。我建议你改变这一点:
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());
致:
请参阅无效值,因为“condo_id”和“provider”的位置是动态的
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()
);