MySQL数据库干货_27——PreparedStatement的使用(重点)
PreparedStatement的使用(重点)
PreparedStatement对象简介
继承自 Statement 接口,由 preparedStatement方法创建。PreparedStatement具有预编译SQL语句能力,所以PreparedStatement 对象比 Statement 对象的效率更高,由于实现了动态的参数绑定,所以可以防止 SQL 注入,所以我们一般都使用 PreparedStatement。
PreparedStatement对象的特点:
- PreparedStatement 接口继承 Statement 接口
- PreparedStatement 效率高于 Statement
- PreparedStatement 支持动态绑定参数
- PreparedStatement 具备 SQL 语句预编译能力
- 使用 PreparedStatement 可防止出现 SQL 注入问题
PreparedStatement 的预编译能力
语句的执行步骤
- 语法和语义解析
- 优化 sql 语句,制定执行计划
- 执行并返回结果
但是很多情况,我们的一条 sql 语句可能会反复执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。 如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行 了。所谓预编译语句就是将这类语句中的值用占位符替代,可以视为将 sql 语句模板化或者说参数化预编译语句的优势在于:一次编译、多次运行,省去了解析优化等过程;此外预编译语 句能防止 sql 注入
通过PreparedStatement添加数据
/**
* PreparedStatement使用的测试类
*/
public class PreparedStatementTest {
/**
* 添加用户
*/
public void insertUsers(String username,int userage){
Connection connection = null;
PreparedStatement ps = null;
try{
//获取数据库连接
connection = JdbcUtils.getConnection();
//定义Sql。?是PreparedStatement对象中的绑定参数的占位符。问号的位置是从1开始计数的
String sql = "insert into users values(default,?,?)";
//创建PreparedStatement对象
ps = connection.prepareStatement(sql);
//完成参数的绑定
ps.setString(1,username);
ps.setInt(2,userage);
int i = ps.executeUpdate();
System.out.println(i);
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtils.closeResource(ps,connection);
}
}
}
通过PreparedStatement修改数据
/**
* 通过PreparedStatement对数据库表更新数据
*/
public void updateByUserId(int userid,String username,int userage){
Connection connection=null;
PreparedStatement preparedStatement=null;
try{
//获取数据库连接
connection=JdbcUtils.getConnection();
//获取PreparedStatement对象
preparedStatement=connection.prepareStatement("update users set userName=?,userAge=? where userid=?");
//对参数进行动态绑定
preparedStatement.setString(1,username);
preparedStatement.setInt(2,userage);
preparedStatement.setInt(3,userid);
//执行sql语句
int i = preparedStatement.executeUpdate();
System.out.println(i);
}catch (Exception e){
e.printStackTrace();
}finally {
JdbcUtils.closeResource(preparedStatement,connection);
}
}
通过PreparedStatement删除数据
/**
* 根据用户ID删除指定用户
*/
public void deleteUsersById(int userid){
Connection conn = null;
PreparedStatement ps = null;
try{
//获取数据库连接对象
conn = JdbcUtils.getConnection();
//创建PreparedStatement对象
ps = conn.prepareStatement("delete from users where userid = ? ");
//绑定参数
ps.setInt(1,userid);
int i = ps.executeUpdate();
System.out.println(i);
}catch (Exception e){
e.printStackTrace();
}finally{
JdbcUtils.closeResource(ps,conn);
}
}