You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:25:39