3.0 PreparedStatement

磁感应强度B、磁场强度H、矢量磁位A的study 学完电磁场很久了但是对电磁场中磁感应强度B⃗\vec{B}B、磁场强度HHH、矢量磁位A⃗\vec{A}A,这几个变量所表征的含义一直很模糊,所以就总结了一下 阅读详情

当使用statement , 假设有登录案例SQL语句如下:
SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;

此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。

但是当用户输入的账号为XXX 密码为:XXX’ OR ‘a’=’a时,则真正执行的代码变为:

SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;

此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。
为此,我们使用PreparedStatement来解决对应的问题。

在这里插入图片描述
**

3.1 预处理对象(PreparedStatement)

**
1.使用PreparedStatement预处理对象时,建议每条sql语句所有的实际参数,都使用逗号分隔。
该接口的实现类也在数据库驱动程序中。
String sql = “insert into sort(sid,sname) values(?,?)”;//问号表示占位符
//PreparedStatement预处理对象代码:
PreparedStatement psmt = con.prepareStatement(sql)
// 通过Connection对象的 prepareStatement方法,SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。

常用方法:

1.执行SQL语句:
在这里插入图片描述

2.设置实际参数
void setXxx(int index, Xxx xx) 将指定参数设置为给定Java的xx值。在将此值发送到数据库时,驱动程序将它转换成一个 SQL Xxx类型值。

例如:
setString(2, “家用电器”) 把SQL语句中第2个位置的占位符? 替换成实际参数 “家用电器”

完整代码:
String sql = “insert into sort(sid,sname) values(?,?)”;
PreparedStatement psmt = con.prepareStatement(sql);
Psmt.setObject(1, “007”);
Psmt.setObject(2, “家用电器”);

在这里插入图片描述

3.ResultSet
在这里插入图片描述

4.ResultSetMetaData
在这里插入图片描述
**

3.2 executeUpdate方法

**
通过预处理对象的executeUpdate方法,完成记录的insert\update\delete语句的执行。
操作格式统一如下:
1. 注册驱动
2. 获取连接
3. 获取预处理对象
4. SQL语句占位符设置实际参数
5. 执行SQL语句
6. 释放资源

1.创建样本表

我们将使用JDBC对分类表进行增删改查操作。
#创建数据库
create database JDBC;
#使用数据库
use JDBC;
###创建分类表
create table sort(
sid int PRIMARY KEY ,
sname varchar(100)
);
#初始化数据
insert into sort(sname) values(‘家电’);
insert into sort(sname) values(‘服饰’);
insert into sort(sname) values(‘化妆品’);

2.插入记录:insert

实现向分类表中插入指定的新分类

public void demo01() throws Exception {
		// 1注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2获取连接
	Connection conn=   DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root","161028");
		// 3获得预处理对象
		String sql = "insert into sort(sname) values(?)";
		PreparedStatement stat = conn.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "奢侈品");
		// 5执行SQL语句
		int line = stat.executeUpdate();
		System.out.println("新添加记录数:" + line);
		// 6释放资源
		stat.close();
		conn.close();
	}

3.更新记录:update

实现更新分类表中指定分类ID所对应记录的分类名称

public void demo02() throws Exception {
		// 1注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
		// 3获得预处理对象中
		String sql = "update sort set sname=? where sid=?";
		PreparedStatement stat = conn.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "数码产品");
		stat.setInt(2, 1);
		// 5执行SQL语句
		int line = stat.executeUpdate();
		System.out.println("更新记录数:" + line);
		// 6释放资源
		stat.close();
		conn.close();
	}

4.删除记录:delete

实现删除分类表中指定分类ID的记录

	public void demo03() throws Exception {
		// 1注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
		// 3获得预处理对象
		String sql = "delete from sort where sid=?";
		PreparedStatement stat = conn.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setInt(1, 1);
		// 5执行SQL语句
		int line = stat.executeUpdate();
		System.out.println("删除记录数:" + line);
		// 6释放资源
		stat.close();
		conn.close();
	}

**

3.3 executeQuery方法

**
通过预处理对象的executeQuery方法,完成记录的select语句的执行。操作格式统一如下:
1. 注册驱动
2. 获取连接
3. 获取预处理对象
4. SQL语句占位符设置实际参数
5. 执行SQL语句
6. 处理结果集(遍历结果集合)
7. 释放资源

查询记录:select

实现查询分类表所有记录

public void demo04() throws Exception {
		// 1注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
		// 3获得预处理对象
		String sql = "select * from sort";
		PreparedStatement stat = conn.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数(无)
		// 5执行SQL语句
		ResultSet rs = stat.executeQuery();
		// 6处理结果集(遍历结果集合)
		while( rs.next() ){
			//获取当前行的分类ID。
			//ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集
			String sid = rs.getString("sid");//方法参数为数据库表中的列名
			//获取当前行的分类名称
			String sname = rs.getString("sname");
			//显示数据
			System.out.println(sid+"-----"+sname);
		}
		// 7释放资源
		rs.close();
		stat.close();
		conn.close();
	}

实现查询分类表中指定分类名称的记录

public void demo05() throws Exception {
		// 1注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
		// 3获得预处理对象
		String sql = "select * from sort where sname=?";
		PreparedStatement stat = conn.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "奢侈品");
// 5执行SQL语句
		ResultSet rs = stat.executeQuery();
		// 6处理结果集(遍历结果集合)
		while( rs.next() ){
			//获取当前行的分类ID
			String sid = rs.getString("sid");//方法参数为数据库表中的列名
			//获取当前行的分类名称
			String sname = rs.getString("sname");
			//显示数据
			System.out.println(sid+"-----"+sname);
		}
		// 7释放资源
		rs.close();
		stat.close();
		conn.close();
	}
JVM高频面试基本问题与知识点整理 阅读详情

相关推荐

Flutter 中使用蓝牙插件报错,说没有权限怎么解决

2、在build.grale里面更改一下版本号,我修改的是targetSdkVersion这个版本号,需要根据你自己的版本进行更改,记得更改之后先flutter clean一下再run。搞了一晚上,没搞出来,第二天用同事手机测试发现他手机可以,我手机还是不行,才发现是Android版本问题,需要修改两处地方。废话不多说,咱先看报错信息。

zzj17637822814的博客 2289

SQL 注入问题的解决(PreparedStatement)

上篇博客结尾提到了代码的不足:存在SQL注入问题。下面演示一下什么是SQL,注入问题。(就拿上篇的代码举个例子)以上为正常现象,但有些“不法分子”抓住了代码的漏洞,干了一些不为人知的事情。What!竟然登录成功了!发生了甚么?让我们Debug一下,一探究竟。‘1’='1’为true,从而导致了整个柿子返回结果为true。

拒绝八股,追寻本质。 8760

GitHub 新手使用手册

理论说太多容易忘,来实践实践吧。

2501_90226046的博客 1054

JDBC基础教程之PreparedStatement

概述该 PreparedStatement 接口继承 Statement,并与之在两方面有所不同:PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个

盗也有道>>>> 3144

【AutoDL + Langchain-Chatchat】从零构建高效本地 RAG 知识库问答系统:实战保姆级教程(含避坑指南)

本文详细阐述如何在AutoDL云平台,如何利用Langchain-Chatchat构建高效的本地RAG知识库问答系统,并深入解析RAG架构。从环境搭建到实战部署,从问题排查到性能优化,提供一份全面实用的指南,助力开发者快速构建智能问答应用。

拾光夕拾的博客 1803

VC Spyglass CDC实战:如何快速定位和解决重汇聚问题(附详细调试步骤)

本文深入探讨了在SoC设计中利用VC Spyglass进行CDC验证时,如何高效定位和解决棘手的重汇聚问题。通过实战演练,详细解析了重汇聚的本质、VC Spyglass的检测逻辑,并提供了从报告筛选、GUI原理图分析到制定设计修复或约束豁免方案的全套调试步骤,帮助工程师快速攻克这一常见验证难题。

weixin_29219539的博客 755

JDBC学习笔记(4)——PreparedStatement的使用

PreparedStatement public interface PreparedStatement extends Statement;可以看到PreparedStatement是Statement的子接口,我们在执行查询或者更新数据表数据的时候,拼写SQL语句是一个很费力并且容易出错的事情,PreparedStatement可以简化这样的一个过程. PreParedStatement1...

weixin_34232363的博客 942

作为一名爬虫人如何实现千万级数据爬取?

爬虫门槛不高,高就高在往后余生的每一次实操都随时会让你崩溃!Bro

吴秋霖的博客 1万+

预处理 PreparedStatement和JDBC API

本次博客带领大家学习JDBC中的预处理 PreparedStatement 的查询和DML的使用和JDBC API。

lidong777777的博客 390

【全局路径规划地图算法】Voronoi路径规划探索(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Voronoi路径规划探索做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 2242

半导体晶圆调平系统:基于最小二乘法的实现方案

基于最小二乘法的晶圆调平技术通过数学建模与工程实现的结合,解决了半导体量测中高精度平面对准的核心问题。实际应用中,需根据设备特性优化采样策略、校准传感器误差,并通过实时性优化满足高产能场景需求。该方案的模块化设计(如分离数据采集、拟合计算、补偿输出)也为后续功能扩展(如引入机器学习优化拟合模型)提供了灵活性。

品质生活,极致编程。 1182

用PreparedStatement解决SQL注入问题

使用PreparedStatement预编译SQL语句并执行,预防SQL注入问题。

平安喜乐 1251

matlab 异常值检测与处理——Robust Z-score法【2024最新版】

博客长期更新,本文最近一次更新时间为:2024年12月9日。

点云侠的博客 1516

Java JDBC技术:(二)JDBC3.0 标准中常用接口与类

JDBC3.0 标准中常用接口与类1.Driver 接口2.DriverManager 类1.常用方法2.JDBC URL3.Connection 接口1.常用方法4.Statement 接口1.常用方法5.PreparedStatement 接口1.常用方法6.ResultSet 接口1.常用方法2.ResultSet 对结果集进行滚动的方法7.CallableStatement 接口 1.Driver 接口 Driver 接口的作用是来定义数据库驱动对象应该具备的一些能力。比如与数据库建立连接的方法的定

地球村 711

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

preparedStatement Batch功能

使用PreparedStatement的Batch功能 Update大量的数据时, 先Prepare一个INSERT语句再多次的执行, 会导致很多次的网络连接. 要减少JDBC的调用次数改善性能, 你可以使用PreparedStatement的AddBatch()方法一次性发送多个查询给数据库. 例如, 让我们来比较一下下面的例子. 例 1: 多次执行Prepared Statement

DOVEty的专栏 1505

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

mysql-connector-java-5.0.3-bin.jar中的Preparedstatement居然没有isClosed()方法

白天为项目写新增,本以为一个很简单的操作,没想到又遇到了麻烦,每次新增的时候,总是提示报错: java.lang.AbstractMethodError: com.mysql.jdbc.ServerPreparedStatement.isClosed()Z

生活充满节奏感 1330

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Cassandra CQL v3.3中文文档(上)

Cassandra Query Language (CQL)v3.3.01.Cql语法1.1. 前言本文档描述了CQL v3。CQL v3与CQL v2不兼容且在很多地方不同。CQL v3提供了非常类似于SQL的数据模型,数据放在了包含rows和columns的tables中。因此,当使用此文档时,这些内容(tables,rows,columns)与SQ...

weixin_34146986的博客 259

IOS数据库操作SQLite3使用详解(转)

iPhone中支持通过sqlite3来访问iPhone本地的数据库。具体使用方法如下1:添加开发包libsqlite3.0.dylib首先是设置项目文件,在项目中添加iPhone版的sqlite3的数据库的开发包,在项目下的Frameworks点击右键,然后选择libsqlite3.0.dylib文件。libsqlite3.0.dylib文件地址: /Developer/Platform...

247

spring jdbc获取插入记录的主键id

在JDBC3.0规范中,当新增记录时,允许将数据库自动产生的主键值绑定到Statement或PreparedStatement中。使用Statement时,可以通过以下方法绑定主键值:   int executeUpdate(String sql,int autoGeneratedKeys)   也可以通过Connection创建绑定自增值的PreparedStatement:   Prep...

weixin_30698527的博客 240

JDBC中常用接口与类

文章目录JDBC3.0标准中的常用接口与类1. Driver 接口2. Driver Manager类2.1 常用方法2.2 JDBC URL3. Connection 接口3.1 常用方法4. Statement接口4.1 常用方法5. PreparedStatement接口5.1 常用方法6. ResultSet接口6.1 常用方法6.2ResultSet 对结果集进行滚动的方法7. Call...

jssd的博客 1495

jdbc性能优化

为应用选择最好最快的 JDBC 驱动 ,参考本站文章 。 JDBC3.0提供了新的特性来提高性能,诸如连接池, statemente池的改进对数据库使用连接池并且重用连接,而不要重复打开和关闭连接。最佳的连接池大小是当连接池大到足够使服务请求不等待 ·  尽量使用支持 JDBC3.0 的驱动,因为 JDBC3.0 支持包括 DataSource 对象,连接池,分布式事务支持, RowSets ...

boddi 100

mysql 高版本jdbc驱动程序 使用PreparedStatement.setBinaryStream方法报错及解决办法

mysql 高版本jdbc驱动程序 使用PreparedStatement.setBinaryStream方法报错及解决办法

BbossGroups 打造中国制造品牌 5146

mysql高版本驱动的写法_mysql 高版本jdbc驱动程序 使用PreparedStatement.setBinaryStream方法报错及解决办法...

mysql 使用以下版本驱动程序 在PreparedStatement中执行setBinaryStream方法时报错误:mysql-connector-java-5.0.8-bin.jarmysql-connector-java-5.1.13-bin.jar错误信息如下:Java代码com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:Youh...

weixin_29084111的博客 451

ClickHouse系列--java ClickHouse map

如何在java中通过jdbc的方式向clickhouse中写入map类型? 依赖版本: <dependency> <groupId>ru.yandex.clickhouse</groupId> <artifactId>clickhouse-jdbc</artifactId> <version>0.3.0</version>

IT云清 1796

高并发数据库自增主键分析

在一般情况下,在新增领域对象后,都需要获取对应的主键值。使用应用层来维护主键,在一定程度上有利于程序性能的优化和应用移植性的提高。在采用数据库自增主键的方案里,如果JDBC驱动不能绑定新增记录对应的主键,就需要手工执行查询语句以获取对应的主键值,对于高并发的系统,这很容易返回错误的主键。通过带缓存的DataFieldMaxValueIncrementer,可以一次获取批量的主键值,供多...

weixin_30258027的博客 162
上一篇: 2.0 JDBC开发步骤(Eclipse)
下一篇: 4.0 如何解决SQL注入问题
问道2020
博客等级 码龄8年 4粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值