多语言展示
当前在线:1466今日阅读:26今日分享:39

java数据库连接PreparedStatement接口的使用

使用statement本身作为key并将执行计划存入与statement对应的缓存中
工具/原料

eclipse

方法/步骤
1

l数据库具备缓存功能,可以对statement的执行计划进行缓存,以免重复分析  l缓存原理:        一 使用statement本身作为key并将执行计划存入与statement对应的缓存中      一 对曾经执行过的statements,再运行时执行计划将重用l举例:        — SELECT a,b FROM t WHERE c = 1:      一 再次发送相同的statement时,数据库会对先前使用过的执行计划进行重用,降低开销

2

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

3

l对JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement无效,因为PreparedStatement不允许在插入参数时改变SQL语句的逻辑结构 l使用预编译的语句对象,用户传入的任何数据不会和原SQL语句发生匹配关系,无需对输入的数据做过滤 l如果用户将”or 1 = 1”传入赋值给占位符,SQL语句将无法执行     select  * from t     where username = ? and password = ? ;

4

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();

5

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));

6

l常用的ResultSet,初始指针在第一行之前(BeforeFirst) l只能使用next()方法将指针向后移动,不能反向 l—次移动一行,不能跳行 l可滚动的结果集:指针可以在结果集中任意移动

推荐信息