1.使用PreparedStatement进行增删改的原因
Statement也可以用来实现增删改,其弊端为:①需要注意字符串的拼接,属实反人类 ②SQL注入,安全性较低,因此使用PreparedStatement进行增删改
2.使用PreparedStatement进行增删改的操作
2.1连接数据库(此处采用配置文件的方式)
先获取配置文件的输入流,利用Properties.load()获得权限,进而获得数据库相关信息
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc,properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String driverClass = pros.getProperty("driverCass");
String url = pros.getProperty("url");
Class.forName(driverClass);
Connection conn = DriverManager.getConnection(url, user, password);
2.1.1
在进行此节的学习时,对Class.forName(driverClass)传入com.mysql.cj.jdbc.Driver就知道要连接的数据库和注册一个mysql驱动抱有疑惑,查询资料后发现原因如下:Class.forName()方法中调用了forName0方法,在这个方法里,由于传入的是com.mysql.jdbc.Driver,其在之前没有被初始化过,所以这个类会被初始化,在Driver类中存在如下代码
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
注意到其中有个静态代码,所以该类在初始化的时候,静态代码块的内容被执行,所以会注册一个mysql驱动, 导致Class.forName = DriverManager.registerDriver(new Driver)
2.2 预编译
假定实现增删改通用函数为public void update(String sql,Object ...args)
PreparedStatement ps = conn.prepareStatement(sql);
2.3填充占位符
利用循环
for(int i = 0;i < args.length;i++){
ps.setObject(i+1,args[i]);
}
2.4 执行操作
ps.execute();
PS:上述代码为美观均未异常处理。