eclipse
l数据库具备缓存功能,可以对statement的执行计划进行缓存,以免重复分析 l缓存原理: 一 使用statement本身作为key并将执行计划存入与statement对应的缓存中 一 对曾经执行过的statements,再运行时执行计划将重用l举例: — SELECT a,b FROM t WHERE c = 1: 一 再次发送相同的statement时,数据库会对先前使用过的执行计划进行重用,降低开销
l场景:String sql = ''select * from t where username=' ''+name+'' 'and password=' ''+passwd+'' ' '';l输入参数后,数据库接受到的完整sql语句将是:select * from t where username= 'scott' and password= 'tiger';l如果用户输入的passwd参数是:‘a' or‘b’=’b‘,则数据库收到的SQL语句将是: seclect*from t where username= 'scott' and password = 'a' or 'b' = 'b';此SQL语句的where条件将永远为true
l对JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement无效,因为PreparedStatement不允许在插入参数时改变SQL语句的逻辑结构 l使用预编译的语句对象,用户传入的任何数据不会和原SQL语句发生匹配关系,无需对输入的数据做过滤 l如果用户将”or 1 = 1”传入赋值给占位符,SQL语句将无法执行 select * from t where username = ? and password = ? ;
String sql = ''select empno, ename, sal, hiredatefrom emp'';rs = stmt.executeQuery(sql);while ( rs.next() ) { int empno = rs.getlnt(''empno''); String ename = rs.getString(''ename''); double sal = rs.getDouble(''sal''); Date hiredate = rs.getDate(''hiredate'');} rs.close();
lResultSetMetaData:数据结果集的元数据 l和查询出来的结果集相关,从结果集(ResultSet)中获取 ResultSetMetaData rsm = rs.getMetaData(); int columnCount = rsm.getColumnCount(); String columnName = null; for(int i=1;i<=columnCount; i++){ columnName= rsm.getColumnName(i));
l常用的ResultSet,初始指针在第一行之前(BeforeFirst) l只能使用next()方法将指针向后移动,不能反向 l—次移动一行,不能跳行 l可滚动的结果集:指针可以在结果集中任意移动