📅  最后修改于: 2023-12-03 15:20:13.639000             🧑  作者: Mango
在使用Spring框架进行开发时,数据库操作是必不可少的一部分。Spring提供了多种方式来进行数据库操作,其中 SimpleJDBCTemplate 是最常用的一种方式之一。它是Spring中对JDBC操作进行简化封装的一个类。
<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>
<!-- 配置数据源 -->
<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>
@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
在复杂的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操作。