JDBC入门(3)--- PrepareStatement

2024-06-20 01:18

本文主要是介绍JDBC入门(3)--- PrepareStatement,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、PrepareStatement概述

  PrepareStatement是Statement接口的子接口;

1、强大之处:

    • 防SQL攻击;
    • 提高代码的可读性;
    • 提高效率;

2、PrepareStatement的用法:

    • 如何得到PrepareStatement对象
      • 给出SQL模板。
      • 调用Connection的PreparedStatement  prepareStatement(String sql模板);
      • 调用pstmt的setXxx()系列方法sql模板中的?赋值
      • 调用pstmt的executeUpdate()或executeQuery(),但它的方法都没有参数。

3、预处理的原理:

    • 服务器的工作:
      • 校验sql语句的语法;
      • 编译:一个与函数相似的东西
      • 执行:调用函数
    • PreparedStatement:
      • 前提:连接的数据库必须支持预处理,几乎没有不支持的。
      • 每一个pstmt都与sql模板绑定在一起,先把sql模板给数据库,数据库先进行校验,再进行编译。执行时只是把参数传递过去而已。
      • 若二次执行时,就不用再次校验语法,也不用再次编译,直接执行。
    • 预处理默认情况是关闭的,可在设置url时添加参数进行开启,如:
String url = "jdbc:mysql://localhost:3306/mydb1?useServerPrepstmts=ture&cachePreStmts=true";

二、什么是SQL攻击

    在需要用户输入的地方,用户输入的是SQL语句的片段,最终用户输入的SQL片段与我们DAO中写的SQL语句合成一句完整的SQL语句,例如用户在登录时输入的用户名和密码都是为SQL语句的片段。

 1 package demo3;2 3 import org.junit.Test;4 import java.io.IOException;5 import java.sql.*;6 7 /**8  * PreapredStatement9  * 防SQL攻击
10  */
11 public class Demo3 { 12 /** 13 * 登录 14 * 使用username和password去查询数据 15 * 若查询出结果集,说明正确,返回true 16 * 若查询不出结果,说明用户名或密码错误,返回false 17 */ 18 public boolean login(String username,String password) throws Exception{ 19 /* 20 * 一、得到Connection 21 * 二、得到Statement 22 * 三、得到ResultSet 23 * 四、rs.next()返回的是什么,我们就放回什么 24 * */ 25 String driverClassName = "com.mysql.jdbc.Driver"; 26 String url = "jdbc:mysql://localhost:3306/mydb1"; 27 String mysqlUsername = "root"; 28 String mysqlPassword = ""; 29  Class.forName(driverClassName); 30 Connection con = DriverManager.getConnection(url,mysqlUsername,mysqlPassword); 31 Statement stmt = con.createStatement(); 32 String sql = "SELECT * FROM t_user WHERE username='" username "' AND password='" password "'"; 33  System.out.println(sql); 34 ResultSet rs = stmt.executeQuery(sql); 35 return rs.next(); 36  } 37  @Test 38 public void fun1() throws Exception { 39 //SELECT * FROM t_user WHERE username='a' or 'a'='a' AND password='a' or 'a'='a' 40 String username = "a' or 'a'='a"; 41 String password = "a' or 'a'='a"; 42 boolean bool = login(username,password); 43 System.out.println(bool);//输出为true 44  } 45 public boolean login2(String username,String password) throws Exception { 46 /* 47 * 一、得到Connection 48 * 二、得到Statement 49 * 三、得到ResultSet 50 * 四、rs.next()返回的是什么,我们就放回什么 51 * */ 52 String driverClassName = "com.mysql.jdbc.Driver"; 53 String url = "jdbc:mysql://localhost:3306/mydb1?useServerPrepstmts=ture&cachePreStmts=true"; 54 String mysqlUsername = "root"; 55 String mysqlPassword = ""; 56  Class.forName(driverClassName); 57 Connection con = DriverManager.getConnection(url, mysqlUsername, mysqlPassword); 58 59 /* 60 * 一、得到PreparedStatement 61 * 1、给出sql模板:所有的参数使用?来替代 62 * 2、调用Connection方法,得到PreparedStatement 63 * */ 64 //SELECT * FROM t_user WHERE username=? AND password=? 65 String sql = "SELECT * FROM t_user WHERE username=? AND password=?"; 66 PreparedStatement pstmt = con.prepareStatement(sql); 67 /* 68 * 二、为参数赋值 69 * */ 70 pstmt.setString(1,username);//给第1个问号赋值,值为username 71 pstmt.setString(2,password);//给第2个问号赋值,值为password 72 ResultSet rs = pstmt.executeQuery();//调用查询方法,向数据库发送查询语句 73 return rs.next(); 74  } 75  @Test 76 public void fun2() throws Exception { 77 String username = "a' or 'a'='a"; 78 String password = "a' or 'a'='a"; 79 boolean bool = login2(username,password); 80 System.out.println(bool);//输出为fasle 81  } 82 /* 83 * 测试JdbcUtils.getConnection 84 * */ 85  @Test 86 public void fun3() throws IOException,ClassNotFoundException,SQLException{ 87 Connection con = JdbcUtils.getConnection(); 88  System.out.println(con); 89 Connection con1 = JdbcUtils.getConnection(); 90  System.out.println(con); 91  } 92 }

 

这篇关于JDBC入门(3)--- PrepareStatement的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076693

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By