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