需求
请编写代码示例,使用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方法,而不是在一个通用的服务类中处理所有情况。