2012-05-23 23 views
3

我使用Spring的SimpleJdbcInsert类类来创建实体 - 如:SimpleJdbcInsert类等效更新

final SimpleJdbcInsert insert = new SimpleJdbcInsert(dataSource).withTableName("abc"); 

insert.execute(new BeanPropertySqlParameterSource(abc)); 

是否有这样做的更新这个类的一些相同呢?举个例子,像下面将是一个方便的接口,假设我们正在处理单个列主键:

final SimpleJdbcUpdate update = new SimpleJdbcUpdate(dataSource).withTableName("abc").withIdColumn("abcId"); 

update.execute(new BeanPropertySqlParameterSource(abc)); 

春天在什么出的现成的地方提供这种功能?

感谢 周杰伦

+0

当您需要设置很多字段时,如100列或更多列的表格,它会失败。例如:sql.append(“update table set column1,column2,column3 ...”)simpleJdbctemplate.update(sql.toString(),object1,object2,object3 ...) – 2012-06-27 17:19:54

回答

3

你必须使用JdbcTemplate的

参见:13.2.1.1 Examples of JdbcTemplate class usage

E.X:

this.jdbcTemplate.update(
    "update t_actor set = ? where id = ?", 
    "Banjo", 5276L); 
+0

感谢JavaGeek。我希望能有更方便的东西 - 我正在处理一个有50列的表格,在bean中清楚地指定了这些,并且在更新语句中是重复的。也许我会看看SimpleJdbcInsert,看看他们如何实现插入... –

+0

个人身份证Id使用休眠和JPA。所有你需要的是一个java pojo(域对象)映射到你的表和一些连接配置在春天xml。之后,这些陈述非常简单,您还可以使用与上述类似的本机查询。 – Mick

+1

哈,是的,我也想使用JPA :)事实上,我一直在使用JPA这个项目,但不得不抛弃它,因为我们使用的服务器是陈旧的,默认的JPA实现(OpenJPA 1.0.0)是越野车... –

1

最简单的方式做到这一点是:

String SQL = "UPDATE some_schema.some_table " 
    +"SET your_column_1=? , your_column_2=? " 
    +" where your_column_1 =? and your_column_4=? "; 
    getJdbcTemplate().update(SQL, new Object[]{"someValue_1","someValue_2","someValue_3","someValue_4"}); 
2

您可以通过使用了SimpleJdbcTemplate,而不是JdbcTemplate的通过扩展SimpleJdbcDaoSupport所有的数据库操作都可以放在一个DAO类获得更多类似的效果:

import java.util.List; 

import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.jdbc.core.BeanPropertyRowMapper; 
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; 
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; 
import org.springframework.jdbc.core.namedparam.SqlParameterSource; 
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport; 
import org.springframework.stereotype.Repository; 

@Repository 
public class BankDaoImpl extends SimpleJdbcDaoSupport implements BankDao { 


    @Autowired 
    public BankDaoImpl(@Qualifier("dataSource") DataSource dataSource) { 
     setDataSource(dataSource); 
    } 

    @Override 
    public void insert(Bank bank) { 
     String sql = "INSERT INTO BANK (id, oib, short_name, name, street, town, postal_code, homepage_url, last_change) VALUES (NEXT VALUE FOR bank_seq, :oib, :shortName, :name, :street, :town, :postalCode, :homepageUrl, CURRENT_TIMESTAMP)"; 
     SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(
       bank); 

     getSimpleJdbcTemplate().update(sql, parameterSource); 
    } 

    @Override 
    public void update(Bank bank) { 
     String sql = "UPDATE BANK SET oib=:oib, short_name=:shortName, name=:name, street=:street, town=:town, postal_code=:postalCode, homepage_url=:homepageUrl, last_change=CURRENT_TIMESTAMP WHERE id=:id"; 
     SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(
       bank); 

     getSimpleJdbcTemplate().update(sql, parameterSource); 
    } 

    @Override 
    public void delete(String id) { 
     String sql = "DELETE FROM BANK WHERE id=:id"; 

     getSimpleJdbcTemplate().update(sql, 
       new MapSqlParameterSource("id", id)); 
    } 

    @Override 
    public Bank findById(String id) { 
     String sql = "select b.ID, b.OIB, b.SHORT_NAME, b.NAME, b.STREET, b.TOWN, b.POSTAL_CODE, b.HOMEPAGE_URL, b.LAST_CHANGE, CASE WHEN count(f.id) = 0 THEN 0 ELSE 1 END AS ready " + 
       "from BANK WHERE b.ID = :id"; 

     return getSimpleJdbcTemplate().queryForObject(sql, 
       BeanPropertyRowMapper.newInstance(Bank.class), 
       new MapSqlParameterSource("id", id)); 
    } 
} 
3

对于任何未来的读者 - 我想出了一个利用方便的功能反射;

Works为简单的POJO:

public void dao_update(NamedParameterJdbcTemplate database, String table, Object pojo, String[] keys) { 

     StringBuilder sqlBuilder = new StringBuilder("UPDATE "); 
     sqlBuilder.append(table); 
     sqlBuilder.append(" SET "); 
     boolean first = true; 
     for (Field field : pojo.getClass().getDeclaredFields()) { 
      if (!first) { 
       sqlBuilder.append(","); 
      } 
      first = false; 
      sqlBuilder.append(field.getName()); 
      sqlBuilder.append(" = :"); 
      sqlBuilder.append(field.getName()); 
     } 


     first = true; 
     for (String key : keys) { 
      if (first) { 
       sqlBuilder.append(" WHERE "); 
      } else { 
       sqlBuilder.append(" AND "); 
      } 
      first = false; 
      sqlBuilder.append(key); 
      sqlBuilder.append("= :"); 
      sqlBuilder.append(key); 
     } 
     database.getJdbcOperations().update(sqlBuilder.toString(), new BeanPropertySqlParameterSource(pojo)); 
    } 

实例:

dao_update(database, "employee", my_employee, "id"); 

生成:

UPDATE雇员设置ID =:ID,NAME =:姓名,工资=:薪金WHERE id =:id