41.0/查询/sql注入安全问题以及解决方式。

41.1. 回顾

1. jdbc:[java database connection] java连接数据库
2. 完成了增删改操作。
   [1]加载驱动。Class.forName("com.mysql.cj.jdbc.Driver");
   [2]获取连接对象: Connection conn=DriverManager.getConnection(url,user,pass);
      url: jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai
   [3]获取执行sql语句的对象: Statement st=conn.createStatement();   
   [4]执行sql语句: st.executeUpdate(sql);
        sql: 增删改的sql.
           修改: update 表名 set 字段名=值,字段名=值.... where 条件
           添加: insert into 表名 values(值,值....);
           删除: delete from 表名 where 条件
           
   [5]关闭资源         

41.2. 正文

目录

41.1. 回顾

41.2. 正文

41.3 查询-所有

41.4 异常处理

41.5 sql注入安全问题

41.6企业级开发的模式


41.3 查询-所有

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class Test02 {public static void main(String[] args) throws Exception{//1. 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接对象String url="jdbc:mysql://localhost:3306/mydb";String user="root";String password="root";Connection conn= DriverManager.getConnection(url,user,password);//3.获取执行sql的对象Statement st=conn.createStatement();//4. 执行sql语句String sql="select * from tbl_emp";//把查询的结果封装到一个ResultSet对象中。ResultSet rs = st.executeQuery(sql);//5. 从resultSet中取出结果. next():指针往下移动并判断当前是否存在元素。  getXXX();获取当前行的指定列的值。while(rs.next()){System.out.println(rs.getInt("id")+"\t"+rs.getString("name")+"\t"+rs.getDouble("salary"));}//6. 关闭资源rs.close();st.close();conn.close();}
}

根据用户名查询: 查询姓李的人。

 

package com.demo01;import java.sql.*;public class Test05 {public static void main(String[] args) throws Exception {query();}public static void query() throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/day112303";String user = "root";String password = "634835";Connection conn = DriverManager.getConnection(url, user, password);Statement statement = conn.createStatement();String sql = "SELECT * FROM student WHERE s_name LIKE '李%'";statement.executeQuery(sql);ResultSet rs = statement.executeQuery(sql);while (rs.next()) {System.out.println(rs.getInt("s_id") + "\t" + rs.getString("s_name"));}}
}

 

41.4 异常处理

import java.sql.*;public class Test02 {public static void main(String[] args) {Connection conn = null;Statement st = null;ResultSet rs = null;try {//1. 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接对象String url = "jdbc:mysql://localhost:3306/mydb";String user = "root";String password = "root";conn = DriverManager.getConnection(url, user, password);//3.获取执行sql的对象st = conn.createStatement();//4. 执行sql语句String sql = "select * from tbl_emp";//把查询的结果封装到一个ResultSet对象中。rs = st.executeQuery(sql);//5. 从resultSet中取出结果. next():指针往下移动并判断当前是否存在元素。  getXXX();获取当前行的指定列的值。while (rs.next()) {System.out.println(rs.getInt("id") + "\t" + rs.getString("name") + "\t" + rs.getDouble("salary"));}} catch (Exception e) {e.printStackTrace();} finally {//6. 关闭资源if (rs != null) {try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (st != null) {try {st.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}}
}

41.5 sql注入安全问题

发现无论你输入任何的账户和密码 只要or 后面的条件成立

那么一定都可以登录成功。出现bug了。

问题出现在Statement类,该类存在sql注入安全隐患

为了解决该隐患,创建了一个子类PreparedStatement.  

 

import java.sql.*;
import java.util.Scanner;public class Test03 {static String url = "jdbc:mysql://localhost:3306/mydb";static String user = "root";static String pwd = "root";public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.print("请输入账户:");String u=sc.nextLine();System.out.print("请输入密码:");String p=sc.nextLine();// next()和nextLine()区别: next()输入空格 空格以后的内容无法获取boolean flag = login(u, p);if(flag==true){System.out.println("登录成功");}else{System.out.println("登录失败");}}/*** 根据账户和密码判断是否登录成功** @param name     输入的账户* @param password 输入的密码* @return true表示登录成功  false表示登录失败*/public static boolean login(String name, String password) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection(url, user, pwd);//?:表示占位符。--对sql预先编译。String sql = "select * from tbl_user where username=? and password=?";ps = conn.prepareStatement(sql);//为占位符赋值。int parameterIndex 第几个占位符, Object x 占位符的内容ps.setObject(1,name);ps.setObject(2,password);rs = ps.executeQuery();while (rs.next()) {return true;}} catch (Exception e) {e.printStackTrace();} finally{//6. 关闭资源if (rs != null) {try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (ps != null) {try {ps.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}return false;}}

根据账户和年龄查询用户信息 使用preparedStatement

41.6企业级开发的模式

dao类:

[data access object ] 数据访问对象层

包下都是用来访问数据对应表的操作

StudentDao: 该类专门用来操作Student表的,每个操作对应一个方法。

TeacherDao: 该类专门用来操作Teacher表,每个操作对应一个方法。

package com.ykq.dao;import java.sql.*;public class UserDao {String url = "jdbc:mysql://localhost:3306/mydb";String user = "root";String pwd = "root";Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;//每个操作对应一个方法。//1.根据id删除用户public int deleteById(int id) {try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection(url, user, pwd);//?:表示占位符。--对sql预先编译。String sql = "delete from tbl_user where id=?";ps = conn.prepareStatement(sql);ps.setObject(1,id);int i = ps.executeUpdate();return i;} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();} finally {//6. 关闭资源if (rs != null) {try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (ps != null) {try {ps.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}return 0;}//2. 添加用户public int insert(String username,String password,String realname){try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection(url, user, pwd);//?:表示占位符。--对sql预先编译。String sql = "insert into tbl_user(username,password,realname) values(?,?,?)";ps = conn.prepareStatement(sql);ps.setObject(1,username);ps.setObject(2,password);ps.setObject(3,realname);//执行sqlint i = ps.executeUpdate();return i;} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();} finally {//6. 关闭资源if (rs != null) {try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (ps != null) {try {ps.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}return 0;}
}

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

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

相关文章

利用sql语句来统计用户登录数据的实践

目录 1 基本数据情况2 统计每个用户每个月登录次数3 将日期按月显示在列上4 总结 1 基本数据情况 当需要对用户登录情况进行统计时,SQL是一个非常强大的工具。通过SQL,可以轻松地从数据库中提取和汇总数据,并以适合分析和报告的方式进行呈现…

构建强大的接口自动化测试框架:Pytest实践指南!

一. 背景 Pytest目前已经成为Python系自动化测试必学必备的一个框架,网上也有很多的文章讲述相关的知识。最近自己也抽时间梳理了一份pytest接口自动化测试框架,因此准备写文章记录一下,做到尽量简单通俗易懂,当然前提是基本的py…

技巧-PyCharm中Debug和Run对训练的影响和实验测试

简介 在训练深度学习模型时,使用PyCharm的Debug模式和Run模式对训练模型的耗时会有一些区别。 Debug模式:Debug模式在训练模型时,会对每一行代码进行监视,这使得CPU的利用率相对较高。由于需要逐步执行、断点调试、查看变量值等操…

华为ospf和isis双点双向路由重分布的次优路径和环路终极解决方案

r5上直接导入直连路由 r3和r2进行双点双向路由重分布 查看R3去往R5产生了次优路径: 因为是R2先互相引入的isis和ospf,所以R3会产生次优路径,如果是R3先相互引入ospf和isis,那就是R2去R5会产生次优路径,而R3本身不会。…

基于若依的ruoyi-nbcio流程管理系统增加流程节点配置(三)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 这一节主要是对每个流程节点的字段规则设置与操作规则设置,目前也是只针对自定义业务表单。 1、…

如何设置带有密码的excel只读模式?

Excel只读模式大家都不陌生,那大家知道带有密码的只读模式吗?今天给大家分享如何设置带有密码的只读模式。 打开excel文件,将文件进行【另存为】设置,然后停留在保存路径的界面中,我们点击下面的工具 – 常规选项 在常…

浅谈数据资产价值评估

加gzh"大数据食铁兽“,了解更多大数据信息 数据是资产,是当前时代大背景下毋庸置疑的。随着科技的发展,数据的重要性越来越受到人们的关注。对于企业来说,数据是非常重要的资产,它可以为企业提供决策依据、增加市…

20天GMV超过百万美金!桌下迷你跑步机在TikTok Shop美国站热销

上周总GMV达到1.59亿美元,达到历史新高,是美国站自开通以来首次单周出单达到亿级;日均出单1660万美元,单日出单最高达2820万美元; 截至11月19日,GMV Top 5 的商品分类排名依次为:美妆个护、女士…

【论文复现】RoSteALS: Robust Steganography using Autoencoder Latent Space-2023-CVPR

代码链接:https://github.com/TuBui/RoSteALS 一定要按照dockerfile,requirements.txt和requirements2.txt配置环境 需要补充的库: pip安装:omegaconf slack slackclient bchlib (0.14.0版本) einops imagenet-c conda安装&…

4、stable diffusion

github 安装anaconda环境 conda env create -f environment.yaml conda activate ldm安装依赖 conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -c pytorch pip install transformers4.19.2 diffusers invisible-watermark pip install -e…

C++学习之路(十一)C++ 用Qt5实现一个工具箱(增加一个进制转换器功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《时间戳转换功能》功能。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 进制转换 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具…

抖音本地生活服务商申请要多久审核通过?

近年来,随着互联网的普及和社交媒体的兴起,本地生活服务行业也迎来了巨大的发展机遇。作为最受欢迎的短视频平台之一,抖音也不例外。抖音本地生活服务商申请要多久审核通过?这是许多想要加入抖音本地服务行业的人们最关心的问题之…

Docker—共享应用程序

现在您已经构建了一个映像,可以共享它。要共享Docker映像,您必须使用Docker注册表。默认注册表是Docker Hub,是您使用的所有图像的来源。 Docker ID(Docker标识) Docker ID允许您访问Docker Hub,这是世界上…

深入了解Java8新特性-日期时间API:OffsetDateTime类

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概24000多字,预计阅读时间长需要20分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&…

easyExcel自定义导出,指定列,设置请求头背景色,加入合计行,设置合计行字体,背景色等等

效果图 1.引入easyExcel pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.1</version></dependency> 2.工具类-自定义样式handler-CustomCellWriteHandler import java.util…

信号分析仪-4024CA频谱分析仪 频率范围9kHz~9GHz

01 4024CA频谱分析仪 产品综述&#xff1a; 4024CA频谱分析仪是一款专为外场测试而设计的大宽带手持式实时频谱分析仪&#xff0c;最大实时分析带宽达到120MHz&#xff0c;具有实时频谱分析、5G NR解调分析、LTE FDD/TDD解调分析、GSM/EDGE解调分析、定向分析等多种测量功能…

QT6 Creator编译KDDockWidgets并部署到QT

为什么使用KDDockWidgets 为什么使用KDDockWidgets呢&#xff1f; 首先它是一个优秀的开源dock库&#xff0c;弥补QDockWidget的不足&#xff0c;详情见官网。 其次它支持QML&#xff0c;这是我最终选择这个dock库的主要原因&#xff0c;因为最近在考虑将前端界面用QML做&…

SSM训练营管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 训练营管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系 统主要采用B/S模…

金字塔原理

金字塔原理 来自于麦肯锡公司的第一位女性咨询顾问芭芭拉•明托的著作《金字塔原理》。 原理介绍 此原理是一种重点突出、逻辑清晰、主次分明的逻辑思路、表达方式和规范动作。 金字塔的基本结构是&#xff1a;中心思想明确&#xff0c;结论先行&#xff0c;以上统下&#xff…

Maven——坐标和依赖

Maven的一大功能是管理项目依赖。为了能自动化地解析任何一个Java构件&#xff0c;Maven就必须将它们唯一标识&#xff0c;这就依赖管理的底层基础——坐标。将详细分析Maven坐标的作用&#xff0c;解释其每一个元素&#xff1b;在此基础上&#xff0c;再介绍如何配置Maven&…