JdbcUtils的三个版本以及sql注入问题

JDBC的工具类 1.0版本
JDBC的工具类 2.0版本(智能一些),编写properties属性文件,程序就可以读取属性文件
JDBC的工具类 3.0版本,加入连接池对象

我们封装jdbc工具类是为了减少代码重复,方便开发,JdbcUtils至少要有三个方法

1.新建驱动

2.新建连接

3.关闭资源

1.0 这里的static是为了直接调用类方法,不用new对象

public class JdbcUtils1 {/*** 加载驱动的方法  static*/public static void loadDrive(){try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 连接对象conn*/public static Connection getConntion(){loadDrive();Connection connection = null;try {connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");} catch (SQLException e) {e.printStackTrace();}return connection;}/*** 获取执行sql的对象  Statement*/public static Statement creatstmt() throws SQLException {Connection conntion = getConntion();Statement statement = conntion.createStatement();return statement;}/*** 关闭资源的提取*/public static  void close(ResultSet rs, Statement stmt, Connection conn){try {rs.close();stmt.close();conn.close();}catch (Exception e){e.printStackTrace();}}}

2.0 可以动态修改配置,不是写死的了

 1. 驱动类
 2. 数据库地址
 3. 用户名
 4. 密码

package com.qcby.utils;import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** JDBC的工具类 1.0版本* JDBC的工具类 2.0版本(智能一些),编写properties属性文件,程序就可以读取属性文件*      1. 驱动类*      2. 数据库地址*      3. 用户名*      4. 密码*/
public class JdbcUtils2 {private static final String driverclass;private static final String url;private static final String username;private static final String password;static{// 加载属性文件Properties pro = new Properties();InputStream inputStream = JdbcUtils2.class.getResourceAsStream("/db.properties");try {// 加载属性文件pro.load(inputStream);} catch (IOException e) {e.printStackTrace();}// 给常量赋值driverclass = pro.getProperty("driverclass");url = pro.getProperty("url");username = pro.getProperty("username");password = pro.getProperty("password");}/*** 加载驱动*/public static void loadDriver(){try {// 加载驱动类Class.forName(driverclass);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 加载完驱动,获取到连接,返回连接对象* @return*/public static Connection getConnection(){// 加载驱动loadDriver();// 获取到连接对象,返回Connection conn = null;try {// 获取到连接conn = DriverManager.getConnection(url,username,password);} catch (SQLException e) {e.printStackTrace();}return conn;}/*** 关闭资源* @param conn* @param stmt* @param rs*/public static void close(Connection conn, Statement stmt, ResultSet rs){if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭资源* @param conn* @param stmt*/public static void close(Connection conn, Statement stmt){if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}

3.0 加入连接池对象

package com.qcby.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** JDBC的工具类 1.0版本* JDBC的工具类 2.0版本(智能一些),编写properties属性文件,程序就可以读取属性文件* JDBC的工具类 3.0版本,加入连接池对象*/
public class JdbcUtils3 {// 连接池对象private static DataSource DATA_SOURCE;static{// 加载属性文件Properties pro = new Properties();InputStream inputStream = JdbcUtils3.class.getResourceAsStream("/druid.properties");try {// 加载属性文件pro.load(inputStream);// 创建连接池对象DATA_SOURCE = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}/*** 从连接池中获取连接,返回。* @return*/public static Connection getConnection(){Connection conn = null;try {conn = DATA_SOURCE.getConnection();} catch (SQLException e) {e.printStackTrace();}return conn;}/*** 关闭资源* @param conn* @param stmt* @param rs*/public static void close(Connection conn, Statement stmt, ResultSet rs){if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭资源* @param conn* @param stmt*/public static void close(Connection conn, Statement stmt){if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}

连接池xml配置

 <!--配置连接池--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/spring_db?characterEncoding=utf8mb4" /><property name="username" value="root" /><property name="password" value="root" /></bean>

druid.properties配置

driverclass = com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/spring_db?useUnicode=true&characterEncoding=utf8
username=root
password=root

sql注入问题

/*** 演示SQL注入的问题,漏洞* 在已知用户名的情况下,通过sql语言关键字,登录系统。密码随意输入的。* SQL注入产生原因是SQL语句的拼接,利用SQL关键字产生效果。* 需要解决SQL注入的问题** 解决SQL注入问题,采用SQL语句预编译的方式,把SQL语句中的参数使用 ? 占位符来表示,先把SQL语句编译,格式固定的。* 再给 ? 传入值,传入任何内容都表示值。数据库会判断SQL执行的结果。*** 解决sql注入问题:* 1.使用预编译sql的PreparedStatement对象* 2.在通过PreparedStatement对象的set方法为每一个占位符赋值(避免了字符串拼接带来的关键字问题)* 3.执行sql方法 stmt.executeQuery(); 拿到结果集*/
public class JdbcTest4 {public static void main(String[] args) {// 模拟登录的功能,有SQL注入的问题String result = new JdbcTest4().login2("aaa'or'1=1", "12309809");System.out.println(result);//        String result = new JdbcTest4().login2("aaa", "123");
//        System.out.println(result);}/*** 采用预编译的方式,解决SQL注入的问题* @param username* @param password* @return*/public String login2(String username,String password){Connection conn = null;// 预编译执行SQL语句对象PreparedStatement stmt = null;ResultSet rs = null;try {// 获取到连接conn = JdbcUtils3.getConnection();// 使用?占位符String sql = "select * from t_user where username = ? and password = ?";// 预编译SQL语句,把SQL语句固定stmt = conn.prepareStatement(sql);// 需要给 ? 设置值stmt.setString(1,username);stmt.setString(2,password);// 执行SQL语句rs = stmt.executeQuery();// 遍历数据if(rs.next()){// 表示存在数据,如果存在,说明用户名和密码编写正确return "登录成功...";}else{return "登录失败了...";}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils3.close(conn,stmt,rs);}return null;}/*** 模拟登录的功能,通过用户名和密码从数据库中查询* @param username* @param password* @return*/public String login(String username,String password){Connection conn = null;Statement stmt = null;ResultSet rs = null;try {// 获取到连接conn = JdbcUtils3.getConnection();// 编写SQL语句的拼接  '1=1' true  password = '1234sdfsce' false  true and false  整体上false// String sql = "select * from t_user where username = 'aaa' or '1=1' and password = '1234sdfsce'";// String sql = "select * from t_user where username = 'aaa' or false";String sql = "select * from t_user where username = '"+username+"' and password = '"+password+"'";// 执行sqlstmt = conn.createStatement();// 执行rs = stmt.executeQuery(sql);// 遍历数据if(rs.next()){// 表示存在数据,如果存在,说明用户名和密码编写正确return "登录成功...";}else{return "登录失败了...";}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils3.close(conn,stmt,rs);}return null;}}

数据库

sql注入导致账号密码错误也显示登录成功

使用占位符就能避免这个问题

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AS32系列MCU芯片I2C模块性能解析与调试

国科安芯推出的AS32X601内置的I2C模块提供了符合工业标准的两线串行制接口&#xff0c;可用于MCU和外部IIC设备的通讯。IIC总线使用两条串行线&#xff1a;串行数据线SDA和串行时钟线SCL。 IIC接口模块实现了IIC协议的标准模式和快速模式&#xff0c;支持多主机IIC总线架构。其…

钉钉小程序开发实战:打造一个简约风格的登录页面

在上一篇文章中&#xff0c;我们已经介绍了如何搭建钉钉小程序的基础环境&#xff0c;并完成了项目的初始化配置。本文将继续深入&#xff0c;手把手带你实现一个简约风格的登录页面&#xff0c;这是大多数企业级应用不可或缺的一部分。 钉钉小程序基于前端 Web 技术栈&#x…

论文研读2-1:多GNSS双历元纯相位定位-模型建立与误差分析

后续文章: 论文研读2-2&#xff1a;多GNSS双历元纯相位定位-固定模糊度精度增益 论文研读2-3&#xff1a;多GNSS双历元纯相位定位-定位精度分析 仅相位定位中的模糊度解算问题 在卫星导航定位中&#xff0c;载波相位测量是实现高精度定位的基础&#xff0c;但如果仅使用相位测…

Python----OpenCV(图像増强——图像平滑、均值滤波、高斯滤波、中值滤波、双边滤波)

Python----计算机视觉处理&#xff08;Opencv&#xff1a;图像噪点消除&#xff1a;滤波算法&#xff0c;噪点消除&#xff09; 一、图像平滑 图像平滑处理&#xff08;Smoothing Images&#xff09;&#xff0c;也称为图像模糊处理、图像滤波&#xff08;Images Filtering&am…

笔记:使用EasyExcel导入csv文件出现编码问题,导致导入数据全为null的解决方法

笔记&#xff1a;使用EasyExcel导入csv文件出现编码问题&#xff0c;导致导入数据全为null的解决方法 通常情况下&#xff0c;我们使用excel导入&#xff0c;但是部分情况下或者领导要求&#xff0c;我们需要使用csv导入文件&#xff0c;但是csv文件模板下载之后会变成系统当前…

NL2SQL(Natural Language to SQL)优化之道:提升准确率与复杂查询能力

自然语言 → SQL 的转译&#xff08;NL2SQL&#xff09;技术&#xff0c;是让非技术用户与数据库“对话”的桥梁。而在实际应用中&#xff0c;我们不仅需要“能转”&#xff0c;更要“转得准、转得全、转得快”。 一、什么是 NL2SQL&#xff1f; NL2SQL&#xff08;Natural La…

java中map的循环方式

什么是Map集合&#xff1f; Map是Java中的一个接口&#xff0c;它用于存储键-值对&#xff0c;并且键和值都可以是任意对象。它是Java集合框架中的一部分&#xff0c;并提供了一些方法来操作和访问Map中的元素。 Map中的每个键都是唯一的&#xff0c;这意味着不能使用相同的键…

python学习笔记(深度学习)

文章目录 1、概述2、学习内容2.1、pytorch 常见语法2.1.1、sum2.1.2、广播机制2.1.3、张量2.1.4、DataLoader 2.2、普通语法2.2.1、迭代器 1、概述 本篇博客用来记录&#xff0c;在深度学习过程中&#xff0c;常用的 python 语法内容 2、学习内容 2.1、pytorch 常见语法 2.…

力扣网C语言编程题:搜索二维矩阵(右上角->左下角解法)

一. 简介 上一篇文章关于"在二维数组中查找某个元素"的问题&#xff0c;提供了两种解题思路&#xff0c;文章如下&#xff1a; 力扣网C语言编程题&#xff1a;搜索二维矩阵的普通解法与二分查找法-CSDN博客 本文提供第三种解题思路&#xff1a;从左下角->右上角…

AI大模型流式输出,OkHttp Log拦截打印方案

背景&#xff1a; 使用okhttp框架进行网络访问时&#xff0c;一般会使用 HttpLoggingInterceptor 打印请求和响应的log。在使用okhttp访问AI大模型时&#xff0c;如果选择流式输出&#xff0c;那么响应的body数据使用的SSE技术&#xff0c;服务异步发送大模型生成的增量token&…

看数据世界的历史:全面梳理从关系库、大数据到AI时代的数据发展及展望

序章 在数据库不断发展的时代里&#xff0c;我们看到了关系型数据库&#xff08;RDB&#xff09;在一次次的数据演变过程中的占据王位&#xff0c;捍卫了胜利&#xff0c;像一个王朝更替下的“王权”的故事&#xff0c;精彩有趣。 本篇就来探讨下数据库的发展兴衰史&#xff0…

元宇宙与人工智能的融合:从虚拟世界到智能生态的IT新革命

文章目录 引言&#xff1a;前沿技术重塑数字交互体验一、元宇宙与AI融合的本质&#xff1a;虚拟空间与智能交互的交汇元宇宙赋能AI&#xff1a;AI赋能元宇宙&#xff1a; 二、元宇宙与AI融合的演进&#xff1a;从概念到产业热潮三、核心技术&#xff1a;元宇宙与AI融合的基石与…

问卷调查[mqtt dht]

任务 this code uses esp32-wroom-32 and dht11 to read the humidty and temperature, besieds, it will send the meassage to the cloud platform. All communication is conducted through MQTT. 打分标准 您应该对以下代码进行评级&#xff0c;并且必须遵守如…

swift 对象转Json

在 Swift 中将对象转换为 JSON 可以通过以下方法实现&#xff1a; 使用 Codable 协议 Swift 的 Codable 协议&#xff08;Encodable 和 Decodable 的组合&#xff09;是处理 JSON 编码和解码的推荐方式。 struct Person: Codable {var name: Stringvar age: Int }let person…

Python学习Day43

学习来源&#xff1a;浙大疏锦行 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as transforms import numpy as np import matplotlib.pyplot as plt from PIL import Image import os # 设置随机…

了解一下Unity AssetBundle 的几种加载方式

Unity 的 AssetBundle 系统提供了多种加载方式&#xff0c;以满足不同场景下的资源管理和性能需求。 同步加载&#xff08;LoadFromFile&#xff09; 同步加载使用 AssetBundle.LoadFromFile 方法从文件系统中直接加载 AssetBundle。这种方式会阻塞主线程&#xff0c;直到加载…

鸿蒙边缘智能计算架构实战:多线程图像采集与高可靠缓冲设计

目录 一、技术背景与挑战二、鸿蒙边缘计算架构的核心特性1. 分布式软总线&#xff1a;打破设备孤岛2. 轻量化多线程模型 三、多线程图像采集的稳定性设计1. 分层缓冲队列架构2. 线程优先级策略 四、边缘侧高可靠缓冲机制1. 基于分布式数据管理的容错设计2. 动态带宽调节 五、实…

excel中vba开发工具

1、支持单元格点击出现弹框进行选择 支持模多次模糊查询 Private Sub CommandButton1_Click() Call vehicle_查询 End SubPrivate Sub Worksheet_Activate()Call vehicle_取出车架号和公司名称 取出不重复的车架号Sheet13.ComboBox1.Visible False 车架号显示Sheet13.ComboB…

CatBoost:征服类别型特征的梯度提升王者

基于有序提升与对称树的下一代GBDT框架&#xff0c;重塑高维分类数据处理范式 一、CatBoost的诞生&#xff1a;解决类别特征的终极挑战 2017年由俄罗斯Yandex团队开源&#xff0c;CatBoost&#xff08;Categorical Boosting&#xff09;直指机器学习中的核心痛点&#xff1a;类…

使用 WSL 启动ubuntu.tar文件

使用 WSL 启动ubuntu.tar文件&#xff0c;可按以下步骤进行3&#xff1a; 检查 WSL 版本&#xff1a;确保你的 WSL 版本为 2.4.8 或更高版本。可以在命令行中输入wsl --update来更新 WSL 到最新版本。 设置默认 WSL 版本&#xff1a;如果还没有将 WSL 2 设置为默认版本&#x…