有关ResultSet类中getLong方法自动将null转为0的解决方式

本文讨论了在使用java.sql.ResultSet类获取数据库表中某列为null的值时,通过getLong方法获取后意外转为0的解决办法。通过使用wasNull方法判断并设置正确的值。
部署运行你感兴趣的模型镜像

   今天在开发中遇到一个问题,后台数据库table中某column保存的值明明是null,但是通过java.sql.ResultSet类中的getLong方法取出以后就自动转为0,这个值显然是不符合要求的。本人比较菜,纠结了很久不知如何解决,后来经牛人指点,说是可以使用该类中的wasNull()方法来判断最新一次get数据是否为空,代码片段如下:

 

  1. ResultVO resultVO = new ResultVO();
  2. ResultSet rs = new ResultSet();
  3. /* get data from db */
  4. ....
  5. /* end */
  6. resultVO.setTaskId(rs.getLong("task_id"));
  7. if (rs.wasNull()) {
  8.   resultVO.setTaskId(null);
  9. }
  10. ...

 

   注意:这个wasNull判断一定要紧跟在你想要判断非空的那个字段取动作之后,否则它判断的就不是你所期望的那个column值了。

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

如果想脱敏所有列 怎么修改下面的代码 import java.sql.*; import java.util.HashSet; import java.util.Set; import javax.sql.rowset.CachedRowSet; import javax.sql.rowset.RowSetProvider; public class DataMasker { // 脱敏规则实现 public static ResultSet maskSensitiveData(ResultSet originalRs) throws SQLException { // 创建可离线操作的CachedRowSet CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet(); crs.populate(originalRs); return new ResultSetWrapper(crs) { // 定义需要脱敏的字段名 private final Set<String> maskedColumns = new HashSet<String>() {{ add("name"); // 实际根据业务需求添加字段 add("phone"); // 示例字段 }}; @Override public String getString(String columnLabel) throws SQLException { String value = super.getString(columnLabel); return maskedColumns.contains(columnLabel.toLowerCase()) ? maskString(value) : value; } }; } // 具体脱敏逻辑 private static String maskString(String origin) { if (origin == null || origin.isEmpty()) return origin; final int keepChars = 1; // 保留前1位明文 if (origin.length() <= keepChars) { return origin + "*"; // 短字符串处理 } // 构造脱敏字符串: 保留前N位 + 星号填充 StringBuilder masked = new StringBuilder(origin.substring(0, keepChars)); for (int i = keepChars; i < origin.length(); i++) { masked.append('*'); } return masked.toString(); } // ResultSet包装 private static abstract class ResultSetWrapper implements ResultSet { protected final ResultSet delegate; public ResultSetWrapper(ResultSet delegate) { this.delegate = delegate; } // 默认实现所有ResultSet方法(实际需要重写数百个方法,此处简化) @Override public boolean next() throws SQLException { return delegate.next(); } @Override public String getString(int columnIndex) throws SQLException { return delegate.getString(columnIndex); } // ... 其他方法委托给原始ResultSet // 关键重写方法 @Override public String getString(String columnLabel) throws SQLException { return delegate.getString(columnLabel); } } // 使用示例 public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/pced"; String user = "root"; String password = "pass123"; try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = conn.prepareStatement("SELECT id, name, phone FROM t_test")) { ResultSet rs = pstmt.executeQuery(); ResultSet maskedRs = maskSensitiveData(rs); while (maskedRs.next()) { System.out.println("ID: " + maskedRs.getInt("id") + " | Name: " + maskedRs.getString("name") + " | Phone: " + maskedRs.getString("phone")); } } catch (SQLException e) { e.printStackTrace(); } } }
09-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值