一.sql注入的原理
使用preparedStatement解决Statement的sql注入问题的原理
PreparedStatement pst = conn.preparedStatement(sql); 被称为预编译sql语句,是指在使用Connection对象创建数据库连接对象时,直接将不完整的sql语句(缺少查询条件的sql语句)直接进行编译,后期在从键盘输入时,输入的数据不会被编译,输入会制备被当作字符串,就算从键盘输入的数据存在 AND OR 等关系,虚拟机也不会再此对其进行编译。
Statement st = conn.Statement(); st.execute(sql); 会先创建数据库连接对象st,st会将不完整的sql语句和从键盘输入的数据一起编译,输入的文本中的逻辑关系AND OR等关系也会参与编译,就会导致sql注入的问题。
二.PreparedStatement的优点
1.解决sql注入问题
2.可以才做图片视频等Blob流数据
3.可以实现更高效的批量操作
statement在执行sql语句时,会将插入的数据和sql一起编译,当数据量有10000000条时,sql会被编译执行10000000次,费时且占资源
PreparedStatement在插如10000000条数据时,sql语句只会预编译一次,而后的每一条数据的插入都不会在编译sql语句,省时间省资源。
二,数据库中获取数据库连接对象得两种方式:
1,DataSoure.getConnectio();
2,DriverManager.getConnection();
联系:
这两种方法都会获取数据库得连接。
区别:
DataSource方式有数据库连接池得支持,数据库连接池在初始化时,会创建一定数量得连接对象,保存在连接池中,使用Datasource获取连接对象,是在连接池中获取,而不是创建,在类加载时创建了对象,节约了后面线程在访问数据得时间。
每次在调用connection.close()方法时,不会关闭掉物理连接,而是将connection对象回收道数据连接池,以备其他线程使用。
DriverManager方式获取数据库连接,每次访问数据库都需要创建连接,因为使用DriverManager方式在释放资源时,会切断物理连接,直接销毁连接对象,所以每次都需要创建连接,而创建连接是一个非常耗时得工作,所以开发中,主要使用得还是DataSource方式。