Spring JdbcTemplate代码示例:封装JdbcTemplate实现不同类型sql语句的执行逻辑

需求

请编写代码示例,使用JdbcTemplate接收两个参数:sql语句字符串和一个实体类,如果是select查询则返回实体类的List集合,如果是insert或update操作则返回实体类。

解答

在Spring JDBC中,JdbcTemplate本身并不直接支持根据实体类进行SQL操作并返回结果。但我们可以创建一个泛型的DAO层服务类,结合RowMapper或ResultSetExtractor来实现这个需求。以下是一个简化示例:

首先,定义一个简单的实体类(例如User):

public class User {
    private Long id;
    private String name;
    // getter, setter...
}

然后,创建一个泛型的JdbcService类:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import java.util.List;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcService<T> {

    private final JdbcTemplate jdbcTemplate;
    private final RowMapper<T> rowMapper; // 假设我们有一个适用于T类型的RowMapper

    public JdbcService(JdbcTemplate jdbcTemplate, RowMapper<T> rowMapper) {
        this.jdbcTemplate = jdbcTemplate;
        this.rowMapper = rowMapper;
    }

    // 执行SELECT查询并返回List<T>
    public List<T> executeSelect(String sql, Object... params) {
        return jdbcTemplate.query(sql, params, rowMapper);
    }

    // 执行INSERT或UPDATE操作,并返回影响行数(非实际的实体类)
    public int executeUpdate(String sql, Object... params) {
        return jdbcTemplate.update(sql, params);
    }
}

// 创建UserRowMapper
class UserRowMapper implements RowMapper<User> {
    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getLong("id"));
        user.setName(rs.getString("name"));
        return user;
    }
}

使用示例:

@Autowired
private JdbcService<User> jdbcService;

public void selectExample() {
    String sql = "SELECT * FROM users";
    List<User> users = jdbcService.executeSelect(sql);
    // ...
}

public void insertOrUpdateExample(User user) {
    String insertSql = "INSERT INTO users(name) VALUES (?)";
    String updateSql = "UPDATE users SET name = ? WHERE id = ?";
    
    // 假设user.getId()用于确定是执行插入还是更新
    if (user.getId() == null) {
        jdbcService.executeUpdate(insertSql, user.getName());
    } else {
        jdbcService.executeUpdate(updateSql, user.getName(), user.getId());
    }
}

请注意,为了简化示例,这里假设所有实体类都有一个"id"字段用于判断是执行插入还是更新操作。实际项目中,通常会为每个实体类编写对应的DAO方法,而不是在一个通用的服务类中处理所有情况。