PreparedStatement实现通用的增删改操作

251 阅读1分钟

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:上述代码为美观均未异常处理。