一、简介

先说下CreateStatement 和 PrepareStatement 这俩到底是干啥的吧。

作用:其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句。

区别:其实就是Statement和PrepareStatement的区别,最明显的区别,就是执行的sql语句格式不同

二、案例说明

2.1 需求1

我们有一个数据库,里面有一个user表,有username,userpwd两列。我们要查出这两列的数据

2.2 java两种方式实现方式

createStatement方式

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

PrepareStatement方式

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

相信写到这,大家很多人就能看出来了

优点一:原来PrepareStatement跟Statement的主要区别就是把上面sql语句中的变量抽出来了

优点二:PrepareStatement可以提高代码的可读性。

什么?你没觉得这有什么可以提高可读性的?那好,咱来看看下面这两段代码,看完你再说话。

2.3 需求2

我们有一个数据库,里面有一个book表,有bookid,bookname,bookauthor,booksort,bookprice五列。我们要向这个表中添加一部分数据。

createStatement方式

String sql = "insert into book (bookid,bookname,bookauthor,booksort,bookprice) values ('"+var1+"',
'"+var2+"',"+var3+",'"+var4+","+var5+"')";
stmt = conn.createStatement();
rs = stmt.executeUpdate(sql);

PrepareStatement方式

String sql = "insert into book (bookid,bookname,bookauthor,booksort,bookprice) values (?,?,?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,var1);
pstmt.setString(2,var2);
pstmt.setString(3,var3);
pstmt.setString(4,var4);
pstmt.setString(5,var5);
pstmt.executeUpdate();

对比后怎么样,可以提高代码可读性了吗?反正打这行代码的时候,整个引号逗号就给我刺激懵了。

2.4 优点三:ParperStatement提高了代码的灵活性和执行效率。

PrepareStatement接口是Statement接口的子接口,他继承了Statement接口的所有功能。它主要是拿来解决我们使用Statement对象多次执行同一个SQL语句的效率问题的。ParperStatement接口的机制是在数据库支持预编译的情况下预先将SQL语句编译,当多次执行这条SQL语句时,可以直接执行编译好的SQL语句,这样就大大提高了程序的灵活性和执行效率。

2.5 优点四:ParperStatement比Statement好的优点,那就是安全

你说啥?这还关安全啥事儿,那我给你一行代码,你来给我说说这是干嘛的。

String sql = "select * from user where username= '"+varname+"' and userpwd='"+varpasswd+"'";
stmt = conn.createStatement();
rs = stmt.executeUpdate(sql);

这是验证用户名密码的,对吧。但要是我们把'or '1' = 1'当作密码传进去,你猜猜会发生啥。

select * from user where username = 'user' and userpwd = '' or '1' = '1';

发现了吧!这是个永真式,因为1永远等于1。所以不管怎样都能获取到权限。哇。这就坏咯!这还不是最坏的,你再看!

String sql = "select * from user where username= '"+varname+"' and userpwd='"+varpasswd+"'";
stmt = conn.createStatement();
rs = stmt.executeUpdate(sql);

依旧是这行代码。这次我们把'or '1' = 1';drop table book;当成密码传进去。哇!又坏了!这次直接把表给删了。但是,你如果用PrepareStatement的话就不会出现这种问题。你传入的这些数据根本不会跟原来的数据有任何的交集,也不会发生这些问题。

参考博客:https://blog.csdn.net/u011161786/article/details/48394751

Java连接数据库 CreateStatement 和 PrepareStatement 的区别与优劣的更多相关文章

  1. 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣

    先说下这俩到底是干啥的吧.其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句.说是CreateStatement和PrepareStatement ...

  2. JDBC——CreateStatement和PrepareStatement作用区别

    本文主要讲了PrepareStatement和CreateStatement的作用区别,大家可以一起学习!走后端的小伙伴都会必修JDBC,在前段时间作者实训期间,看到老师举例的时候用了CreateSt ...

  3. Java连接数据库从入门到入土

    Java连接数据库 一.最原始的连接数据库 是没有导入任何数据源的:只导入了一个数据库驱动:mysql-connector-java-8.0.27.jar 首先是编写db.proterties文件 d ...

  4. servlet中Java连接数据库后的基本操作

    servlet中Java连接数据库后的基本操作 在eclipse中新建一个工程:login 在Server中新建一个服务器,基本的操作不用说了,在前两天的笔记中可以找到; 需要知道数据库的用户名和密码 ...

  5. java连接数据库

    package com.shsxt.jdbcs; import java.sql.Connection; import java.sql.DriverManager; import java.sql. ...

  6. Java连接数据库 #04# Apache Commons DbUtils

    索引 通过一个简单的调用看整体结构 Examples 修改JAVA连接数据库#03#中的代码 DbUtils并非是什么ORM框架,只是对原始的JDBC进行了一些封装,以便我们少写一些重复代码.就“用” ...

  7. JAVA连接数据库 #03# HikariCP

    索引 为什么用数据库连接池? HikariCP快速入门 依赖 简单的草稿程序 设置连接池参数(只列举常用的) MySQL配置 修改Java连接数据库#02#中的代码 测试 为什么用数据库连接池? 为什 ...

  8. Java连接数据库 #02# JDBC经典套路

    内容索引 LocalConnectionFactory.java LocalConnectionProxy.java ProfileDAO.java-2.0 ProfileDAOImpl.java-2 ...

  9. Java连接数据库 #01# JDBC单线程适用

    官方教程(包括 javase的基础部分):JDBC Basics 重新梳理.学习一下“Java连接数据库”相关的内容. 因为最开始没有认真学多线程和JDBC,一直在自己写的多线程程序中维持下面的错误写 ...

  10. JDBC-使用Java连接数据库-基础篇

    这是小主第一次写Java连接数据库博客,初学Java之时,Java连接数据库是我最头疼的,不过经过一个月的学习,也差不多略有收获,所以给大家分享一下. Java连接数据库大约需要五大步骤: 创建数据库 ...

随机推荐

  1. python之数据库管理工具sandman2

    文档:Welcome to sandman2's documentation! - sandman2 0.0.1 documentation [安装] pip install sandman2 安装成 ...

  2. wait、notify、notifyAll

    介绍 wait 方法前提需要拥有锁.使用wait方法后,释放锁进行等待队列. notify 方法从等待队列移除一个元素. notifyAll 将等待队列中元素全部进行移出. 注意:notify.not ...

  3. kettle 使用 CARTE 执行

    在执行KETTLE 任务的时候,可以使用本地执行,或者使用carte server执行. 1.启动carte server .\Carte.bat localhost 8080 2.配置子服务器 这里 ...

  4. 渗透测试-Kioptix Level 1靶机getshell及提权教程

    声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无 ...

  5. 树莓派4B 微雪7寸触摸屏 双屏 触摸屏校正

    树莓派4B+微雪7寸触摸屏+PC显示器,以触摸屏位主显示,PC显示器扩展,这时会有触摸不准的情况. 通过观察可以发现触摸被放大到了整个屏幕,即触摸屏+PC显示器. 1. 通过查看2个屏幕分辨率和位置, ...

  6. Python开发一个Instant Messaging(IM)(即时通讯)聊天工具:从理论到实践

    一.引言 在现代社会中,即时通讯工具已经成为人们日常沟通的重要工具.开发一个IM聊天工具不仅能够提高我们的编程技能,还能让我们更好地理解即时通讯系统的原理.本文将详细介绍如何开发一个简单的IM聊天工具 ...

  7. 深入理解 HTTP 协议:从基础到实践全解析

    在当今数字化时代,HTTP 协议如同互联网世界的"语言",支撑着无数网页浏览.数据传输和在线交互.无论你是初涉编程的新手,还是经验丰富的开发者,深入掌握 HTTP 协议都至关重要. ...

  8. docker部署最新6.2版Zabbix Server端

    一.安装docker,参见本博客docker安装文档. 二.启动空的mysql -e MYSQL_DATABASE="zabbix" \ -e MYSQL_USER="z ...

  9. 准备 OpenXML 开发环境

    Development with Open XML 1. 准备开发环境 1.1 Open XML SDK 现在最新的 OpenXML SDK 版本是 2.12.1 (2021/1),需要通过 NuGe ...

  10. Vue3封装一个ElementPlus自定义上传组件2--无弹窗

    Vue3封装一个ElementPlus自定义上传组件2--无弹窗 写在前面: 无弹窗的上传组件它来了,依旧是小巧又好用,只不过这回我用的是前端直传的方式,采用http-request进行文件上传,中间 ...