发表于: 2017-08-26 23:42:43

3 896


今天完成的事情

学习应用JDBC增删改查.

这是连接与结束,后面的增删改查只是SQL语句不一样.

明天的计划,继续补基础,做任务.还有一周的总结.

遇到的问题;

这是SSL的问题 ,  不影响使用.

收获;

从师兄帮我解决的小问题开始,这个 id后面如果是+号需要跟上()而且需要两个以上数据组,后面为+号则是单个值.


try 、catch和finally语法

try{

}

try是对程序异常的处理

可以让程序即使有异常也可以运行下去

try{

}catch(Exception e){

}

catch是对异常信息的抓取

可以输出

try{

}catch(Exception e){

}finally{

}

finally无论try和catch是否执行,finally都执行.

数据库的连接是有限资源,相关操作结束后,如果不关闭连接,后面打开连接多的情况下,数据库会炸的,
先关闭Statement
后关闭Connection.

statement专门执行SQL语句,,executeQuery专门执行查询语句,并返回ResultSet.rs..

while(rs.next).next表明询问有没有数据有数据则调用出来.若调取结束则为false.

使用SQL语句判断账号密码正确时,正确方式是调取账号密码从数据库查.错误的方式,把账号密码放内存中比较.

使用Statement 需要进行字符串拼接,可读性和维护性比较差

String sql = "insert into hero values(null,"+"'提莫'"+","+313.0f+","+50+")"


PreparedStatement 使用参数设置,可读性好,不易犯错

String sql = "insert into hero values(null,?,?,?)

 ps.setString(1, "提莫");
            ps.setFloat(2, 313.0f);
            ps.setInt(3, 50);
            ps.execute();

Statement执行10次,需要10次把SQL语句传输到数据库端
数据库要对每一次来的SQL语句进行编译处理
            for (int i = 0; i < 10; i++) {
                String sql0 = "insert into hero values(null," + "'提莫'" + ","
                        + 313.0f + "," + 50 + ")";
                s.execute(sql0);
            }
            s.close();
  
PreparedStatement 执行10次,只需要1次把SQL语句传输到数据库端
数据库对带?的SQL进行预编译
 每次执行,只需要传输参数到数据库端
网络传输量比Statement更小
数据库不需要再进行编译,相应更快
            for (int i = 0; i < 10; i++) {
                ps.setString(1, "提莫");
                ps.setFloat(2, 313.0f);
                ps.setInt(3, 50);
                ps.execute();

假设name是用户提交来的数据

String name = "'A' OR 1=1"


使用Statement就需要进行字符串拼接
拼接出来的语句是:

select * from hero where name = 'A' OR 1=1


因为有OR 1=1,这是恒成立的
那么就会把所有的英雄都查出来,而不只是盖伦
如果Hero表里的数据时海量的,比如几百万条,把这个表里的数据全部查出来
会让数据库负载变高,CPU100%,内存消耗光,响应变得极其缓慢

而PreparedStatement使用的是参数设置,就不会有这个问题

任务进度:任务1,步骤17

任务开始时间2017-8-23

任务结束时间2017-9-1

无延期风险

禅道:http://task.ptteng.com/zentao/task-view-9516.html



返回列表 返回列表
评论

    分享到