既然java.sql包里面提供有Statement接口可以实现数据库的操作,那么为什么又要提供一个PreparedStatement接口实现数据库的操作呢?
Statement接口操作的问题
下面就以更新操作为例,在Statement接口中如果想要执行SQL语句,那么一定要通过字符串实现SQL结构的定义,但是这种定义如果要结合到用户输入数据的情况下就有可能会有问题存在了,下面通过一个程序做一个简单的模拟。
范例:Statement接口操作问题
package cn.mldn.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JDBCDemo {
private static final String DATABASE_DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DATABASE_URL = "jdbc:oracle:thin:@localhost:1521:mldn";
private static final String DATABASE_USER = "scott";
private static final String DATABASE_PASSWORD = "tiger";
public static void main(String[] args) throws Exception{
String title = "MLDN新闻'老李写的"; // 问题
int read = 99;
double price = 99.8;
String content = "这个春天有点冷";
String pubdate = "1971-04-10"; // 问题1:日期使用了字符串描述
String sql = "INSERT INTO news(nid,title,read,price,content,pubdate) VALUES "
+ " (news_seq.nextval,'"+title+"',"+read+","+price+", "
+ " '"+content+"',TO_DATE('"+pubdate+"','yyyy-mm-dd'))"; // 问题二:维护困难
System.out.println(sql);
Connection conn = null; //每一个Connection接口对象描述的就是一个用户连接
Class.forName(DATABASE_DRIVER); //向容器之中加载数据库驱动程序
conn = DriverManager.getConnection(DATABASE_URL, DATABASE_USER, DATABASE_PASSWORD);
Statement stmt = conn.createStatement(); // 创建数据库的操作对象
int count = stmt.executeUpdate(sql); // 返回影响的行数
System.out.println("更新操作影响的数据行数:" + count);
conn.close(); //数据库的连接资源有限一定要关闭
}
}
INSERT INTO news(nid,title,read,price,content,pubdate) VALUES (news_seq.nextval,'MLDN新闻'老李写的',99,99.8,'这个春天有点冷',TO_DATE('1971-04-10','yyyy-mm-dd'))
利用Statement执行的SQL语句问题有如下三种:
1、不能很好的描述出日期的形式;
2、需要进行SQL语句的拼凑处理,而导致的结果就是:SQL语句的编写与维护困难;
3、对于一些敏感的字符数据无法进行合理拼凑;
所以,现在就可以发现,虽然Statement可以操作数据库,但是其在操作的过程中并不是那么的方便,而它最大的弊端:需要进行SQL语句的拼凑。