JDBC中PreparedStatement的使用说明

JDBC中PreparedStatement的使用说明

今天在学习JDBC时遇到了几个关于PreparedStatement的问题

导入的 jdbc版本为 mysql-connector-java-5.1.39-bin.jar

1. 使用方法(占位符)
2. 相比于Statement的优势
3. 使用时可能遇到的问题

1.使用方法(占位符)

import java.sql.*;
public class Main {
    public static void main(String[] args){
        try {
	            Class.forName("com.mysql.jdbc.Driver");
	            Connection conn = DriverManager.getConnection(
	                    "jdbc:mysql://localhost:3306/database?useSSL=false",
	                    "root",
	                    "password"
	            );
	            String sql = "INSERT INTO tablename(NAME,SALARY) VALUES(?,?)";
	            PreparedStatement stmt = conn.prepareStatement(sql);
	            stmt.setString(1,"小明");
	            stmt.setInt(2,1000);
	            stmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在代码中可以看到
Mysql语句INSERT INTO tablename(NAME,SALARY) VALUES(?,?)
应该键入数据的地方(values)后面写上的是两个问号
这就是PreparedStatement的一个特殊工具----占位符
在这之后的就是插入数据的语句

   //stmt是PreparedStatement的实例对象
   stmt.setString(1,"小明");
   stmt.setInt(2,1000);
   //也可以直接使用
   //stmt.Object(1,"小明");
   //stnt.Object(2,1000);

前面的数字表示的是参数索引
(特别注意,虽然平时索引值是从0开始,但在这个语句中,索引值是从1开始计数)
索引值依次对应占位符的先后位置

在这里 额外说两点

第一点
在使用Class.forName("com.mysql.jdbc.Driver")加载MySQL驱动时,需要抛出异常或者使用try…catch捕获异常

 //第一种,抛出异常
 public static void main(String[] args) throws ClassNotFoundException

//第二种,捕获异常
	try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } 

第二点
可能有同学注意到了代码中获取数据库连接时

Connection conn = DriverManager.getConnection(
	                    "jdbc:mysql://localhost:3306/database?useSSL=false",
	                    "root",
	                    "password"
	            );

"jdbc:mysql://localhost:3306/database?useSSL=false"
最后加上了 ?useSSL=false,在5.1.39版本中若不加会报如下异常

Sat Apr 13 23:14:19 CST 2019 WARN: Establishing SSL connection without server's 
identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ 
requirements SSL connection must be established by default if explicit option isn't set. For 
compliance with existing applications not using SSL the verifyServerCertificate property is 
set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set 
useSSL=true and provide truststore for server certificate verification.

在使用jdbc 8.0+版本时需要更改时区时间,否则也会报错。

2. 相比于Statement的优势

  • 在使用Statement时会遇到恶意SQL语句 例如: String sql = "delete from table where name='XXX' or 1=1 ";遇到上诉语句时,会直接吧你的数据表清空,因为后面的where条件始终正确
    而使用PreparedStatement时就不会出现这样的错误
  • 相比于Statement,PreparedStatement的可读性更强
  • 使用jdbc语句时,如果只操作少量次数数据表,推荐使用Statement来执行;
    而在执行较多sql语句时,更加偏向于使用PreparedStatement语句来执行;

原因是:PreparedStatement第一次执行时消耗非常高,它的性能体现于重复执行sql语句时;

3. 使用时可能遇到的问题

这个是我在第一次操作时遇到的问题
在使用PreparedStatement时在最后需要加上 stmt.executeUpdate();否则数据表不会被更改
stmt.executeUpdate();
因为我在看相关视频时那个老师没有加这个语句,而在我实际操作时不加则无法成功更改数据表
执行DDL语句时返回0;
执行DML语句时返回受影响的记录条数

DML: 由insert ,update,delete三个关键字完成
DDL:由create,alter,drop,truncate四个关键字完成
DCL:由grant,revoke两个关键字完成

你可能感兴趣的:(JDBC中PreparedStatement的使用说明)