gpt4 book ai didi

java - prepareStatement() 和 preparedStatement() 行为之间的区别

转载 作者:行者123 更新时间:2023-12-02 04:58:13 25 4
gpt4 key购买 nike

我注意到有很多关于CreateStatement 与PreparedStatement 的帖子,但是我的问题不同(只是为了通知这不是这些搜索结果之一的重复)

当我从 java 代码查询数据库时,我可以(至少)两种方式完成:

PreparedStatement 对象:

String quer =  "insert into table1 (name, phone, bday, lastasked);
PreparedStatenent pst = con.prepareStatement(quer);
pst.setString(1, "Stacy");
pst.setString(2, "555-0123456");
pst.setString(3, bdayFromInput);
pst.setString(4, "now()"); //should invoke sql now() function
pst.execute()

构建整个查询:

String query = "insert into table1 (name, phone, bday, lastasked) VALUES ('Stacy', '555-123456', '" + bdayFromInput + "',  now());";
try{
con.prepareStatement(query).execute();
}catch (SQLException e){
System.err.println("sql exception occured");
}

问题与 sql 中的“now()”函数有关 - 我猜测有某种包装器将 setString 转换为实际字符串(按照“now()”) - 使指令无效(特别是字符串 bday - 定义为表列中的日期,可以很好地处理手写日期)

我想要完成的是将最后一次更改行的时间存储为最后询问的列,同时使用漂亮的PreparedStatement对象并将数据库时间中的方法设置为无法真正调和的时间戳。如果有更好的方法,我愿意接受建议。

我想使用PreparedStatement对象的原因是易于处理blob - 我想稍后在blob上插入照片和个人日记/笔记,这将形成两个单独的blob,而VARCHAR或LONG VARCHAR可能会很好对于简短的笔记来说足够了,我认为对于较长的文本来说还不够,而且对于图片来说肯定没有用处

最佳答案

您可以混合使用这两种方法:

String sql= "insert into table1 (name, phone, bday, lastasked) values (?,?,?,now())";
PreparedStatenent pst = con.prepareStatement(sql);
pst.setString(1, "Stacy");
pst.setString(2, "555-0123456");
pst.setString(3, bdayFromInput);
pst.execute();

请注意,第二种方法容易受到 SQL 注入(inject)的影响,这就是为什么在将值传递给 JDBC 驱动程序时建议使用PreparedStatement。

关于java - prepareStatement() 和 preparedStatement() 行为之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28551970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com