代码之家  ›  专栏  ›  技术社区  ›  Edward Dale

使用JdbcTemplate插入多行

  •  17
  • Edward Dale  · 技术社区  · 16 年前

    如何使用 JdbcTemplate 在mySQL上运行。在这种情况下,可扩展意味着:

    1. 服务器上只执行一条SQL语句
    2. 它适用于任意数量的行。

    INSERT INTO myTable (foo, bar) VALUES ("asdf", "asdf"), ("qwer", "qwer")
    

    假设我有一份POJO的名单 foo bar

    jdbcTemplate.update("INSERT INTO myTable(foo, bar) VALUES (?, ?)", paramMap)
    

    但这并没有达到第一个标准。

    我相信我也可以执行:

    jdbcTemplate.batchUpdate("INSERT INTO myTable(foo, bar) VALUES (?, ?)", paramMapArray)
    

    但据我所知,这只会编译一次SQL并执行多次,再次违反第一个标准。

    最后一种可能性似乎通过了这两个标准,那就是自己用一个 StringBuffer ,但我想避免。

    5 回复  |  直到 15 年前
        1
  •  5
  •   Will    13 年前

    多行插入(使用“行值构造函数”)实际上是SQL-92标准的一部分。看到了吗 http://en.wikipedia.org/wiki/Insert_(SQL)#Multirow_inserts .

    有些数据库不支持这种语法,但许多数据库支持这种语法。根据我的经验,Derby/Cloudscape、DB2、Postgresql和更新的hypersonic2.*+版本确实支持这一点。

    您对让它作为PreparedStatement工作的担心是可以理解的,但是我看到过类似的情况,Spring JDBC会自动处理某些查询的项集合(比如where in(?),但是我不能保证这种情况。

    我确实在上找到了一些可能有用的信息(无法添加此帖子的第二个链接) 这也许会有所帮助。

        2
  •  40
  •   Desorder    14 年前

    你可以用 BatchPreparedStatementSetter程序 就像下面一样。

    public void insertListOfPojos(final List<MyPojo> myPojoList) {
    
        String sql = "INSERT INTO "
            + "MY_TABLE "
            + "(FIELD_1,FIELD_2,FIELD_3) "
            + "VALUES " + "(?,?,?)";
    
        getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {
    
            @Override
            public void setValues(PreparedStatement ps, int i)
                throws SQLException {
    
                MyPojo myPojo = myPojoList.get(i);
                ps.setString(1, myPojo.getField1());
                ps.setString(2, myPojo.getField2());
                ps.setString(3, myPojo.getField3());
    
            }
    
            @Override
            public int getBatchSize() {
                return myPojoList.size();
            }
        });
    
    }
    
        3
  •  3
  •   Anatolii Stepaniuk    11 年前

    在我看来,JdbcTemplate的batchUpdate()方法在这种情况下可能会有所帮助(从这里复制) http://www.mkyong.com/spring/spring-jdbctemplate-batchupdate-example/ ):

    //insert batch example
    public void insertBatch(final List<Customer> customers){
    
      String sql = "INSERT INTO CUSTOMER " +
        "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
    
      getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {
    
    @Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
        Customer customer = customers.get(i);
        ps.setLong(1, customer.getCustId());
        ps.setString(2, customer.getName());
        ps.setInt(3, customer.getAge() );
    }
    
    @Override
    public int getBatchSize() {
        return customers.size();
    }
    
      });
     }
    
        4
  •  -1
  •   Sheetal Mohan Sharma    12 年前

       // define parameters
    jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
    jdbcInsert.withTableName("TABlE_NAME");
    SqlParameterSource[] sqlParamSourceArray = new SqlParameterSource[apiConsumer
            .getApiRoleIds().size()];
    for (int i = 0; i < myCollection.size(); i++) 
        {
      sqlParamSourceArray[i] = new MapSqlParameterSource().addValue("COL1");
          ......................
    }
    // execute insert
    int[] keys = jdbcInsert.executeBatch(sqlParamSourceArray);
    
        5
  •  -4
  •   Chochos    15 年前

    你不能在JDBC中这样做,句号。在MySQL中,它只是语法上的糖分,但是语句的效果将与发出几个INSERT语句相同。因此,您可以使用batchUpdate,它将具有相同的效果。

    推荐文章