JDBC | 3

来源:互联网 发布:网络人身攻击怎么办 编辑:程序博客网 时间:2024/06/11 21:14

Statement 的执行模式采用拼凑字符串的形式,不适合处理一些敏感性字符。

PreparedStatement 执行的是一个完整的具备特殊占位标记的 SQL 语句,并且可以动态地设置所需要的数据。

使用 PreparedStatement 的优点

代码拥有更好的可读性和可维护性。

尽可能提升性能。用Statement对象时,每次执行一个 SQL 命令,都会对它进行解析编译。而使用 PreparedStatement 时,数据库会对 SQL 语句进行预编译,下次执行相同的 SQL 语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率

极大地提高了安全性。传递给 PreparedStatement 对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。从安全性上来看, PreparedStatement 是通过 ? 来传递参数的,避免了拼 sql 而出现 sql 注入的问题,所以安全性较好。

import java.sql.*;public class Main {    private static final String DBDRIVER = "com.mysql.jdbc.Driver";    private static final String DBURL = "jdbc:mysql://localhost:3306/TEACH?characterEncoding=utf-8&useSSL=true";    private static final String DBUSER = "root";    private static final String DBPASSWORD = "newpass";    public static void main(String[] args) throws Exception{        // 加载数据库驱动程序        Class.forName(DBDRIVER);        // 连接数据库        Connection connection = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);        System.out.println(connection);        String sql = "INSERT into ELECTIVE VALUES (?,?,?)";        PreparedStatement preparedStatement = connection.prepareStatement(sql);        preparedStatement.setString(1,"100");        preparedStatement.setString(2,"D");        preparedStatement.setString(3,"99");        preparedStatement.executeUpdate();        String sql2 = "SELECT SNO,CNO,SCORE FROM ELECTIVE";        PreparedStatement preparedStatement1 = connection.prepareStatement(sql2);        ResultSet resultSet = preparedStatement1.executeQuery();        while (resultSet.next()){            String SNO = resultSet.getString("SNO");            String CNO = resultSet.getString("CNO");            String SCORE = resultSet.getString("SCORE");            System.out.println(SNO + " " + CNO + " " + SCORE);        }        // 关闭连接        connection.close();    }}