一、简介

先说下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. Docker之磁盘清理

    Docker 很占用空间,每当我们运行容器.拉取镜像.部署应用.构建自己的镜像时,我们的磁盘空间会被大量占用. 如果你也被这个问题所困扰,咱们就一起看一下 Docker 是如何使用磁盘空间的,以及如何 ...

  2. Codeforces Round 732 (Div

    AquaMoon and Strange Sort 有 \(n\) 个人从左到右站成一排,从左数第 \(i\) 个人的衣服上印着 \(a_i\).每个人的朝向可以是朝左.朝右.一开始所有人的方向都是朝 ...

  3. 实现ELF文件解析,支持-h, -S, -s

    ELF文件 编译和链接 ELF代表Executable and Linkable Format,是类Unix平台最通用的二进制文件格式.下面三种文件的格式都是ELF. 目标文件.o 动态库文件.so ...

  4. Vue.js 监视属性

    1.基本用法 用途:对某个数据进行监听并执行对应的回调,可以是data中的数据,还可以是计算属性 语法:在watch对象下添加字段,字段名为要监听的数据,字段值一般是fucntion,也可以是对象 回 ...

  5. The 2nd GUAT Collegiate Programming Contest (Round 1)

    第二届 GUAT大学生程序设计大赛 第一场 题解(A-M) 前言 比赛的内容主要包括计算机科学的常用算法,基本的计算理论,(如:离散数学,具体数学,组合数学基础),数据结构基础,程序设计语言(规定是C ...

  6. 【Amadeus原创】docker安装apache

    1, docker下载apache [root@it-1c2d webnav]# docker search apache [root@it-1c2d webnav]# docker pull htt ...

  7. Spirng Data JPA 之Specification中and、or的使用

    项目中,有的地方存值以逗号分隔的方式来存储,但查询的时候是需要满足单个值或者多个值条件查询,因此用到Specification中and.or组合使用,此文用来记录,以防后用. 描述:parentCod ...

  8. 使用JSch进行sftp的连接运行状况检查

    public boolean checkConnection() throws JSchException { try { JSch jsch = new JSch(); Session sessio ...

  9. 【转载】Spring Cloud Gateway-全局过滤器(Global Filters)

    http://www.imooc.com/article/290821 TIPS 本文基于Spring Cloud Gateway SR2,理论适配Spring Cloud Gateway SR1以及 ...

  10. 树莓派Zero OLED屏幕转接板

    买了个树莓派Zero,emmm,拿到手后感觉很精巧,但是总是感觉少了什么.于是... 瞎吹一波:不得不说嘉立创公司确实给力,一条龙服务而且价格太便宜了. 焊接组装上机测试,OK! 其实这个过程中坑也踩 ...