- Statement接口在创建语句对象时,不带参数,进行查询更新操作时,再传入完整的SQL 语句。而PreparedStatement接口创建预处理语句对象时,传入带?的SQL语句,进行查询更新操作时,不带参数。
- PreparedStatement接口代码可读性高,无需拼接SQL语句,语句和代码分离。
- PreparedStatement接口执行效率高,它预编译和缓存了结构相同的SQL语句,想String常量池。
- PreparedStatement接口安全性更高,避免了产生SQL漏洞注入。
使用PreparedStatement接口完成数据更新操作
//步骤1---通过反射实例化数据库驱动类
//Class.forName("完整的数据库驱动类名");
Class.forName("com.mysql.jdbc.Driver");
//步骤2---调用DriverManager的静态工厂方法获取数据库连接对象
//Connection conn = DriverManager.getConnection("jdbc:mysql://数据库所在的主机名或IP地址:端口号/数据库名", "连接数据库的用户名", "连接数据库的密码");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/news", "root", "1");
//步骤3---准备带?的SQL语句
String sql = "xxx";
//步骤4---调用连接对象的工厂方法创建预处理语句对象,传入sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
//步骤5---调用预处理语句对象的setXXX()方法为SQL语句中的每个?传参
pstmt.setXXX(参数序号, 参数值);
//步骤6---调用预处理语句对象的更新方法,返回本次更新所影响的记录行数,行数>0---表示更新成功 行数=0---找不到要更新的数据 行数<0---更新失败
int rows = pstmt.executeUpdate();
//步骤7---关闭预处理语句对象和数据库连接对象
pstmt.close();
conn.close();
使用Statement接口完成数据查询操作
//步骤1---通过反射实例化数据库驱动类
//Class.forName("完整的数据库驱动类名");
Class.forName("com.mysql.jdbc.Driver");
//步骤2---调用DriverManager的静态工厂方法获取数据库连接对象
//Connection conn = DriverManager.getConnection("jdbc:mysql://数据库所在的主机名或IP地址:端口号/数据库名", "连接数据库的用户名", "连接数据库的密码");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/news", "root", "1");
//步骤3---调用连接对象的工厂方法创建语句对象
Statement stmt = conn.createStatement();
//步骤4---准备完整的SQL语句
String sql = "select...";
//步骤5---调用语句对象的查询方法,传入SQL语句,返回结果集对象
ResultSet rs = stmt.executeQuery(sql);
//步骤6---使用while循环遍历结果集,调用next()方法将指针移动到下一条记录
while(rs.next()){
//步骤7---使用结果集对象的getXXX()方法获取当前记录中不同数据类型的字段值
}
//步骤8---关闭结果集对象,语句对象,数据库连接对象
rs.close();
stmt.close();
conn.close();