如何使用JdbcTemplate从多张表中批量查询数据?
使用JdbcTemplate批量获取数据的实现方案
1. 先定义数据封装类
因为查询结果包含name、age、address三个字段,需要一个POJO来接收这些数据,示例如下:
public class UserInfo { private String name; private Integer age; private String address; // 对应查询字段顺序的构造方法 public UserInfo(String name, Integer age, String address) { this.name = name; this.age = age; this.address = address; } // 按需添加Getter方法 public String getName() { return name; } public Integer getAge() { return age; } public String getAddress() { return address; } }
2. 编写JdbcTemplate查询逻辑
方式一:用RowMapper手动映射结果(类型安全,推荐)
先把原SQL重构为更清晰的显式JOIN写法,再通过RowMapper把ResultSet映射为自定义对象:
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Date; // Spring环境下通过构造注入或@Autowired获取JdbcTemplate实例 private final JdbcTemplate jdbcTemplate; public List<UserInfo> getUserInfoBatch(Date startDate, Date endDate) { String sql = """ SELECT nt.name, at.age, ad.address FROM name_table nt JOIN age_table at ON nt.id = at.id JOIN address_table ad ON at.id = ad.id WHERE nt.new_date BETWEEN ? AND ? """; return jdbcTemplate.query(sql, new RowMapper<UserInfo>() { @Override public UserInfo mapRow(ResultSet rs, int rowNum) throws SQLException { return new UserInfo( rs.getString("name"), rs.getInt("age"), rs.getString("address") ); } }, startDate, endDate); }
方式二:用BeanPropertyRowMapper简化映射(需POJO满足规范)
如果给UserInfo添加默认构造方法和Setter,可以使用Spring提供的现成映射器,减少代码量:
// 修改后的UserInfo类 public class UserInfo { private String name; private Integer age; private String address; // 默认构造方法 public UserInfo() {} // 对应字段的Setter方法 public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public void setAddress(String address) { this.address = address; } // Getter方法 // ... } // 查询逻辑 public List<UserInfo> getUserInfoBatch(Date startDate, Date endDate) { String sql = """ SELECT nt.name, at.age, ad.address FROM name_table nt JOIN age_table at ON nt.id = at.id JOIN address_table ad ON at.id = ad.id WHERE nt.new_date BETWEEN ? AND ? """; return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(UserInfo.class), startDate, endDate); }
3. 关键说明
- 参数处理:SQL中的
?是JdbcTemplate的占位符,直接传入startDate和endDate即可,框架会自动处理SQL注入问题。 - 批量获取:
jdbcTemplate.query()方法会直接返回符合条件的所有结果列表,这就是批量获取的实现,无需额外处理“批量”逻辑。 - SQL优化:把原语句的隐式连接改成显式JOIN,逻辑更清晰,避免潜在的笛卡尔积错误。
内容的提问来源于stack exchange,提问作者razzledazzle88
相关产品推荐
相关产品推荐

