JDBC再学习
1关于statement 接口提供了大致三类 执行sql语句的方法
execute
executeUpdate
executeQuery
具体使用那个方法 由产生的内容来指定
比如Select 语句 差生的是结果集,需要数据库返回数据 那么用Resultset executeQuery(sql);
比如insert delete update 只是影响数据库的内容 ,返回数据库改变的记录数 就可以 ,int executeUpdate(sql);
execute可以执行任何sql语句 返回值是boolean代表是否返回结果集
2、PreparedStatement 接口继承了statement
在编程中 Connection接口规定了创建具体向数据库发送sql语句的对象 即是statement 、PreparedStatement还是callableStatement
conn.createStatement()
conn.prepareStatement()
conn.prepareCall()
我们用的比较多的是 PreparedStatement .相比于statement 理由如下
1、代码易于理解
我们一般的sql语句都是带有参数的 preparedStatement 可以像如下设置参数
PreparedStatement pstm = conn.prepareStatement("insert into t_sm (p1,p2,p3...) values(?,?,?,...)");
pstm.setXxx(1,value);
pstm.setXxx(2,value);
pstm.executeUpdate();
2、代码预编译性能高
当你创建PreparedStatemet对象的时候DB编译一次后数据库会有缓存,每次执行相似的sql语句时候即只有参数不同,速度很快。(登录操作)
3、安全性高组织sql注入
比如你通过statement这样写登录语句
Statement stmt = conn.createStatement();
String sql = "select * from t_user where u_name ='" +varName+"'"+" and u_passwd ="+"'"+ varPasswd+"'";
stmt.executeQuery(sql);
这时候传入参数 varName ="anyone" varPasswd="' or '1'='1" 这样就完成了sql注入攻击。
而preparedStatement 是参数化查询 安全
# $符号的区别 在mybatis中。
Mybatis 本身是基于jdbc封装的
#{para}是预编译处理的范畴
${para} 是字符串替换。mybatis在处理#时会调用PreparedStatement 的setXxx方法来实现参数赋值,而处理$时,就是把${param}替换为变量的值,
这样做不安全。