【问题标题】:How to insert an ArrayList of String into database using SqlParameterSource如何使用 SqlParameterSource 将字符串的 ArrayList 插入数据库
【发布时间】:2013-04-28 13:39:58
【问题描述】:

我想使用 Spring 的 SqlParameterSource 将 Person bean 的内容插入到我的数据库 table person 中。 Person 类中的一个属性是java.util.List,它导致org.springframework.jdbc.BadSqlGrammarException

Person 类如下:

package learn.spring.model;

import java.util.List;

public class Person {
    private String name;
    private int age;
    private List<String> affiliations;
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", affiliations="
                + affiliations + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public List<String> getAffiliations() {
        return affiliations;
    }
    public void setAffiliations(List<String> affiliations) {
        this.affiliations = affiliations;
    }


}

将这个 Person bean 插入 db 的代码是:

String query="insert into person (name, age, affiliations) values (:name,:age,:affiliations)";
SqlParameterSource paramSource = new BeanPropertySqlParameterSource(p);
KeyHolder key = new GeneratedKeyHolder();
System.out.println(template.update(query, paramSource, key));

我要插入的 bean 是:Person [name=rickesh, age=22, affiliations=[1, 2, 3]]

我收到以下异常:

Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [insert into person (name, age, affiliations) values (?,?,?, ?, ?)]; nested exception is java.sql.SQLException: Column count doesn't match value count at row 1
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:98)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:843)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:288)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:270)
    at learn.spring.main.ApplicationRunner.createPerson(ApplicationRunner.java:46)
    at learn.spring.main.ApplicationRunner.main(ApplicationRunner.java:38)
Caused by: java.sql.SQLException: Column count doesn't match value count at row 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:233)
    at org.springframework.jdbc.core.JdbcTemplate$3.doInPreparedStatement(JdbcTemplate.java:845)
    at org.springframework.jdbc.core.JdbcTemplate$3.doInPreparedStatement(JdbcTemplate.java:1)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
    ... 5 more

经过一些尝试和尝试,我能够理解Person.affiliations 导致了这个异常。如何使用 SqlParameterSource 将列表插入数据库表?请指教。

【问题讨论】:

  • 从属关系也会和人在同一行吗?
  • @lok​​i 是的...我想以 [a,b,c] 格式存储数据
  • @lok​​i 的 List 格式相同。

标签: java spring jdbc spring-jdbc


【解决方案1】:

您的方法不正确。

编辑:您收到错误消息,因为 Spring 无法解释您希望将列表存储在单行中。

您不能将字符串列表存储在单行中。将您的 private List&lt;String&gt; affiliations; 转换为逗号分隔的列表即可。

使用它从 List 生成逗号分隔的列表:

String delim = "";
    for (Item i : list) {
        sb.append(delim).append(i);
        delim = ",";
    }

【讨论】:

    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多