sql语句参数化,防止sql注入
创建命令发送器(prepareStatement)
在选择命令发送器时,不再使用createStatement,而是使用prepareStatement
在建立连接后,先写好sql语句,使用?占位
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.准备sql
String sql ="insert into urls values(null,?,?,?)";
//创建命令发送器
PreparedStatement preparedStatement = connection.prepareStatement(sql);
填充数据
通过setXXX方法填充占位的数据,下标从一开始,第一个参数数字1代表第一个位置,第二个参数是要填充的内容,以此类推。
preparedStatement.setObject(1,"测试");
preparedStatement.setObject(2,"测试1");
preparedStatement.setObject(3,"测试2");
执行sql 获取结果 关闭资源
int i = preparedStatement.executeUpdate();
//打印结果
System.out.println(i);
//关闭资源
preparedStatement.close();
connection.close();
与statement不同的是,prepareStatement在创建时要传入sql语句参数,在使用executeUpdate时不用再传参。
完整代码
@Test
public void test01() throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.准备sql
String sql ="insert into urls values(null,?,?,?)";
//创建命令发送器
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//填充数据
//setObject(第几个?从1开始,sname);
preparedStatement.setObject(1,"测试");
preparedStatement.setObject(2,"测试1");
preparedStatement.setObject(3,"测试2");
//执行sql,获取结果
int i = preparedStatement.executeUpdate();
//打印结果
System.out.println(i);
//关闭资源
preparedStatement.close();
connection.close();
}