6

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

Spring は、すぐに使えるこの機能をどこかで提供していますか?

ありがとうジェイ

4

5 に答える 5

7

将来の読者のために-リフレクションを使用して便利な関数を思いつきました。

シンプルな 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 従業員 SET id = :id、name = :name、salary = :salary WHERE id = :id

于 2013-08-23T11:10:45.203 に答える
6

SimpleJdbcUpdateSpring JIRA には、クラスの欠如に関する問題があります: https://jira.springsource.org/browse/SPR-4691。そこに賛成票を投じたいと思うかもしれません。

于 2014-01-10T15:25:28.883 に答える
4

JdbcTemplate を使用する必要があります

参照: 13.2.1.1 JdbcTemplate クラスの使用例

元:

this.jdbcTemplate.update(
    "update t_actor set = ? where id = ?", 
    "Banjo", 5276L);
于 2012-05-23T21:49:03.947 に答える
1

JdbcTemplate の代わりに SimpleJdbcTemplate を使用し、SimpleJdbcDaoSupport を拡張することで、すべての DB 操作を 1 つの 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));
    }
}
于 2012-12-05T16:08:11.050 に答える
1

これを行う簡単な方法は次のとおりです:( source )

public void setName(int id, String name) {
    this.jdbcTemplate.update("update mytable set name = ? where id = ?", 
    new Object[] {name, new Integer(id)});
}
于 2012-10-12T20:41:41.757 に答える