前言
前面一篇我们讲到使用Statement操作数据表会导致SQL注入攻击,所以对于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement(从Statement扩展而来) 取代 Statement 就可以了,下面讲讲使用PreparedStatement
一、使用PreparedStatement
设计一个customers表
使用 PrepareStatement来替换 Statement,实现对数据表的增删改查操作:
增加操作:
import java.io.InputStream;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.Properties;
import org.junit.Test;
import mysqlconnction.testconnction01;
import com.mysql.jdbc.Connection;
/*
* 使用 PrepareStatement来替换 Statement,实现对数据表的增删改查操作
*/
public class PrepareStatementUpdateTest {
// 向customers表中添加一条记录
@Test
// 方式五,(final版):将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接
// 实现了数据和代码的分离(解耦)
public void testInsert() {
// 1.读取配置文件的4个基本信息
Connection connection = null;
PreparedStatement ps = null;
try {
InputStream is = ClassLoader.getSystemClassLoader()
.getResourceAsStream("jdbc.properties");
Properties p = new Properties();
p.load(is);
String user = p.getProperty("user");
String password = p.getProperty("password");
String url = p.getProperty("url");
String driverClass = p.getProperty("driverClass");
// 2.加载驱动
Class.forName(driverClass);
// 3.获取连接
connection = (Connection) DriverManager.getConnection(url, user,
password);
// System.out.println(connection);
// 4、预编译SQL语句,返回PreparedStatement的实例
String sql = "insert into customers(name,email,birth) values(?,?,?)";// ?
// :占位符
ps = connection.prepareStatement(sql);
// 5、填充占位符
ps.setString(1, "李晓敏");
ps.setString(2, "diaolove@qq.com");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = sdf.parse("1000-01-01");
ps.setDate(3, new Date(date.getTime()));
// 6.执行操作
ps.execute();
System.out.println("操作成功!");
} catch (