浅谈jdbc中parperstatement和statement的区别-mile米乐体育
在开始本篇文章之前,笔者先废话几句,相信在接触过jdbc内容的时候,很多读者都会接触到以下这两个对象实例:parperstatement和statement。如果你没有接触过,当然也可以继续往下学习本篇文章内容。笔者认为这两者的作用其实差不多,就是创建了一个对象然后去通过对象调用executequery方法来执行sql语句。但是,这两者还是存在着一定的差异,所以本篇文章就围绕“parperstatement和statement的区别”进行简单讲解。
1、执行sql语句的格式不同
问题描述:假设当前数据库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 ”,那么该判断条件永远为真,则这样有点技术的人就可以进入到相关网站的后台,那么后果就可想而知了。