今天看了Java Web教程视频,里面讲了MVC思想,Controller->Model->Dao->View,即在Controller中写操作,Service写对Model操作的逻辑,Dao层写数据库连接和具体操作,注意到三行代码:
Connection conn = DB_Util.getConnection(); String sql = "select * from student where 1<>1"; PreparedStatement ps = conn.prepareStatement(sql);
其中SQL语句的where 1<>1作用是当其他拼接的条件都不符合时返回空集,如果是where 1=1则返回全集,明显前者节省开销。
其次就是PreparedStatement类,他与Statement相比:
1.PreparedStatement可以传入带占位符的SQL语句,以便修改。
String sql="INSERT INTO course(id,name,classroom) VALUES(?,?,?);" PreparedStatement ps; ps.setLong(1,"1"); ps.setString(2,"zzjune"); ps.setString(3,"yifulou");
2.PreparedStatement可以防止SQL注入。
select * from users where username='a' or password='and password=' or '1'='1';
比如这条SQL语句,分析一下我们就会明白,其在数据库中执行的命令是:
username='a' or password='and password=' or '1'='1';
故会返回全集,这就是使用Statement可能会出现的情况,而PreparedStatement则会避免诸如此类的SQL注入,因为在预处理过程中就已经对SQL语句进行了处理,会将输入的字段完全作为一个参数来处理,引号也会被转义。
3.在更新数据库时,PreparedStatement有ps.executeUpdate();方法,该方法没有参数。Statement有executeQuery(sql)和execute(sql)方法,前者返回结果集,后者返回布尔值(也可无左值)。
参考资料:
扫描二维码关注公众号,回复:
907533 查看本文章