JDBC初体验(二)——增、删、改、查

本课目标

理解SQL注入的概念

掌握 PreparedStatement 接口的使用

熟练使用JDBC完成数据库的增、删、改、查操作

SQL注入

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

防止SQL注入的方法:

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

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

 PreparedStatement的使用

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

PreparedStatement编程模板

使用JDBC完成数据添加的操作模板

使用JDBC完成数据修改的操作模板

使用JDBC完成数据删除的操作模板

代码演示

  • 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 +
                '}';
    }
}
  • 方法类

public class UserDo {
    Connection connection = null;
    Statement statement = null;
    PreparedStatement ps = null;
    ResultSet resultSet = null;
    /**
     * 用户登录——查找
     * 用户名
     * 密码
     */
    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 {
            //statement = connection.createStatement();
            //创建PreparedStatement对象 发送SQL语句并执行
            ps = connection.prepareStatement(sql);
            //3.1处理参数
            ps.setString(1,userName);
            ps.setString(2,userPass);
            //resultSet = statement.executeQuery(sql);
            //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;
        //获取连接对象
        getConnection();
        //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());

            //执行  增删改的执行方法是executeUpdate()
            //返回受影响的行数
            line = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeResource();
        }
        return line;
    }


    /**
     * 修改用户
     */
    public int updateUser(User user){
        int line = 0;
        getConnection();
        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());

            line = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeResource();
        }
        return line;
    }


    /**
     * 删除用户
     */
    public int deleteUser(int id){
        int line = 0;
        getConnection();
        String sql = "delete from user where id =?";
        try {
            ps = connection.prepareStatement(sql);
            ps.setInt(1,id);
            line = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeResource();
        }
        return line;
    }

    /**
     * 获取连接对象
     * @return
     */
    public Connection getConnection(){
        try {
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.建立连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool?useSSL=false","root","123456");
        } 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();
            }
        }
    }
}
  • main 方法

查——登录
public class TestQuery {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        UserDo userDo = new UserDo();
        //验证登录
        System.out.print("请输入用户名:");
        String userName = sc.nextLine();
        System.out.print("请输入密码:");
        String userPass = sc.nextLine();
        User user = userDo.tologin(userName,userPass);
        if (user != null) {
            System.out.println("登录成功!欢迎您【" + user.getUserName() + "】!");
        }else {
            System.out.println("登录失败!用户名或密码错误!");
        }
    }
}
增加
public class TestInsert {
    public static void main(String[] args) {
        UserDo userDo = new UserDo();
        User user = new User();
        user.setUserName("yanlingji");
        user.setUserPass("666666");
        user.setRole(3);

        int line = userDo.saveUser(user);
        System.out.println(line > 0 ? "插入成功" : "插入失败");
    }
}
修改
public class TestUpdate {
    public static void main(String[] args) {
        UserDo userDo =new UserDo();
        User user = new User(13,"yanlingji","888888",1);
        int line = userDo.updateUser(user);
        System.out.println(line > 0 ? "修改成功" : "修改失败");
    }
}
删除
public class TestDelete {
    public static void main(String[] args) {
        UserDo userDo = new UserDo();
        int line = userDo.deleteUser(9);
        System.out.println(line > 0 ? "删除成功" : "删除失败");
    }
}

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

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

相关文章

[C#]winform部署PaddleOCRV3推理模型

【官方框架地址】 https://github.com/PaddlePaddle/PaddleOCR.git 【算法介绍】 PaddleOCR是由百度公司推出的一款开源光学字符识别(OCR)工具,它基于深度学习框架PaddlePaddle开发。这款工具提供了一整套端到端的文字检测和识别解决方案&a…

灵魂三连问:是5G卡吗?支持5G吗?是5G套餐吗

关于5G的问题,小伙伴们的疑问是不是很多,它和4G到底有什么区别呢?什么是5G卡?什么是5G套餐?支持5G吗?什么是5G基站?我想大家现在一定是晕的,下面小编来给大家解惑! 1&…

MySQL中datetime和timestamp的区别

datetime和timestamp的区别 相同点: 存储格式相同 datetime和timestamp两者的时间格式都是YYYY-MM-DD HH:MM:SS 不同点: 存储范围不同. datetime的范围是1000-01-01到9999-12-31. 而timestamp是从1970-01-01到2038-01-19, 即后者的时间范围很小. 与时区关系. datetime是存储…

Redis Zset类型

Redis Zset类型 Zset(有序集合)它是集合的一种,不仅可以保存元素,还可以为每个元素关联一个 double 类型的分数(score),Redis 正是通过分数来为集合中的元素进行从小到大的排序。在 Zset 中&am…

1.11.。。。

1 有道云笔记 2 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include <QTextToSpeech>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QW…

STL之vector

目录 vector的定义和特性 vector的定义和结构非常简单&#xff0c;它由以下几个重要的部分组成&#xff1a; vector的常用函数 vector排序去重 排序 去重 代码示例 vector的定义和特性 在c中&#xff0c;vector是一个动态数组容器&#xff0c;可以存储一系列相同类型的…

【Docker】Linux中Docker技术入门与实战及实用的常规命令

目录 一、引言 1. 说明&#xff1a; 2. Linux介绍 3. Docker简介 二、Docker三要素 1. 镜像&#xff08;Image&#xff09; 2. 容器&#xff08;Container&#xff09; 3. 仓库&#xff08;Repository&#xff09; 三、实现案例 1. 创建 2. 设置镜像 3. 开启设置 …

基于自适应遗传算法的车间调度matlab仿真,可以任意调整工件数和机器数,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 编码与初始化 4.2 适应度函数 4.3 遗传操作 4.4 自适应机制 4.5 终止条件 5.完整程序 1.程序功能描述 基于自适应遗传算法的车间调度matlab仿真,可以任意调整工件数和机器数,输出甘…

【AI】搭建Windows Linux子系统(WSL2)CUDA环境

0.准备工作 Windows本机安装CUDA Driver 首先去下载页面下载驱动文件 点击Get CUDA Driver进入下载页面&#xff0c;我看下载页面跟普通驱动下载页面相同&#xff0c;感觉应该不是单独的驱动&#xff0c;只要之前显卡已经安装好了CUDA的驱动&#xff0c;就可以先省略这一步。…

4024A/B/C/D/E/F/G/H/L频谱分析仪

01 4024A/B/C/D/E/F/G/H/L频谱分析仪 产品综述&#xff1a; 4024频谱分析仪系列产品具有工作频段宽、性能指标高、扫描速度快、测试功能多、操作简便等多重优点&#xff0c;性能指标方面具有优良的平均噪声电平、相位噪声以及扫描速度&#xff0c;测量功能方面具有频谱分析、…

NetSuite 收入管理模块与总账的数据一致性检查

收入管理模块是NetSuite的一个艰深功能领域&#xff0c;能够有所实践&#xff0c;知原理懂变化的实施顾问少之又少。很高兴&#xff0c;我们的财务顾问Chris在23年底经历了一次深入的NetSuite收入管理模块的实践&#xff0c;对收入管理模块与总账递延收入和收入数据的一致性检查…

MySQL中order by是怎么工作的?

在如上图中所示的explain的执行结果中&#xff0c;Extra字段中的“Using filesort”表示的就是需要排序&#xff0c;MySQL会给每个线程分配一块内存用于排序&#xff0c;称为sort_buffer。 索引city如上图所示 上述语句的执行流程如下&#xff1a; 1、初始化sort_buffer&…

由于找不到msvcp140.dll无法继续执行代码原因及解决教程分享

在计算机打开软件过程&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“由于找不到msvcp140.dll无法继续执行代码”。这个错误通常发生在使用Microsoft Visual C 2015或更高版本编译的程序运行时。那么&#xff0c;什么是msvcp140.dll文件&#xff1f;为什么会…

竞赛保研 基于深度学习的行人重识别(person reid)

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的行人重识别 该项目较为新颖&#xff0c;适合…

中国社科院大学与美国杜兰大学金融管理硕士项目——熬过寒冬,春日暖阳已不远

在金融领域&#xff0c;寒冬似乎成了无法避免的阶段。然而&#xff0c;对于那些坚守岗位的金融从业者来说&#xff0c;熬过寒冬并非无望。正如冬去春来&#xff0c;只要我们采取明智的策略&#xff0c;迈出坚定的步伐&#xff0c;春日的暖阳已在不远方照耀。社科院与美国杜兰大…

2023检索增强生成技术(RAG)研究进展

一、前言 在过去的一两年里&#xff0c;人工智能领域目睹了检索增强生成技术&#xff08;RAG&#xff09;的迅猛发展&#xff0c;这种技术结合了强大的语言模型与信息检索系统&#xff0c;以期在复杂的问题解决和信息处理任务中提供更加精确和深入的答案。正是这种对前沿科技的…

Android通过Recyclerview实现流式布局自适应列数及高度

调用 FlowAdapter 跟普通recyclerview一样使用 RecyclerView rvLayout holder.getView(R.id.spe_tag_layout); FlowAdapter rvAdapter new FlowAdapter(); FlowLayoutManager flowLayoutManager new FlowLayoutManager(); rvLayout.setLayoutManager(flowLayoutManager); r…

二叉树基础oj练习(单值二叉树、相同的树、二叉树的前序遍历)

讲了这么多数据结构相关的知识(可以看我的数据结构文章专栏): 抓紧刷题巩固一下了 目录 1.单值二叉树 题目描述 思路1 代码1 思路2 代码2 2.相同的树 题目描述 思路 代码 3.二叉树的前序遍历 代码 思路 1.单值二叉树 965. 单值二叉树 - 力扣&#xff08;LeetCod…

Linux网络编程(一-网络相关知识点)

目录 一、网络相关知识简介 二、网络协议的分层模型 2.1 OSI七层模型 2.2 TCP/IP五层模型 2.3 协议层报文间的封装与拆封 三、IP协议 3.1 MAC地址 3.2 IP地址 3.3 MAC地址与IP地址区别 一、网络相关知识简介 互联网通信的本质是数字通信&#xff0c;任何数字通信都离…

Redis命令总结

1、启动Redis服务&#xff0c;登录Redis # 开启redis服务 redis-server redis配置文件路径例子&#xff1a; redis-server redis.windows.conf# 连接redis 【无密码】 redis-cli# 连接redis【有密码】 # 1 先连接再输入密码 redis-cli auth 密码 2、连接时输入 IP址、端口号、…