Spring 用于更新的SimpleJdbcInsert等效项
我正在使用Spring的SimpleJdbcInsert类创建实体-例如:Spring 用于更新的SimpleJdbcInsert等效项,spring,jdbc,sql-update,simplejdbcinsert,Spring,Jdbc,Sql Update,Simplejdbcinsert,我正在使用Spring的SimpleJdbcInsert类创建实体-例如: final SimpleJdbcInsert insert = new SimpleJdbcInsert(dataSource).withTableName("abc"); insert.execute(new BeanPropertySqlParameterSource(abc)); 是否有类似于这个类的更新?例如,假设我们处理的是单列主键,下面这样的内容将是一个方便的界面: final SimpleJdbcUpd
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));
Spring是否提供了这种开箱即用的功能
谢谢
Jay您必须使用JdbcTemplate 见: E.X:
最简单的方法是:()
通过使用SimpleJDBCCTTemplate而不是JdbcTemplate,以及通过扩展SimpleJDBCAOSupport,可以获得更相似的效果。所有数据库操作都可以放在一个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));
}
}
对于任何未来的读者-我提出了一个方便的功能使用反射 适用于简单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");
生成:
更新员工集id=:id,name=:name,salary=:salary,其中id=:id在Spring JIRA中存在一个问题,即缺少
SimpleJdbcUpdate
类:。你可能想在那里投票。谢谢JavaGeek。我希望会有更方便的东西-我正在处理一个有50列的表,在bean和update语句中明确指定这些列是重复的。也许我会看看SimpleJdbcInsert,看看他们是如何使用hibernate和JPA实现插入的。然后,您只需要一个映射到表的JavaPOJO(域对象)和SpringXML中的一些连接配置。之后,语句非常简单,您也可以使用与上面类似的本机查询。哈,是的,我也想使用JPA:)事实上,我在这个项目上一直使用JPA,但不得不放弃它,因为我们使用的服务器是过时的,默认的JPA实现(OpenJPA 1.0.0)是buggy…@JamesHargreaves:您还可以使用Spring数据JDBC,它没有JPA的复杂性,但也有有用的SpringRepositories,以便更轻松地处理bean。请参阅:当您需要设置许多字段时,例如一个包含100列或更多列的表时,它会失败。示例:sql.append(“更新表集column1、column2、column3…”)simpleJdbctemplate.update(sql.toString()、object1、object2、object3…)
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");