一、or ture or安全问题-------------利用PreparedStatement接口解决
解决办法:使用Statement的子接口PreparedStatement来解决。
即:
PreperedStatement的参数使用占位符替代,
能通过setXxxx()方法为占位符赋值,
在赋值的过程中动态检测,预防SQL注入问题的发生。
code:
String sql = "select * from user where name = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,name);
pstmt.excuteQuery();
二、PerparedStatement解析
PreperedStatement是Statement的孩子,它的实例对象可以通过调用Connection.preparedStatement()方法获得。
获取--通过Connection类:
创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
PreparedStatement prepareStatement(String sql) ;
code:
PreparedStatement pstmt = conn.preparedStatement(sql);
常用方法:
1》设置占位符?的值
void setDouble(int parameterIndex, double x)
void setFloat(int parameterIndex, float x)
void setInt(int parameterIndex, int x)
void setString(int parameterIndex,String x);
void setDate(int parameterIndex,Date x);
paramterIndex:需要替换的占位符下标,从1开始
x:需要替换成的值
2》在此 PreparedStatement 对象中执行 SQL 查询
ResultSet executeQuery();
Blean execute();
int executeUpdate();
优点:相对于Statement对象而言:
1》PreperedStatement可以避免SQL注入的问题。
2》Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
PreparedStatement 可对SQL进行预编译,从而提高数据库的执行效率。
3》并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。
总结:PerparedStatement的特点
1》解决SQL注入问题,在绑定参数时,动态检测
2》使用?占位符替代真实的绑定值
3》在发送相同结构的SQL时,较Statement效率有所提升
故:
项目中优先使用:PreparedStatement!!!
三、Statement和PreparedStatement的特点
1》对于创建和删除表或数据库,我们可以使用executeUpdate(),该方法返回0,表示未影向表中任何记录
2》对于创建和删除表或数据库,我们还可以使用execute(),该方法返回false,表示创建和删除数据库表成功
总结:
int executeUpdate()函数:根据表中被影响的行数作为返回值。
boolean excute()函数:除了select操作外返回true之外,其它的操作都返回flase;