如何使用 Spring Framework 中的 JdbcTemplate 类执行 INSERT 语句

Posted

技术标签:

【中文标题】如何使用 Spring Framework 中的 JdbcTemplate 类执行 INSERT 语句【英文标题】:How to execute INSERT statement using JdbcTemplate class from Spring Framework 【发布时间】:2011-02-17 09:11:27 【问题描述】:

在 Spring 中,如何使用 JdbcTemplate 在表中插入数据。谁能给我一个代码示例。

【问题讨论】:

【参考方案1】:

使用jdbcTemplate.update(String sql, Object... args)方法:

jdbcTemplate.update(
    "INSERT INTO schema.tableName (column1, column2) VALUES (?, ?)",
    var1, var2
);

jdbcTemplate.update(String sql, Object[] args, int[] argTypes),如果您需要手动将参数映射到 SQL 类型:

jdbcTemplate.update(
    "INSERT INTO schema.tableName (column1, column2) VALUES (?, ?)",
    new Object[]var1, var2, new Object[]Types.TYPE_OF_VAR1, Types.TYPE_OF_VAR2
);

【讨论】:

请注意,(现在?)是一个接受可变参数的重载,因此您不再需要创建新数组。 @PieterDeBie 但有时您可能需要手动将参数类型映射到 SQL 类型 :) 啊,是的,我的错。我没有看到 Types 数组。【参考方案2】:

如果您计划在多个位置使用 JdbcTemplate,最好为其创建一个 Spring Bean。

使用 Java Config 会是:

@Configuration
public class DBConfig 

   @Bean
   public DataSource dataSource() 
      //create a data source
   

   @Bean
   public JdbcTemplate jdbcTemplate() 
      return new JdbcTemplate(dataSource());
   

   @Bean
   public TransactionManager transactionManager() 
      return new DataSourceTransactionManager(dataSource());
   


那么使用该 JdbcTemplate 的存储库可能是:

@Repository
public class JdbcSomeRepository implements SomeRepository 

   private final JdbcTemplate jdbcTemplate ;

   @Autowired
   public JdbcSomeRepository(JdbcTemplate jdbcTemplate) 
      this.jdbcTemplate = jdbcTemplate;
    

   @Override
   @Transactional 
   public int someUpdate(SomeType someValue, SomeOtherType someOtherValue) 
      return jdbcTemplate.update("INSERT INTO SomeTable(column1, column2) VALUES(?,?)", someValue, someOtherValue)
   

我用过的JdbcTemplate的更新方法可以在here找到。

【讨论】:

【参考方案3】:

你也可以使用NamedParameterJdbcTemplate(当你有很多参数时命名很有用)

Map<String, Object> params = new HashMap<>();
params.put("var1",value1); 
params.put("var2",value2); 
namedJdbcTemplate.update(
    "INSERT INTO schema.tableName (column1, column2) VALUES (:var1, :var2)",
    params
);

【讨论】:

【参考方案4】:

如果使用spring-boot,则不需要创建DataSource类,只需在application.properties中指定数据url/username/password/driver,然后@Autowired就可以了。

@Repository
public class JdbcRepository 

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public DynamicRepository(JdbcTemplate jdbcTemplate) 
        this.jdbcTemplate = jdbcTemplate;
    

    public void insert() 
        jdbcTemplate.update("INSERT INTO BOOK (name, description) VALUES ('book name', 'book description')");
    

application.properties 的示例:

#Basic Spring Boot Config for Oracle
spring.datasource.url=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=YourHostIP)(PORT=YourPort))(CONNECT_DATA=(SERVER=dedicated)(SERVICE_NAME=YourServiceName)))
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

#hibernate config
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect

然后在pom.xml中添加驱动和连接池依赖

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc7</artifactId>
    <version>12.1.0.1</version>
</dependency>

<!-- HikariCP connection pool -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>2.6.0</version>
</dependency>

有关详细信息,请参阅official doc。

【讨论】:

【参考方案5】:

您需要datasource 才能使用JdbcTemplate

JdbcTemplate template = new JdbcTemplate(yourDataSource);

template.update(
    new PreparedStatementCreator() 
        public PreparedStatement createPreparedStatement(Connection connection)
            throws SQLException 

            PreparedStatement statement = connection.prepareStatement(ourInsertQuery);
            //statement.setLong(1, beginning); set parameters you need in your insert

            return statement;
        
    );

【讨论】:

【参考方案6】:

我们可以对插入和更新/删除都使用更新

【讨论】:

以上是关于如何使用 Spring Framework 中的 JdbcTemplate 类执行 INSERT 语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eclipse 中查看 Spring Framework Javadoc?

如何使用 Spring JDBC Framework 将“null”时间戳插入 DB2 数据库

Spring Framework 中的 DAO、DTO 和 Service 层是啥?

如何使用 Hibernate JPA 和 Spring Framework 启用加载时间/运行时编织

Spring Framework 中的 Localhost 与 127.0.0.1

java Java中的缓存反射访问(来自Spring Framework代码库)