JDBC中Statement和Preparement的使用讲解

 更新时间:2019年01月04日 09:12:23   作者:sdr_zd  
今天小编就为大家分享一篇关于JDBC中Statement和Preparement的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

Statement对象是用来执行SQL语句的

PreparedStatement:预编译的Statement对象,是Statement的子接口。

一.性能和代码编写的简洁程度方面

它允许数据库预编译SQL语句(这些SQL语句通常有带有参数),以后每次只需改变SQL命令的参数,避免数据库每次都需要编译SQL语句,提高了性能。 e.g. 连接数据库部分

//已定义好driver、url、user、passwd等
//加载驱动
Class.forName(driver);
//获得连接
Connection conn = DriverManager.getConnection(url, user, passwd);

Statement:

//用Connection创建一个Statement
Statement stmt = conn.createStatement() {
  //100条SQL语句来插入100条记录
  for(int i = 0;i < 100;i++) {
    stmt.executeUpdate("insert into student values(" + "null, 'aaa" + i + "',90)");
  }
}

PreparedStatement:

//用Connection创建一个PreparedStatement
PreparedStatement pstmt = conn,getPreparedStatement("insert into student_table values(null, ?, 90)") {
  //设置参数,100次传入参数而不是100次传入SQL语句
  for(int i = 0;i < 100;i++) {
    pstmt.setString(1, "姓名" + i);
  //执行
  pstmt.executeUpdate();
  }
}

通过运行以上的代码可以发现,PreparedStatement插入100条记录所用的时间比Statement插入100条记录所花费时间少。而且可以在代码中可以看出,带有参数的SQL语句,创建Statement对象需要对参数进行拼接,但是PreparedStatement会简洁很多。

完整代码移步GitHub:Statement&PrepareStatement

运行结果:

二.安全方面

又因为PreparedStatement不需要拼接,还可以防止SQL注入从而提高安全性

注:SQL注入是一种Cracker入侵方式,从SQL语句的漏洞入侵

比如一个登录页面,我们在获取表单传来的参数,将其与数据库中的数据进行比对,比对有该账号密码时则登录成功:

Statement:

//传入参数username和passwd是提交的信息
String sql = "select * from users " + "where username = ' " + username + " ' and password= ' " + passwd + " ';
rs = stmt.executeQuery(sql);

如果在username框中输入了:'or true or',那么,拼接后的SQL语句就变成了:

select * from users where username = ' ' or true or ' ' and desc = ' ';

结果为true被SQL当成直接量那么直接会登录成功

PreparedStatement:

//传入参数username和passwd是提交的信息
PreparedStatement pstmt = conn.getPreparedStatement("select * from users where username = ? and password= ?");
pstmt.setString(1, username);
pstmt.setString(2, passwd);

从上述可以看出PreparedStatement相较于Statement有三个好处:

  • 1. 预编译,性能较好
  • 2. 不用拼接,易编写易读懂
  • 3. 防止SQL注入,提高安全性

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Java实现雪花算法的原理和实战教程

    Java实现雪花算法的原理和实战教程

    这篇文章主要介绍了Java实现雪花算法的原理和实战教程,本文通过语言表述和代码的实现讲解了该项算法,,需要的朋友可以参考下
    2021-06-06
  • JDK-StringJoiner构造及添加元素源码分析

    JDK-StringJoiner构造及添加元素源码分析

    这篇文章主要为大家介绍了JDK-StringJoiner构造及添加元素源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java利用SPI实现解耦的示例详解

    Java利用SPI实现解耦的示例详解

    SPI的全称是服务提供接口,可以用其来启动框架的扩展和替换组件。本文将利用SPI实现解耦,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-04-04
  • java 序列化对象 serializable 读写数据的实例

    java 序列化对象 serializable 读写数据的实例

    java 序列化对象 serializable 读写数据的实例,需要的朋友可以参考一下
    2013-03-03
  • 解决restlet client报错No response.Is the certificate valid? Click here to check.

    解决restlet client报错No response.Is the cer

    这篇文章主要介绍了解决restlet client报错No response.Is the certificate valid? Click here to check.问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java  基础知识之IO总结

    java 基础知识之IO总结

    这篇文章主要介绍了java 基础知识之IO总结的相关资料,Java中的I/O分为两种类型,一种是顺序读取,一种是随机读取,需要的朋友可以参考下
    2017-03-03
  • Mybatis优化检索的方法详解

    Mybatis优化检索的方法详解

    MyBatis是一款优秀的基于Java的持久层框架,它可以将 SQL 语句和数据库中的记录映射成为 Java 对象,并且支持灵活的 SQL 查询语句,在Mybatis中,可以使用动态SQL来灵活构造SQL语句,从而满足各种不同的检索需求,本文介绍Mybatis如何优化检索,需要的朋友可以参考下
    2024-05-05
  • Springboot整合Shiro的代码实例

    Springboot整合Shiro的代码实例

    这篇文章主要介绍了Springboot整合Shiro的代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • SpringBoot集成POI实现Excel导入导出的示例详解

    SpringBoot集成POI实现Excel导入导出的示例详解

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。本文主要介绍通过SpringBoot集成POI工具实现Excel的导入和导出功能,需要的可以参考一下
    2022-07-07
  • springboot默认的5种加载路径详解

    springboot默认的5种加载路径详解

    这篇文章主要给大家介绍了关于springboot默认的5种加载路径,文中通过示例代码介绍的非常详细,对大家学习或者使用springboot具有一定的参考学习价值,需要的朋友可以参考下
    2022-05-05

最新评论