使用jdbc查询mysql数据踩坑

问题描述

大部分项目应该都直接使用mybatis或者jpa等框架了,但是可能某些特殊场景还是需要使用JdbcTemplate来直接和数据库打交道,在这个过程中从ResultSet中读取数据并映射成Bean对象就可能踩坑,具体示例如下

import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CampaignPlanRowMapper implements RowMapper<CampaignPlan> {
    @Override
    public CampaignPlan mapRow(ResultSet rs, int rowNum) throws SQLException {
        CampaignPlan plan = new CampaignPlan();
        //ResultSet返回的Date类型为java.sql.Date(继承java.util.Date),不包含时分秒数据
        plan.setCreateDate(rs.getDate("create_date"));
        //ResultSet返回的int类型为基础类型,有默认值0,但是我们需要的是Integer
        plan.setCodeTotal(rs.getInt("code_total"));
        return null;
    }
}

解决方法

public class CampaignPlanRowMapper implements RowMapper<CampaignPlan> {
    @Override
    public CampaignPlan mapRow(ResultSet rs, int rowNum) throws SQLException {
        CampaignPlan plan = new CampaignPlan();
        //ResultSet返回的Date类型为java.sql.Date(继承java.util.Date),不包含时分秒数据
//        plan.setCreateDate(rs.getDate("create_date"));
        plan.setCreateDate(rs.getTimestamp("create_date"));
        //ResultSet返回的int类型为基础类型,有默认值,但是我们需要的是Integer
        int codeTotal = rs.getInt("code_total");
        plan.setCodeTotal(rs.wasNull() ? null : codeTotal);
        return null;
    }
}
  1. 对于Date类型,使用Timestamp类型来接收,它继承java.util.Date
  2. 对于int等基础类型,通过rs.wasNull()判断是否为null

扩展

  1. spring中的解决方法
    具体可以看 JdbcUtils 的 getResultSetValue() 方法
  2. mybatis中的解决方法
    具体可以看 DateTypeHandler 和 IntegerTypeHandler
posted @ 2025-04-10 22:54  strongmore  阅读(30)  评论(0)    收藏  举报