📜  Spring – SimpleJDBCTemplate 与示例(1)

📅  最后修改于: 2023-12-03 15:20:13.639000             🧑  作者: Mango

Spring – SimpleJDBCTemplate 介绍

在使用Spring框架进行开发时,数据库操作是必不可少的一部分。Spring提供了多种方式来进行数据库操作,其中 SimpleJDBCTemplate 是最常用的一种方式之一。它是Spring中对JDBC操作进行简化封装的一个类。

SimpleJDBCTemplate的特点
  • 简化了JDBC操作,只需要编写SQL语句和参数绑定即可完成增删改查等操作。
  • 自动管理和释放数据库连接资源,避免了手动管理造成的线程安全问题。
  • 提供了回调函数的机制,方便进行复杂的JDBC操作。
SimpleJDBCTemplate的使用
  1. 引入Spring和数据库驱动的依赖
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
  1. 配置数据源和SimpleJDBCTemplate
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<!-- 配置SimpleJDBCTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>
  1. 编写DAO类,通过SimpleJDBCTemplate进行数据库操作
@Repository
public class UserDaoImpl implements UserDao {
 
    @Autowired
    private JdbcTemplate jdbcTemplate;
 
    @Override
    public List<User> findAll() {
        String sql = "SELECT * FROM user";
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
        return jdbcTemplate.query(sql, rowMapper);
    }
 
    @Override
    public User findById(Long id) {
        String sql = "SELECT * FROM user WHERE id = ?";
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
        return jdbcTemplate.queryForObject(sql, rowMapper, id);
    }
 
    @Override
    public void save(User user) {
        String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
        Object[] args = {user.getName(), user.getAge()};
        jdbcTemplate.update(sql, args);
    }
 
    @Override
    public void update(User user) {
        String sql = "UPDATE user SET name = ?, age = ? WHERE id = ?";
        Object[] args = {user.getName(), user.getAge(), user.getId()};
        jdbcTemplate.update(sql, args);
    }
 
    @Override
    public void deleteById(Long id) {
        String sql = "DELETE FROM user WHERE id = ?";
        jdbcTemplate.update(sql, id);
    }
}

在以上代码中,我们通过@Autowired注入了JdbcTemplate,可以直接使用里面提供的query、update等方法进行增删改查操作。例如,在findAll方法中,我们编写了查询所有用户的SQL语句,并将查询结果映射为List返回。在save方法中,我们编写了插入用户的SQL语句,并将用户信息作为参数传入update方法。

SimpleJDBCTemplate的回调函数

在复杂的JDBC操作中,我们可能需要手动管理数据库连接、事务等资源,这时可以利用SimpleJDBCTemplate提供的回调函数机制。例如,在一个方法中需要进行多个操作,且这些操作必须在同一个事务中执行,那么我们可以通过TransactionCallback接口和TransactionTemplate类实现如下代码:

@Override
public void save(User user) {
    TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
            String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
            Object[] args = {user.getName(), user.getAge()};
            jdbcTemplate.update(sql, args);
 
            // ...其他的数据库操作
 
            if (xxx) {
                transactionStatus.setRollbackOnly();
            }
        }
    });
}

在以上代码中,我们通过TransactionTemplate创建了一个事务,并通过execute方法传入一个TransactionCallback对象,在回调函数中进行一系列数据库操作。需要注意的是,在回调函数中调用setRollbackOnly方法可以将事务标记为回滚状态。

总结

SimpleJDBCTemplate是Spring中常用的JDBC封装类,可以简化JDBC操作,自动处理连接资源和事务,提供回调函数机制。在使用时需要配置数据源和SimpleJDBCTemplate,并能够灵活使用回调函数进行复杂的JDBC操作。