使用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;
}
}
- 对于Date类型,使用Timestamp类型来接收,它继承java.util.Date
- 对于int等基础类型,通过rs.wasNull()判断是否为null
扩展
- spring中的解决方法
具体可以看 JdbcUtils 的 getResultSetValue() 方法 - mybatis中的解决方法
具体可以看 DateTypeHandler 和 IntegerTypeHandler

浙公网安备 33010602011771号