你知道 PreparedStatement 和 Statement 的区别吗?

一、连接数据库的步骤

第一种:
(1)加载驱动: Class.forName(“com.mysql.jdbc.Driver”);
(2)获取连接:
Connection connection=DriverManager.getConnection(
“jdbc:mysql://localhost:3306/数据库名称?useSSL=false”,
“root”,
“数据库密码”);
(3)创建处理对象:
Statement statement=connection.createStatement();
(4)编写sql语句:String sql;
(5)执行sql语句:
statement.executeQuery(sql); //查询
starement.executeUpdate(sql); //增,删,改
(6)关闭处理对象: statement.close();
(7)关闭连接: connection.close();


第二种:
(1)创建一个 DataSource 数据源

DataSource  dataSource = new MysqlDataSource();
MysqlDataSource tmpDataSource = (MysqlDataSource) dataSource;   
tmpDataSource.setURL("jdbc:mysql://127.0.0.1:3306/java_image_server?characterEncoding=utf8&useSSL=true");
tmpDataSource.setUser(“root");
tmpDataSource.setPassword("123");
return dataSource;

(2)获取连接:
Connection connection=dataSource. getConnection() ;
(3)编写sql语句:String sql;
(4)创建对象:
PreparedStatement statement=connection. prepareStatement( sql );
(5)执行sql语句:
statement.executeQuery(); //查询
starement.executeUpdate(); //增,删,改
(5)关闭处理对象: statement.close();
(6)关闭连接: connection.close();

二、区别

1.PreparedStatement 是 java.sql 包下面的一个接口,通过调用connection.preparedStatement(sql) 方法可以获得 PreparedStatment 对象。数据库系统会对 sql 语句进行预编译处理(如果JDBC驱动支持的话),之后都不会再去进行编译。 预处理语句被预先编译好,这条预编译的 sql 查询语句能在将来的查询中重用,这样一来,它比 Statement 对象生成的查询速度更快。

2.使用 Statement 还是 PreparedStatement 对象
JDBC驱动的最佳化是基于使用的是什么功能.,选择 PreparedStatement 还是 Statement 取决于你要怎么使用它们.。对于只执行一次的 SQL 语句选择Statement 是最好的. 相反, 如果 SQL 语句被多次执行选用PreparedStatement 则是最好的.

3.PreparedStatement 对象可以防止 sql 注入,而 Statement 不能防止 sql 注入。

什么是 SQL 注入呢?
SQL 注入即是指web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web 应用程序中事先定义好的查询语句的结尾上添加额外的SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

4.PreparedStatement 继承自 Statement, 两个都是接口
区别:PreparedStatement 可以使用占位符,是预编译的,批处理比Statement 效率高

5.Statement执行不带参数的简单SQL语句,并返回它所生成结果的对象,每次执行SQL语句时,数据库都要编译该sql语句。PreparedStatement用来执行带参数的预编译的SQL语句

三、总结

关于 PreparedStatement 接口,需要重点记住的是:

  1. PreparedStatement 可以写参数化查询,比 Statement 能获得更好的性能。
  2. 对于 PreparedStatement 来说,数据库可以使用已经编译过及定义好的执行计划,这种预处理语句查询比普通的查询运行速度更快。
  3. PreparedStatement 可以阻止常见的 SQL 注入式攻击(安全性好)
  4. PreparedStatement可以写动态查询语句
  5. PreparedStatement 与 java.sql.Connection 对象是关联的,一旦你关闭了connection,PreparedStatement 也没法使用了。
  6. “?” 叫做占位符。
  7. 占位符的索引位置从1开始而不是0,如果填入0会导致java.sql.SQLException invalid column index 异常。
  8. 效率高:使用PreparedStatement执行SQL命令时,命令会被数据库编译和解析,并放到命令缓冲区.以后每当执行同一个PreparedStatement对象时,预编译的命令就可以重复使用
  9. 代码可读性和可维护性好

你可能感兴趣的:(数据库)