如何在spring jdbc中使用数组

Posted

技术标签:

【中文标题】如何在spring jdbc中使用数组【英文标题】:How to use array in spring jdbc 【发布时间】:2016-12-15 08:42:57 【问题描述】:

我正在使用弹簧 jdbc 。我的 sql 查询涉及“IN”子句,我动态创建“?”基于输入并通过 spring jdbc模板查询方法的对象数组。

 public  List<Student> getStudentName(String studentId)
  //studentId contains  number of ids sepeated by comma.
 Object [] params= new Object[]studentId.split(",")
  Stream<String>  stream= Arrays.stream(studentId.split(","));

 final String stInClauseParameters= stream.map(studentId -> "?").collect((Collectors.joining(",")));


  StringBuilder sql = new StringBuilder();
  sql.append(" select studentName from Student where  student_id IN ("+stInClauseParameters+")")
  return JdbcTemplate.query(sql.toString(),params, new BeanPropertyRowMapper(Student.class))

  

错误

Prepared Statement: Input parameter not set, index: 1.; nested exception is java.sql.SQLException: JZ0SA: Prepared Statement: Input parameter not set, index: 1

spring jdbc查询方法中如何使用数组?

【问题讨论】:

【参考方案1】:

更简单的方法是使用可以为您动态处理 in 子句的 NamedParameterJdbcTemplate。

一个例子是

public class StudentDao extends JdbcDaoSupport 


public List<Student> getStudentName(String studentId) 

    List<String> studentIds = Arrays.asList(studentId.split(","));
    String sql = "SELECT studentName FROM Student WHERE student_id IN (:ids)";

    Map<String, List<String>> params = new HashMap<String, List<String>>();
    params.put("ids", studentIds);

    NamedParameterJdbcTemplate template = new    NamedParameterJdbcTemplate(getDataSource());
    return template.query(sql, params, new BeanPropertyRowMapper(Student.class));



【讨论】:

以上是关于如何在spring jdbc中使用数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring MVC 中使用 @Bean 连接到 jdbc?

如何使用 Guice 在 Spring JDBC 中使用事务

如何使用 JDBC 在 spring-session 中初始化模式

如何在 Spring/Tomcat 中完全禁用 JDBC 连接池?

如何配置在 Spring + JDBC 中关闭自动提交?

如何在具有 JDBC 安全性的 Spring Boot 中使用 Flyway?