JDBC初体验(二)

一、SQL注入

1.1 SQL注入原理

利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在web表单中输入(恶意的)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句

1.2 防止SQL注入的方法

  • 过滤用户输入的数据中是否包含非法字符
  • 分步校验,先使用用户名来查询用户,如果查到了,再比较密码
  • 使用PreparedStatement接口

二、PreparedStatement接口

PreparedStatement接口是Statement的子接口,可以使用该接口来替换Statement接口

PreparedStatement的使用

  • 使用Connection对象的preparedStatement(String sql):即创建它时就让它与一条SQL语句绑定
  • 编写SQL语句时,如果存在参数,就是用?作为数据占位符
  • 调用PreparedStatement的setXXX()系列方法为占位符设置值,索引从1开始
  • 调用executeUpdated()或executeQuery()方法,但要注意,要调用没有参数的方法

三、增、删、改、查操作代码演示

3.1 User类

package day02.pojo;

/**
 * @desc:User类
 */

public class User {
    private int id;
    private String userName;
    private String userPass;
    private int role;

    public User(int id, String userName, String userPass, int role) {
        this.id = id;
        this.userName = userName;
        this.userPass = userPass;
        this.role = role;
    }

    public User() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPass() {
        return userPass;
    }

    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }

    public int getRole() {
        return role;
    }

    public void setRole(int role) {
        this.role = role;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", userPass='" + userPass + '\'' +
                ", role=" + role +
                '}';
    }
}

3.2 JDBC/增删改查类

package day02.IncreaseDeleteChangeQuery;

import day02.pojo.User;

import java.sql.*;

/**
 * @desc:JDBC类、增删改查类
 */

public class UserDao {
    Connection connection =null;
    Statement statement =null;
    PreparedStatement ps = null;
    ResultSet resultSet =null;

    /**
     * 用户登录
     * @param userName 用户名
     * @param userPass 用户密码
     * @return User
     */
    public User toLogin(String userName,String userPass){
        //1.获取连接对象
        getConnection();

        //2.编写SQL语句
        String sql = "select ID,USERNAME,ROLE from user where userName = ? and userPass = ?";
        System.out.println("要执行的SQL语句是:" + sql);

        //3.创建statement对象
        User user = null;
        try {
            // 创建PreparedStatement对象 发送SQL语句并预执行
            ps = connection.prepareStatement(sql);

            //3.1处理参数
            ps.setString(1,userName);
            ps.setString(2,userPass);

            //4.执行并解析结果
            resultSet = ps.executeQuery();
            while (resultSet.next()){
                user = new User();
                user.setId(resultSet.getInt(1));
                user.setUserName(resultSet.getString(2));
                user.setRole(resultSet.getInt(3));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeResource();
        }
        return user;
    }



    /**
     * 增删改查——查
     */
    public User login(String userName,String userPass){
        //1.获取连接对象
        getConnection();

        //2.编写SQL语句
        String sql = "select ID,USERNAME,ROLE from user where userName = '"+userName+"' and userPass = '"+userPass+"'";
        System.out.println("要执行的SQL语句是:" + sql);

        //3.创建statement对象
        User user = null;
        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);

            //4.解析结果
            while (resultSet.next()){
                user = new User();
                user.setId(resultSet.getInt(1));
                user.setUserName(resultSet.getString(2));
                user.setRole(resultSet.getInt(3));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeResource();
        }
        return user;
    }
    public User login2(String userName,String userPass){
        //1.获取连接对象
        getConnection();

        //2.编写SQL语句
        String sql = "select ID,USERNAME,USERPASS,ROLE from user where userName = '"+userName+"'";
        System.out.println("要执行的SQL语句是:" + sql);

        //3.创建statement对象
        User user = null;
        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);

            //4.解析结果
            while (resultSet.next()){
                user = new User();
                user.setId(resultSet.getInt(1));
                user.setUserName(resultSet.getString(2));
                user.setUserPass(resultSet.getString(3));
                user.setRole(resultSet.getInt(4));
            }
            if(userPass.equals(user.getUserPass())){
                return user;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeResource();
        }
        return null;
    }



    /**
     * 增删改查——增
     */
    public int saveUser(User user) {
        int line = 0;
        //1、获取连接对象
        getConnection();
        //2、编写SQL语句
        String sql = "insert into user values(default,?,?,?)";
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1, user.getUserName());
            ps.setString(2,user.getUserPass());
            ps.setInt(3,user.getRole());
            //3、执行     增删改的执行方法是excuteUpdate()
            //返回一个整数,表示受影响的行数
            line = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeResource();
        }
        return line;
    }



    /**
     * 增删改查——改
     */
    public int updateUser(User user) {
        int line = 0;
        //1、获取连接对象
        getConnection();
        //2、编写SQL语句
        String sql = "update user set USERNAME=?,USERPASS=?,ROLE=? where ID=?";
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1, user.getUserName());
            ps.setString(2,user.getUserPass());
            ps.setInt(3,user.getRole());
            ps.setInt(4,user.getId());
            //3、执行     增删改的执行方法是excuteUpdate()
            //返回一个整数,表示受影响的行数
            line = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeResource();
        }
        return line;
    }



    /**
     * 增删改查——删
     */
    public  int deleteUser(int id) {
        int line = 0;
        //1、获取连接对象
        getConnection();
        //2、编写SQL语句
        String sql = "delete from user where id = ?";
        try {
            ps = connection.prepareStatement(sql);
            ps.setInt(1,id);
            //3、执行     增删改的执行方法是excuteUpdate()
            //返回一个整数,表示受影响的行数
            line = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeResource();
        }
        return line;
    }





    //↓↓↓以下两部分代码是固定的,不需要改动,所以封装起来
    /**
     * 加载驱动和建立连接
     */
    public Connection getConnection(){
        try {
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            //2.建立连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool?useSSL=false","root","zkz2002513>");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
    /**
     * 关闭资源
     */
    public void closeResource(){
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

3.3 增删改查——增

package day02.IncreaseDeleteChangeQuery;

import day02.pojo.User;

/**
 * @desc:增删改查操作——增加main方法
 */

public class IncreaseMain {
    public static void main(String[] args) {
        UserDao userDao = new UserDao();
        User user = new User();
        user.setUserName("诸葛亮");
        user.setUserPass("9087666");
        user.setRole(3);

        int line = userDao.saveUser(user);
        System.out.println(line > 0 ? "添加成功": "添加失败");
    }
}

3.4 增删改查——删

package day02.IncreaseDeleteChangeQuery;

/**
 * @desc:增删改查操作——删除main方法
 */

public class DeleteMain {
    public static void main(String[] args) {
        UserDao userDao = new UserDao();
        int line = userDao.deleteUser(11);
        System.out.println(line > 0 ? "删除成功": "删除失败");
    }
}

3.5 增删改查——改

package day02.IncreaseDeleteChangeQuery;

import day02.pojo.User;

import java.util.Scanner;

/**
 * @desc:增删改查操作——改main方法
 */

public class ChangeMain {
    public static void main(String[] args) {
/*        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要修改的用户id:");
        int id = sc.nextInt();
        System.out.println("请输入要修改的用户名:");
        String username = sc.next();
        System.out.println("请输入新的的密码:");
        String password = sc.next();
        System.out.println("请输入角色类型:");
        int role = sc.nextInt();
        User user = new User(id, username, password, role);
        UserDao userDao = new UserDao();*/

        UserDao userDao = new UserDao();
        User user = new User(8,"赵云","24678",2);

        int line = userDao.updateUser(user);
        System.out.println(line > 0 ? "修改成功" : "修改失败");
    }
}

3.6 增删改查——查

package day02.IncreaseDeleteChangeQuery;

import day02.pojo.User;

import java.util.Scanner;

/**
 * @desc:增删改查操作——查询main方法
 */

public class QueryMain {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        UserDao userDao = new UserDao();
        System.out.println("****************************************");
        System.out.println("\t\t\t\t\t用户管理系统");
        System.out.println("****************************************");
        System.out.print("请输入用户名:");
        String userName = sc.next();
        System.out.print("请输入密码:");
        String userPass = sc.next();

        User user = userDao.toLogin(userName,userPass);
        if (user == null) {
            System.out.println("登录失败,用户名或密码错误!");
        } else {
            System.out.println("登录成功,欢迎【" + user.getUserName() + "】!");
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

S1-01 FreeRTOS

什么是FreeRTOS FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。 由于RTOS需占用一定的系统资源(尤…

11Spring IoC注解式开发(下)(负责注入的注解/)

1负责注入的注解 负责注入的注解,常见的包括四个: ValueAutowiredQualifierResource 1.1 Value 当属性的类型是简单类型时,可以使用Value注解进行注入。Value注解可以出现在属性上、setter方法上、以及构造方法的形参上, 方便起见,一般直…

虚拟主机 如何上传大于100M的文件 php网站程序

问题 虚拟主机上传文件大小限制100m, 有时会遇到非常大的文件上传,上传过程中耗时非常久, 可能服务器的限制设置了上传文件尺寸,返回“413 request entity too large” 整体逻辑 前端:上传文件时,进行文…

高精度彩色3D相机:开启崭新的彩色3D成像时代

3D成像的新时代 近年来,机器人技术的快速发展促使对3D相机技术的需求不断增加,原因在于,相机在提高机器人的性能和实现多种功能方面发挥了决定性作用。然而,其中许多应用所需的解决方案更复杂,仅提供环境的深度信息是…

Linux CentOS 7.6安装nginx详细保姆级教程

一、通过wget下载nginx压缩包 1、进入home文件并创建nginx文件夹用来存放nginx压缩包 cd /home //进入home文件夹 mkdir nginx //创建nginx文件夹 cd nginx //进入nginx文件夹2、下载nginx,我这里下载的是Nginx 1.24.0版本,如果要下载新版本可以去官网进行下载:…

ChatGPT付费创作系统V2.5.5独立版+前端

ChatGPT付费创作系统V2.5.5版本优化了很多细节,功能增加增加长篇写作功能。该版本为编译版无开源,本版本特别处理了后台弹窗、暗链网址。特别优化了数据库。升级过程中未发现任何BUG,全新安装或者升级安装均未出现400或者500错误,…

LeetCode刷题--- 地下城游戏

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述动…

降低运营成本:采用安全托管服务(Managed Security Service,MSS)

文章目录 安全托管服务(MSS)?安全托管服务的内容安全风险评估安全监控预警安全应急响应安全问题咨询 企业为什么需要安全托管服务?与MSS合作的好处是什么?MSP和MSSP有何区别?MSSP如何向客户呈现服务内容企业可以托管哪些网络资产威胁管理托管…

算法训练营第四十二天|动态规划:01背包理论基础 416. 分割等和子集

目录 动态规划&#xff1a;01背包理论基础416. 分割等和子集 动态规划&#xff1a;01背包理论基础 文章链接&#xff1a;代码随想录 题目链接&#xff1a;卡码网&#xff1a;46. 携带研究材料 01背包问题 二维数组解法&#xff1a; #include <bits/stdc.h> using namesp…

楼宇管理新智慧:Panorama SCADA楼宇管理系统应用实例

一、背景介绍 楼宇管理系统旨在集中控制和监测楼宇运营&#xff0c;涵盖暖通空调&#xff08;HVAC&#xff09;、照明、电力系统、消防和安全系统等。通过直观的用户界面&#xff0c;用户得以实时监测和精准掌控这些系统&#xff0c;从而提升能源效率、确保设备正常运行&#…

Python - Bert-VITS2 语音推理服务部署

目录 一.引言 二.服务搭建 1.服务配置 2.服务代码 3.服务踩坑 三.服务使用 1.服务启动 2.服务调用 3.服务结果 四.总结 一.引言 上一篇文章我们介绍了如果使用 conda 搭建 Bert-VITS2 最新版本的环境并训练自定义语音&#xff0c;通过 1000 个 epoch 的训练&#xf…

如何彻底卸载Edge

要彻底卸载Edge浏览器&#xff0c;你可以按照以下几种方法操作&#xff1a; 方法一&#xff1a;使用控制面板 点击任务栏的“开始”按钮&#xff0c;打开“控制面板”。在控制面板中&#xff0c;选择“程序和功能”。在程序列表中找到Edge浏览器&#xff0c;右键点击它并选择…

如何使用ChemiCloud搭建WordPress外贸站完全指南(2024)

ChemiCloud是一家成立于2016年的云虚拟主机提供商&#xff0c;他们在全球范围内设有多个机房&#xff0c;并提供高性价比的服务。作为市场上最出色的WordPress外贸主机之一&#xff0c;ChemiCloud经过小编两个月的监控测试表现出色。 ChemiCloud的正常运行时间达到了99.99%&am…

工业以太网的网络安全与数据传输性能

工业以太网主要是一种用于工业控制系统的网络通信协议&#xff0c;它基于以太网技术&#xff0c;将其应用于工业环境中&#xff0c;以实现高速、可靠、安全的数据传输。跟传统的专用工业网络比较&#xff0c; 工业以太网具有更大的带宽、更低的成本以及更好的扩展性&#xff0c…

What does `wget -O` do?

wget -O 下载文件 并 重命名 wget -O 会 显示下载过程 wget -o 不会 显示下载过程 wget http://download.redis.io/releases/redis-4.0.9.tar.gz -O /usr/local/src/redis.tar.gz 或者 wget -O /usr/local/src/redis.tar.gz http://download.redis.io/releases/redis-…

爬虫01-爬虫原理以及爬虫前期准备工作

文章目录 1 爬虫基本原理什么是爬虫爬虫功能详解爬虫基本流程两个概念&#xff1a;request和response 2 一些问题爬虫能抓取什么样的数据&#xff1f;抓取的数据怎么提取部分内容&#xff1f;数据解析方式。为什么我爬虫抓取的数据和浏览器看到的不一样怎样解决JavaScript渲染的…

【办公技巧】Excel单元格隐藏的部分如何显示出来

Excel工作表中的有些单元格隐藏了数据&#xff0c;如何取消隐藏行列呢&#xff1f;今天分享几个方法给大家 方法一&#xff1a; 选中隐藏的区域&#xff0c;点击右键&#xff0c;选择【取消隐藏】就可以了 方法二&#xff1a; 如果工作表中有多个地方有隐藏的话&#xff0c;…

SpringBoot+Vue药品ADR不良反应智能监测系统源码

药品不良反应&#xff08;Adverse Drug Reaction&#xff0c;ADR&#xff09;是指合格药品在正常用法用量下出现的与用药目的无关的有害反应&#xff0c;不包括超说明书用药、药品质量问题等导致的不良后果。 ADR智能监测系统开发环境 ❀技术架构&#xff1a;B/S ❀开发语言&…

Hbuilder X 设置格式化代码时清除空白行

将 preserve_newlines 的值改为 false "preserve_newlines": false, //保留空行

Prometheus实战篇:Prometheus监控docker

Prometheus实战篇:Prometheus监控docker 准备环境 监控docker 为了能够获取到Docker容器的运行状态,用户可以通过Docker的stats命令获取当前主机上运行容器的统计信息,可以查看容器的CPU利用率,内存使用量,网络IO总量以及磁盘IO总量等信息. docker stats除了使用命令以外,用户…