浅谈JDBC中ParperStatement和Statement的区别

在开始本篇文章之前,笔者先废话几句,相信在接触过JDBC内容的时候,很多读者都会接触到以下这两个对象实例:ParperStatement和Statement。如果你没有接触过,当然也可以继续往下学习本篇文章内容。笔者认为这两者的作用其实差不多,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句。但是,这两者还是存在着一定的差异,所以本篇文章就围绕“ParperStatement和Statement的区别”进行简单讲解。

1、执行SQL语句的格式不同

浅谈JDBC中ParperStatement和Statement的区别

问题描述:假设当前数据库db_blog中存在tb_user表,并且该表中存在username数据列,我们分别使用ParperStatement和Statement进行查询操作。

使用Statement查询:

String sql = "select * from tb_user where username= '" + username + "'"; 
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);

使用ParperStatement查询:

String sql = "select * from tb_user where username = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,username);
rs = pstmt.executeQuery();

对比分析:ParperStatement可以很好的将SQL语句中的变量分离了出来,提供了代码的可读性,并且利于代码的维护,当然笔者在这里为了方便只是用了一个参数进行举例说明,读者可能看不出有啥可提高代码的可读性啥的,但是在实际开发中,很少会根据一个参数去查询数据的。


2、执行SQL的效率

PrepareStatement接口是Statement接口的子接口,其继承了Statement接口的所有功能。它主要是拿来解决我们使用Statement对象多次执行同一个SQL语句的效率问题的。ParperStatement接口的机制是在数据库支持预编译的情况下预先将SQL语句编译,当多次执行这条SQL语句时,可以直接执行编译好的SQL语句,这样就大大提高了程序的灵活性和执行效率。要知道SQL在执行过程中编译的过程中往往会需要一定的开销的(在这里笔者可推荐读者有时间可以去深入学习MySQL底层的执行过程)。


3、安全性能

使用Statement会存在很大的SQL注入风险,在这里笔者还是根据tb_user表进行说明。

String sql = "select * from tb_user 
where username= '" + username + "' and password = '" + password + "'"; 
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);

在这里读者需要注意的是,如果传递的username的值为“or 1=1 ”,那么该判断条件永远为真,则这样有点技术的人就可以进入到相关网站的后台,那么后果就可想而知了。


发布于 2020-04-05 20:43:06
收藏
分享
海报
0 条评论
4084
上一篇:Java面试题答案整理(一) 下一篇:JavaScript 字符串实用常操纪要
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码