关于预编译语句PreparedStatement 的 setString类方法传NULL值到sql进行预编译时报 POINT EXCEPTION空指针异常总结

本文分享了在执行SQL语句时遇到NULL值导致的空指针异常问题及解决方案。通过将setString()方法替换为setObject(),成功解决了NULL值无法正确插入数据库的问题。文章强调了数据库表字段需支持NULL值的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、在实际应用中会出现这种需求,所以将我的经验进行记录,也方便他人,有什么其他思路也可以交流一下。
2、实际代码如下:

  • 首先是需要执行的sql语句
    private static String INSERT_RKK_YWGL_SQL = "INSERT INTO mz_rkk_ywgl VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  • 下面 是需要传进sql的部分字段值,这两个字段在获取时是null值
String dryxxlb = rs_ls.getString("dryxxlb");
String ndryxxlb =  rs_ls.getString("ndryxxlb");
  • 一开始是使用setString()方法在执行到这里时会报空指针异常
ps_in_rkk.setString(6, dryxxlb);
ps_in_rkk.setString(7, ndryxxlb);
ps_in_rkk.executeUpdate();
  • 解决方法,将上面的setString()改为setObject()
ps_in_rkk.setObject(6, dryxxlb);
ps_in_rkk.setObject(7, ndryxxlb);

需要注意的是,你所建的表字段必须能够存储null值,否则同样传不进去。

预编译(Prepared Statement)是SQL语言的一种执行方式,它是在发送给数据库服务器前先将SQL语句结构部分固定下来,然后将变量作为参数递进去。这种方法的主要优点是可以防止SQL注入攻击,并提高执行效率。 通俗来说,就像在写信一样,你先准备好一封信的主体内容:“亲爱的用户,你的账户余额是__元。”这里`__`是一个占位符,代表具体的数字。如果你每次都要替换这个“__”为一个特定数,就不用每次都拼接字符串,而是把“__”作为一个单独的参数递进去。这样做的好处是: 1. **防止SQL注入**:如果用户输入了恶意的数据,如`"'; DROP TABLE users; --"`,原生SQL执行会尝试执行这个危险的命令。而预编译则会把它当作一个参数处理,不执行作为SQL的一部分。 2. **提高效率**:数据库只需要解析一次完整的SQL模板,然后多次执行相同的结构,只是参数不同,这对于大型数据库来说尤其重要,可以减少网络往返和解释SQL的时间。 举个例子,在Java的JDBC中,你可以这样做: ```java PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?"); pstmt.setInt(1, userId); ResultSet rs = pstmt.executeQuery(); ``` 这里的`preparedStatement`就是预编译的,`?`是个占位符,表示后续入的参数。无论`userId`是多少,数据库只会在第一次解析时处理SQL语法,之后只需将每个用户ID设置进占位符即可避免重复解析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值