MYSQL--JDBC优化

一.JDBC优化:

        优化前提:

        有时候我们并不清楚某些表当中一共有多少列,以及这些列的数据类型,这个时候我们就需要提前通过一些方法提前了解到这些数据,从而更好的进行输出

        具体语句:

package cn.jdbc;import java.sql.*;public class JDBCDEmo1 {public static void main(String[] args) throws SQLException {// JDBC代码编写步骤// 1.注册驱动DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());// 2.获取连接// 在3306/后面加上自己查询的数据库的名称Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc1","root","123456");// 3.执行SQLStatement statement = connection.createStatement();// 填写需要的SQL语句即可ResultSet resultSet = statement.executeQuery("select * from jdbcdemo1");//优化操作://先获取表一共有多少列,获取其列数ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();//在这里,conlumnCount代表的就是获得的表的列数// 4.处理结果集while(resultSet.next()){//已经获取到了一共有多少行数,之后就可以采用循环的方式对于每一列放在同一行当中进行输出// resultSet.get(?)() 但是在这里需要注意的一点是,我们并不清楚每一列的数值类型,所以我们可以直接使用getObject的方式for (int i = 1; i <=columnCount; i++) {//在这里获取的是一行当中第i列的数值System.out.print(resultSet.getObject(i)+" ");}//一行的所有列都进行输出了之后就需要我们进行换行操作,再进行下一行的每一列的操作System.out.println();}// 5.关闭连接  释放资源resultSet.close();statement.close();connection.close();}
}

                                                                        更加推荐这种方式

二:有关MYSQL的SQL语言注入

        1.介绍:    

        SQL注入: 指的是对于用户输入的内容,变成了SQL语句当中的一部分,从而改变了SQL语句真正意义

        2.具体操作演示:

package cn.jdbc;import java.sql.*;
import java.util.Scanner;public class JDBCDEmo2 {public static void main(String[] args) throws SQLException {Scanner in =new Scanner(System.in);// SQL注入: 指的是对于用户输入的内容,变成了SQL语句当中的一部分,从而改变了SQL语句真正意义System.out.println("请输入您的用户名");String username=in.next();System.out.println("请输入您的密码");String password=in.next();// 1.注册驱动DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());// 2.获取连接// 在3306/后面加上自己查询的数据库的名称Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc2","root","123456");// 3.执行SQLStatement statement = connection.createStatement();//提前设置SQL语句//如果密码正确可以直接机内String sql ="select * from user where username='"+username+"'and password='"+password+"'";ResultSet resultSet = statement.executeQuery(sql);//判断是否存在数据,如果输入正确则能够查询到并输出if (resultSet.next()){System.out.println("登陆成功!");}else {System.out.println("登录失败!");}connection.close();resultSet.close();statement.close();}

                                在这里,我们拿我MSQL当中的JDBC2的表user表格作为数据参考

                ​​​​​​​        ​​​​​​​        ​​​​​​​    

        输入正确的用户名,密码,可以正常的进入:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        但是,如果输入某些特殊的字符,就有可能导致原本错误的变成了正确的数据,从而进入到其中,也就是输入的东西对于SQL语句造成了某些改变

        可以看到账号密码明显不正确,但是依然显示登录成功

        通过对于SQL语句的打印,发现是输入的密码让原本的SQL语句的意义发生了改变,因为or之后的1=1永远成立,因此不管密码账号是否是正确的,都一直都能够登录成功

        3.SQL注入解决方式

        // 3.执行SQLStatement statement = connection.createStatement();//提前设置SQL语句//如果密码正确可以直接机内// 在这里,我们将需要用户输入的数据改为   ?  之后进行处理String sql ="select * from user where username=? and password=?";PreparedStatement preparedStatement = connection.prepareStatement(sql);// 之后调用相应的SETOBJECT方法,设置第一个?代表的什么变量,以及第二个代表什么变量,从而让SQL语句变得更加的完整preparedStatement.setObject(1,username);preparedStatement.setObject(2,password);// 在这里,我们不需要再进行输入相应的SQL语句,再预处理的时候已经接受到了SQL语句// 并且需要注意的是,使用的是预处理(prepareStatement)的方法ResultSet resultSet = preparedStatement.executeQuery();

        经过预处理之后,再输入相应的语句,再进行测试

        发现已经解决相关SQL注入问题        

                                                                感谢观看OVER!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2821874.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

11.盛最多水的容器

题目&#xff1a;给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 解题思路&#xff1a;可以…

2023 re:Invent AI 生成产品体验,从 Bedrock 到 Amazon Q

引 如果你也有如下问题&#xff0c;那么接下来的文字会一一为你解答 一套数据集&#xff0c;如何微调不同类型的开源大模型&#xff1f;—— Bedrock 如何只有产品说明书&#xff0c;如何构建一个智能问答机器人&#xff1f;—— Q 哪里还有免费的 GPU 算力——在线 Jupyter…

JQMobile Loader Widget 遮罩层改造

最近在用jqmobile 做一个混合APP项目时候用到 jqmobile1.4.3提供的Loader Widget控件,但是这个控件本身是一个loading弹出层,这个弹出层弹出之后,用户还是可以去点击按钮,重复发送请求,为了防止重复提交,我想了两种办法, 1,在loading弹出层弹出之后,让按钮不可用.但是form表单…

DC28V270V转AC36V115V航空逆变器

在当今的航空航天电源行业中&#xff0c;DC28V270V转AC36V115V航空逆变器发挥着至关重要的作用。作为一种关键的逆变器电源设备&#xff0c;DC28V270V转AC36V115V航空逆变器不仅在航空领域有着广泛的应用&#xff0c;还在许多其他领域发挥着重要作用。 一、DC28V270V转AC36V11…

源码的角度分析Vue2数据双向绑定原理

什么是双向绑定 我们先从单向绑定切入&#xff0c;其实单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新。那么双向绑定就可以从此联想到&#xff0c;即在单向绑定的基础上&#xff0c;用户更新…

GoFrame:如何简单地搭建一个简单地微服务

一切资料来源于GoFrame官网, 感兴趣的, 可以直接去官网查阅相关资料。 首先下载框架工具, 下载地址:https://github.com/gogf/gf/releases 然后进入你想要放置的项目文件夹, 执行命令行 gf init {project_name} #project_name为你的项目名 执行完后项目结构如图所示 然…

Java ElasticSearch-Linux面试题

Java ElasticSearch-Linux面试题 前言1、守护线程的作用&#xff1f;2、链路追踪Skywalking用过吗&#xff1f;3、你对G1收集器了解吗&#xff1f;4、你们项目用的什么垃圾收集器&#xff1f;5、内存溢出和内存泄露的区别&#xff1f;6、什么是Spring Cloud Bus&#xff1f;7、…

Java构造方法总结(很清晰)

构造方法扫盲&#xff1a;构造方法就是为了创建对象的 解释&#xff1a;真正创建对象的是 new 这个关键字&#xff0c;Java 虚拟机在创建对象时是有很多步骤的&#xff0c;构造方法只是其中的一步&#xff0c;它的作用是进行成员变量初始化。

AI大预言模型——ChatGPT在地学、GIS、气象、农业、生态、环境等应用

原文链接&#xff1a;AI大预言模型——ChatGPT在地学、GIS、气象、农业、生态、环境等应用 一开启大模型 1 开启大模型 1)大模型的发展历程与最新功能 2)大模型的强大功能与应用场景 3)国内外经典大模型&#xff08;ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Di…

强大而灵活的python装饰器

装饰器&#xff08;Decorators&#xff09; 一、概述 在Python中&#xff0c;装饰器是一种特殊类型的函数&#xff0c;它允许我们修改或增强其他函数的功能&#xff0c;而无需修改其源代码。装饰器在函数定义之后立即调用&#xff0c;并以函数对象作为参数。装饰器返回一个新…

微信小程序云开发教程——墨刀原型工具入门(安装以及基础使用教程)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

储能:储能大会“共建储能生态链,共创储能新发展”

数字储能网讯&#xff1a;由中国化学与物理电源行业协会主办&#xff0c;中国化学与物理电源行业协会储能应用分会和中国储能网联合承办的第十四届中国国际储能大会暨展览会将于2024年3月10-12日在杭州国际博览中心召开&#xff0c;大会主题为“共建储能生态链&#xff0c;共创…

模板初阶的补充和string一些函数的用法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 模板初阶的补充 一、C语言中的字符串 二、标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明&#xff08;注意下面我只讲解最常用的接口&…

深度学习-回顾经典AlexNet网络:山高我为峰

深度学习-回顾经典AlexNet网络之山高我为峰 深度学习中&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;它们把AI技术不断推向高潮。2012年AlexNet大放异彩&#xff0c;它把深度学习技术引领第一个高峰&#x…

[数据集][目标检测]鸡蛋破蛋数据集VOC+YOLO格式792张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;792 标注数量(xml文件个数)&#xff1a;792 标注数量(txt文件个数)&#xff1a;792 标注类别…

汽车虚拟仿真技术的实现、应用和未来

汽车虚拟仿真技术是一种利用计算机模拟汽车运行的技术&#xff0c;以实现对汽车行为的分析、评估和改进。汽车虚拟仿真技术是汽车工业中重要的开发设计和测试工具&#xff0c;可以大大缩短产品研发周期、降低研发成本和提高产品质量。本文将从汽车虚拟仿真技术的实现过程、应用…

深入解析Golang的encoding/ascii85库:从基础到实战

深入解析Golang的encoding/ascii85库&#xff1a;从基础到实战 引言基础知识什么是ASCII85编码&#xff1f;ASCII85编码的工作原理ASCII85编码的优点ASCII85编码的缺点 使用Golang的encoding/ascii85库引入encoding/ascii85包ASCII85编码ASCII85解码实战示例小结 进阶技巧和最佳…

msvcp140.dll安装教程_最新msvcp140.dll丢失的解决方法

msvcp140.dll 是一个动态链接库 (DLL) 文件&#xff0c;它是 Microsoft Visual C 运行时库的一部分&#xff0c;特别对应的是 Visual Studio 2015 版本编译的 C 应用程序所需的关键组件。DLL 文件的设计目的是为了实现代码和数据的共享&#xff0c;这样多个应用程序就可以在同一…

python中自定义报错

class MyError(Exception):def __init__(self,num):#录入的数Exception.__init__(self)self.numnumdef __str__(self):return 这是我定义的第%d个异常 %(self.num)使用 try:raise MyError(4) except MyError as e:print(e)raise 其作用是指定抛出的异常名称&#xff0c;以及异常…

瑞_Redis_Redis的Java客户端

文章目录 1 Redis的Java客户端1.1 Jedis快速入门1.1.1 入门案例1.1.1.1 项目构建1.1.1.2 引入依赖1.1.1.3 建立连接1.1.1.4 释放资源1.1.1.5 测试1.1.1.6 完整测试类代码 1.1.2 Jedis连接池1.1.2.1 连接池工具类1.1.2.2 改造原始代码 1.2 SpringDataRedis1.2.1 RedisTemplate1.…