IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL攻略 - JDBC程序SQL注入,PreparedStatement接口详解与案例练习,JDBC相关API小结 -> 正文阅读

[大数据]MySQL攻略 - JDBC程序SQL注入,PreparedStatement接口详解与案例练习,JDBC相关API小结

SQL注入

请添加图片描述

Statement详解

基本介绍

statement是一个接口(interface statement)

  1. Statement对象,用于执行静态SQL语句并返回其生成的结果的对象
  2. 在连接建立后,需要对数据库进行访问,执行命令或是SQL语句,可以通过
  • Statemetn【存在SQL注入问题】
  • PreparedStatement【预处理】
  • CallableStatement【存储过程】
  1. Statement对象执行SQL语句,存在SQL注入风险
  2. SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库
  3. 要防范SQL注入,只要用PreparedStatement(从Statement扩展而来)取代Statement就可以了

Navicat演示SQL注入

-- 演示sql 注入
-- 创建一张表
Create table admin (	-- 管理员表
Name varchar(32) not null unique,
pwd varchar(32) not null default ''
) character set utf8;

-- 添加数据
Insert into admin values('tom','123');

-- 查找某个管理是否存在

-- select * from admin where name = 'taotao' and pwd = '123';

-- SQL
-- 输入用户名 为 1 ' or
-- 输入密码 为 or '1' = '1
select * from admin where name = '1 ' or' and pwd = 'or '1' = '1';

JDBC演示SQL注入

package com.taotao.jdbc.statement;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

/**
 * Create By 刘鸿涛
 * 2022/3/1 15:45
 */
@SuppressWarnings({"all"})
public class Statement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner sc = new Scanner(System.in);

        //让用户输入管理员和密码
        System.out.print("请输入管理员姓名:");
        String admin_name = sc.nextLine();  //nextline回车键代表此数据结束
        System.out.print("请输入管理员密码:");
        String admin_pwd = sc.nextLine();

        //通过Properties对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));

        //获取账号密码
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");

        //获取驱动
        String url = properties.getProperty("url");

        //1.加载Driver类
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.连接SQL
        Connection connection = DriverManager.getConnection(url, user, password);

        //3.得到statement,然后执行增删改查
        Statement statement = connection.createStatement();

        //4.组织SQL
        String sql = "select name,pwd from admin where name = '" + admin_name + "' and pwd = '"+ admin_pwd  +"'";

        ResultSet resultSet = statement.executeQuery(sql);
        if (resultSet.next()){  //如果查询到一条记录,则说明该管理存在
            System.out.println("恭喜,登陆成功");
        }else {
            System.out.println("登录失败");
        }

        //5.关闭连接资源
        resultSet.close();
        statement.close();
        connection.close();

    }
}

请添加图片描述

请添加图片描述

PreparedStatement详解

基本介绍

  1. PreparedStatement执行的SQL语句中的参数用问号(?)来表示,调用PreparedStatement对象的setXxx()方法来设置这些参数.setXxx()方法有两个参数,第一个参数是要设置的SQL语句中的参数的索引(从1开始),第二个是设置的SQL语句中的参数的值
  2. 调用executeQuery(),返回ResultSet对象
  3. 调用executeUpdate(),执行更新,包括增、删、修改

预处理好处

  1. 不再使用 + 拼接sql语句,减少语法错误
  2. 有效的解决了sql注入问题!
  3. 大大减少了编译次数,效率较高

预处理案例(selete语句)

package com.taotao.jdbc.preparedstatement;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

/**
 * Create By 刘鸿涛
 * 2022/3/1 16:54
 */
@SuppressWarnings({"all"})
public class PreparedStatement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner sc = new Scanner(System.in);

        //让用户输入管理员和密码
        System.out.print("请输入管理员姓名:");
        String admin_name = sc.nextLine();  //nextline回车键代表此数据结束
        System.out.print("请输入管理员密码:");
        String admin_pwd = sc.nextLine();

        //通过Properties对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));

        //获取账号密码
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");

        //获取驱动
        String url = properties.getProperty("url");

        //1.加载Driver类
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.连接SQL
        Connection connection = DriverManager.getConnection(url, user, password);

        //3.得到PreparedStatement
        //3.1.组织SQL,sql语句的 ? 就相当于占位符
        String sql = "select name,pwd from admin where name =?  and pwd =? ";
        //3.2 preparedStatement 对象实现了 PreparedStatement 接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //3.3给 ? 赋值
        preparedStatement.setString(1,admin_name);
        preparedStatement.setString(2,admin_pwd);

        //4.执行select 语句使用 executeQuery
        // 如果执行的是dml(update,insert,delete) executeUpdate()
        // 这里执行 executeQuery,不要再写 sql,因为已经被preparedStatement.setString语句处理过了
        ResultSet resultSet = preparedStatement.executeQuery();
        if (resultSet.next()){  //如果查询到一条记录,则说明该管理存在
            System.out.println("恭喜,登陆成功");
        }else {
            System.out.println("登录失败");
        }

        //5.关闭连接资源
        resultSet.close();
        preparedStatement.close();
        connection.close();

    }
}

预处理案例(insert语句)

package com.taotao.jdbc.preparedstatement;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

/**
 * Create By 刘鸿涛
 * 2022/3/1 16:54
 */
@SuppressWarnings({"all"})
public class PreparedStatement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner sc = new Scanner(System.in);

        //让用户输入管理员和密码
        System.out.print("请输入添加用户姓名");
        String admin_name = sc.nextLine();  //nextline回车键代表此数据结束
        System.out.print("请输入添加用户密码");
        String admin_pwd = sc.nextLine();

        //通过Properties对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));

        //获取账号密码
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");

        //获取驱动
        String url = properties.getProperty("url");

        //1.加载Driver类
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.连接SQL
        Connection connection = DriverManager.getConnection(url, user, password);

        //3.得到PreparedStatement
        //3.1.组织SQL,sql语句的 ? 就相当于占位符
        String sql = "insert into admin values(?,?) ";
        //3.2 preparedStatement 对象实现了 PreparedStatement 接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //3.3给 ? 赋值
        preparedStatement.setString(1,admin_name);
        preparedStatement.setString(2,admin_pwd);

        //4.执行select 语句使用 executeQuery
        // 如果执行的是dml(update,insert,delete) executeUpdate()
        // 这里执行 executeQuery,不要再写 sql,因为已经被preparedStatement.setString语句处理过了
        int i = preparedStatement.executeUpdate();

        System.out.println("创建用户" + (i == 1 ? "成功":"失败" ));

        //5.关闭连接资源
        preparedStatement.close();
        connection.close();

    }
}

预处理案例(update语句)

package com.taotao.jdbc.preparedstatement;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

/**
 * Create By 刘鸿涛
 * 2022/3/1 16:54
 */
@SuppressWarnings({"all"})
public class PreparedStatement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner sc = new Scanner(System.in);

        //让用户输入管理员和密码
        System.out.print("请输入管理员姓名");
        String admin_name = sc.nextLine();  //nextline回车键代表此数据结束
        System.out.print("请输入新的密码");
        String admin_pwd = sc.nextLine();

        //通过Properties对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));

        //获取账号密码
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");

        //获取驱动
        String url = properties.getProperty("url");

        //1.加载Driver类
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.连接SQL
        Connection connection = DriverManager.getConnection(url, user, password);

        //3.得到PreparedStatement
        //3.1.组织SQL,sql语句的 ? 就相当于占位符
        String sql = "update admin set pwd = ? where name = ?";
        //3.2 preparedStatement 对象实现了 PreparedStatement 接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //3.3给 ? 赋值
        preparedStatement.setString(2,admin_name);
        preparedStatement.setString(1,admin_pwd);

        //4.执行select 语句使用 executeQuery
        // 如果执行的是dml(update,insert,delete) executeUpdate()
        // 这里执行 executeQuery,不要再写 sql,因为已经被preparedStatement.setString语句处理过了
        int i = preparedStatement.executeUpdate();

        System.out.println("修改用户密码" + (i == 1 ? "成功":"失败" ));

        //5.关闭连接资源
        preparedStatement.close();
        connection.close();
    }
}

预处理案例(delete语句)

package com.taotao.jdbc.preparedstatement;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

/**
 * Create By 刘鸿涛
 * 2022/3/1 16:54
 */
@SuppressWarnings({"all"})
public class PreparedStatement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner sc = new Scanner(System.in);

        //让用户输入管理员和密码
        System.out.print("请输入要删除的管理员姓名");
        String admin_name = sc.nextLine();  //nextline回车键代表此数据结束

        //通过Properties对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));

        //获取账号密码
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");

        //获取驱动
        String url = properties.getProperty("url");

        //1.加载Driver类
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.连接SQL
        Connection connection = DriverManager.getConnection(url, user, password);

        //3.得到PreparedStatement
        //3.1.组织SQL,sql语句的 ? 就相当于占位符
        String sql = "delete from admin where name = ?";
        //3.2 preparedStatement 对象实现了 PreparedStatement 接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //3.3给 ? 赋值
        preparedStatement.setString(1,admin_name);

        //4.执行select 语句使用 executeQuery
        // 如果执行的是dml(update,insert,delete) executeUpdate()
        // 这里执行 executeQuery,不要再写 sql,因为已经被preparedStatement.setString语句处理过了
        int i = preparedStatement.executeUpdate();

        System.out.println("删除用户成功" + (i == 1 ? "成功":"失败" ));

        //5.关闭连接资源
        preparedStatement.close();
        connection.close();
    }
}

预处理案例(create表)

package com.taotao.jdbc.preparedstatement;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

/**
 * Create By 刘鸿涛
 * 2022/3/1 16:54
 */
@SuppressWarnings({"all"})
public class PreparedStatement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner sc = new Scanner(System.in);

        //让用户输入管理员和密码
        System.out.print("请输入要创建的表名称");
        String table_Name = sc.nextLine();  //nextline回车键代表此数据结束

        //通过Properties对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));

        //获取账号密码
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");

        //获取驱动
        String url = properties.getProperty("url");

        //1.加载Driver类
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.连接SQL
        Connection connection = DriverManager.getConnection(url, user, password);

        //3.得到PreparedStatement
        //3.1.组织SQL,sql语句的 ? 就相当于占位符
        String sql = "create table "+table_Name+"(id int)";
        //3.2 preparedStatement 对象实现了 PreparedStatement 接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //4.创建表要用execute,并且返回的布尔值
        boolean execute = preparedStatement.execute(sql);

        System.out.println("创建表" + (execute == false ? "成功":"失败" ));

        //5.关闭连接资源
        preparedStatement.close();
        connection.close();
    }
}

注意

  • 占位符不能用于表名和列名!

JDBC的相关API小结

DriverManager驱动管理类

getConnection(url,user,pwd):获取连接

Connection接口

createStatement():生成命令对象

prepareStatement(sql):生成预编译命令对象

请添加图片描述

请添加图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:21:05  更:2022-03-03 16:25:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:36:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码