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

时间:2015-02-16 23:11:24

标签: java sql hsqldb

我注意到有很多关于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 - 在表格列中定义为日期,可以用手写日期工作)

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

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

1 个答案:

答案 0 :(得分:2)

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

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注入的影响,这就是为什么在将值传递给JDBC驱动程序时建议使用PreparedStatement。