一、问题
Statement和PrepareStatement都可以执行SQL语句实现对数据库表的操作,那到底有什么不同呢?
二、解答
1.Statement说明
Statement用于执行静态SQL语句并返回它所生产结果的对象,Statement在执行SQL语句时,必须制定一个事先准备好的SQL语句。具体如下:
String sql="insert into tab_test (col1,col2) values ( "+val1+" , "+val2+")";@b@@b@Statement stmt=conn.createStatement();@b@@b@stmt.executeUpdate(sql);
2. PrepareStatement说明
PrepareStatement表示预编译的SQL语句的对象,SQL语句被预编译并存储在对象中,被封装的SQL语句代表某一类操作,SQL语句中允许包含动态参数“?”,在执行时可以为“?”动态设置参数值。PrePareStatement的使用方法如下:
String sql="insert into tab_test (col1,col2) values(?,?)";@b@@b@PrepareStatement pstmt=conn.prepareStatement(sql);@b@@b@pstmt.setString(1,val1);@b@pstmt.setString(2,val2);@b@@b@pstmt.executeUpdate();
使用PrepareStatement对象执行SQL命令是,SQL命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一PrepareStatement对 象时,他就被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在企业级应用软件中,经常会重复执行相同的SQL操作,使用PrepareStatement对象带来的编译次数会提高数据总体性能
三、总结
在多次执行相同SQL操作的情况下,可以选用PrepareStatement;在仅执行一次SQL操作的情况下,两者都适合。通常,在使用Statement之前,需要利用字符串拼写SQL语句,如果遇到参数值含有“””、“‘”和“,”等特殊字符时,拼写出的是一个非法的SQL语句。但由于PrepareStatement是将参数值和SQL语句分开,因此不会出现问题,即使遇到特殊字符也能正确执行。这也是有些开发者是在SQL执行一次还是多次的情况,都使用 PrepareStatement的原因