第12步---MySQL的JDBC操作

第12步---MySQL的JDBC操作

 1.概述

采用Java API 的方式实现数据之间的操作。

根据不同的数据库采用了不同的驱动,接口是一致的。

 

下载的地址

MySQL :: Download MySQL Connector/J (Archived Versions)

2.执行流程

注册驱动

创建连接

执行sql语句的对象

结果集:虚拟表

3.入门案例

创建数据

DROP TABLE IF EXISTS student;
create table if not exists student(
	sid int primary key auto_increment,
	sname varchar(20),
	age int
);

insert into student values(NULL,'宋江',30),(NULL,'武松',28),(NULL,'林冲',26);



select * from student;

编写Java代码读取数据

public class Test {
    public static void main(String[] args) throws SQLException {
        //注册驱动
        DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
        //获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/pz?serverTimezone=Asia/Shanghai&useSSL=false"
        ,"root","root");
        //执行sql
        Statement statement = connection.createStatement();
        //执行sql
        ResultSet resultSet = statement.executeQuery("select * from student");
        //遍历结果集
        while (resultSet.next()) {
            //循环获取每一行数据
           Integer sid= resultSet.getInt("sid");
           String  sname= resultSet.getString("sname");
           Integer age= resultSet.getInt("age");
           System.out.println(sid+"-"+sname+"-"+age);
        }
        //关闭连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

 4.结果集优化

public class Test {
    public static void main(String[] args) throws SQLException {
        //注册驱动
        DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
        //获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/pz?serverTimezone=Asia/Shanghai&useSSL=false"
                , "root", "root");
        //执行sql
        Statement statement = connection.createStatement();
        //执行sql
        ResultSet resultSet = statement.executeQuery("select * from student");
        ResultSetMetaData metaData = resultSet.getMetaData();
        //表得列数
        int line = metaData.getColumnCount();

        //遍历结果集
        while (resultSet.next()) {
            for (int i = 1; i <= line; i++) {
                //获取每一列得数据
                System.out.print(resultSet.getObject(i) + "\t");
            }
            System.out.println();
        }
        //关闭连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

此时打印数据得时候就不用局限于自己设置对应得属性得名称了。

 

5.增删改操作

插入数据

public class Test2 {
    public static void main(String[] args) throws SQLException {
        //注册驱动
        DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
        //获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/pz?serverTimezone=Asia/Shanghai&useSSL=false"
                , "root", "root");
        //执行sql
        Statement statement = connection.createStatement();
        //执行sql
        statement.executeUpdate("insert into student(sid,sname,age ) values (4,'王公公',20)");
        //关闭连接
        statement.close();
        connection.close();
    }
}

插入数据的时候默认影响的插入的行数的信息

public class Test2 {
    public static void main(String[] args) throws SQLException {
        //注册驱动
        DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
        //获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/pz?serverTimezone=Asia/Shanghai&useSSL=false"
                , "root", "root");
        //执行sql
        Statement statement = connection.createStatement();
        //执行sql
        int line=statement.executeUpdate("insert into student(sid,sname,age ) values (5,'王公公',20)");
        System.out.println("影响的行数:"+line);
        //关闭连接
        statement.close();
        connection.close();
    }
}

 修改数据和删除数据就是把执行的sql换一下就可以了,换成我们需要设置的sql就可以。

//删除数据
int line=statement.executeUpdate("delete from  student where sid=5");
System.out.println("影响的行数:"+line);

 

6.SQL注入问题

用户输入的内容修改了sql本身的内容就是sql注入的问题。

创建测试的表数据

drop table if exists user;
create table user(
	uid int primary key auto_increment,
	username varchar(20),
	password varchar(20)
);
insert into user values(NULL, 'zhangsan','123456'),(NULL,'lisi','888888');

模拟用户登录的操作

public class Test3 {
    public static void main(String[] args) throws SQLException {
        //模拟用户登录操作
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名“:");
        String username=scanner.nextLine();
        System.out.println("请输入密码:");
        String password=scanner.nextLine();

        //注册驱动
        DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
        //获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/pz?serverTimezone=Asia/Shanghai&useSSL=false"
                , "root", "root");
        //执行sql
        Statement statement = connection.createStatement();
        //执行sql
        String sql="select * from user where username = '" +username +"' and password = '"+password+"'";
        System.out.println("sql:"+sql);
        ResultSet resultSet = statement.executeQuery(sql);

        ResultSetMetaData metaData = resultSet.getMetaData();
        //表得列数
        int line = metaData.getColumnCount();

        //遍历结果集
        if (resultSet.next()) {
            System.out.println("登录成功!");
        }
        else {
            System.out.println("登录失败!");
        }
        //关闭连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

 

 

上面都是正常的操作

下面是sql注入的内容,改变了原先的sql的内容了

 解决sql注入的问题是采用preparedStatement的方式采用参数的方式填入用户输入的数据。

public class Test4 {
    public static void main(String[] args) throws SQLException {
        //模拟用户登录操作
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名“:");
        String username=scanner.nextLine();
        System.out.println("请输入密码:");
        String password=scanner.nextLine();

        //注册驱动
        DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
        //获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/pz?serverTimezone=Asia/Shanghai&useSSL=false"
                , "root", "root");
        //执行sql
        String sql="select * from user where username = ? and password = ? ";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //填充参数
        preparedStatement.setString(1,username);
        preparedStatement.setString(2,password);
        System.out.println("sql:"+sql);
        ResultSet resultSet = preparedStatement.executeQuery();

        ResultSetMetaData metaData = resultSet.getMetaData();
        //表得列数
        int line = metaData.getColumnCount();

        //遍历结果集
        if (resultSet.next()) {
            System.out.println("登录成功!");
        }
        else {
            System.out.println("登录失败!");
        }
        //关闭连接
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

 

此时就解决了sql注入的问题。

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

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

相关文章

Kaggle回归问题Mercedes——Benz Greener Manufacturing

目录 前言1 题目介绍2 数据清洗3 数据可视化分析4 模型训练5 源码 前言 这是我在大三选修课的课程设计&#xff0c;内容参考了Kaggle上高赞的代码&#xff0c;有详细批注&#xff0c;整体比较基础&#xff0c;结构相对完整&#xff0c;便于初学者学习。这个是一个回归问题&…

MAC电脑外放没有声音解决方案

烦人呐&#xff0c;我的mac外接显示屏幕&#xff0c;显示器没有音频输出&#xff0c;需要mac笔记本的音频输出&#xff0c;但是经常打开后&#xff0c;mac没有声音输出&#xff0c;需要重启电脑才能生效。亲测一下方法有效&#xff0c;请参考&#xff1a; 文章目录 一、短期方案…

17.4 【Linux】systemctl 针对 timer 的配置文件

有时候&#xff0c;某些服务你想要定期执行&#xff0c;或者是开机后执行&#xff0c;或者是什么服务启动多久后执行等等的。在过去&#xff0c;我们大概都是使用 crond 这个服务来定期处理&#xff0c; 不过&#xff0c;既然现在有一直常驻在内存当中的 systemd 这个好用的东西…

无涯教程-PHP - 常量数组

现在可以使用 define()函数定义数组常量。在PHP 5.6中&#xff0c;只能使用 const 关键字定义它们。 <?php//define a array using define functiondefine(animals, [dog,cat,bird]);print(animals[1]); ?> 它产生以下浏览器输出- cat PHP - 常量数组 - 无涯教程网无…

excel逻辑函数篇1

1、AND(logical1,[logical2],…)&#xff1a;用于测试所有条件是否均为TRUE 检查所有参数均为true&#xff0c;如果是则返回true 2、OR(logical1,[logical2],…)&#xff1a;用于测试是否有为TRUE的条件 如果任意参数值为true&#xff0c;即返回true&#xff1b;只有当所有参数…

673. 最长递增子序列的个数

673. 最长递增子序列的个数 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;方法一&#xff1a;动态规划方法二&#xff1a;贪心 前缀和 二分查找 参考代码&#xff1a;__673最长递增子序列的个数__动态规划__673最长递增子序列的个数__贪心_前缀和_二分查找…

ChatGPT 随机动态可视化图表分析

动态可视化图表分析实例如下图&#xff1a; 这样的动态可视化图表可以使用ChatGPT OpenAI 来实现。 给ChatGPT发送指令&#xff1a; 你现在是一个数据分析师&#xff0c;请使用HTML&#xff0c;JS&#xff0c;Echarts&#xff0c;来完成一个动态条形图&#xff0c;条形图方向横…

汽车电子笔记之:AUTOSA架构下的OS概述

目录 1、实时操作系统&#xff08;RTOS&#xff09; 2、OSEK操作系统 2.1、OSEK概述 2.2、OSEK处理等级 2.3、OSEK任务符合类 2.4、OSEK优先级天花板模式 3、AUTOSAR OS 3.1、 AUTOSAR OS对OSEK OS的继承和扩展 3.2、AUTOSAR OS的调度表 3.3、AUTOSAR OS的时间保护 3…

OS 内核级线程

用户级线程是两个栈&#xff0c;核心级线程是两套栈&#xff0c;用户栈和内核栈 用户级是并发&#xff08;同时触发、交替执行&#xff09;&#xff0c;这个是并行&#xff08;同时触发可以同时执行&#xff09; 进入内核的唯一方式是中断 根据TCB的切换&#xff0c;实现内核…

C++11特性详解

一、简介 在C11标准出来之前&#xff0c;一直是C98/03标准占引领地位&#xff0c;而C98/03标准是C98标准在2003年将存在的一些漏洞进行了修复&#xff0c;但并没有核心语法的改动。相比于C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&…

深度学习处理文本(NLP)

文章目录 引言1. 反向传播1.1 实例流程实现1.2 前向传播1.3 计算损失1.4 反向传播误差1.5 更新权重1.6 迭代1.7 BackPropagation & Adam 代码实例 2. 优化器 -- Adam2.1 Adam解析2.2 代码实例 3. NLP任务4. 神经网络处理文本4.1 step1 字符数值化4.2 step 2 矩阵转化为向量…

HTML基础知识点

目录 ​编辑一、使用 vscode 二、研究代码的特点 三、HTML 常见标签 注释标签 标题标签 段落标签 换行标签 格式化标签 图片标签 超链接标签 表格标签 列表标签 表单标签&#xff1a; form 标签 input标签&#xff1a; select textarea标签&#xff1a; 无语…

【stable-diffusion使用扩展+插件和模型资源(下)】

插件模型魔法图片等资源&#xff1a;https://tianfeng.space/1240.html 书接上文&#xff1a;&#xff08;上&#xff09; 插件推荐 1.lobe theme lobe theme是一款主题插件&#xff0c;直接可以在扩展安装 界面进行了重新布局&#xff0c;做了一些优化&#xff0c;有兴趣的…

HDLBits-Verilog学习记录 | Verilog Language-Vectors

文章目录 11.vectors | vector012.vectors in more detail | vector113.Vector part select | Vector214.Bitwise operators | Vectorgates15.Four-input gates | Gates416.Vector concatenation operator | Vector317.Vector reversal 1 | Vectorr18. Replication operator | …

平衡二叉树的插入和删除(从现在开始摆脱旋转)

平衡二叉树是指任意节点的左子树和右子树高度之差的绝对值不超过1 一.插入操作 1.找到合适位置插入 2.从下到上&#xff0c;沿着插入节点与根节点的连线&#xff0c;找到不平衡的二叉树 以68为根节点的二叉树平衡&#xff0c;左右子树高度差为1 以60为根节点的二叉树不平衡&a…

【Adobe After Effects】关于ae点击空格不会播放反而回退一帧的解决方案

最近玩ae的时候遇见了一个小问题&#xff0c;就是有时候敲空格&#xff0c;视频没办法播放&#xff0c;反而会回退一帧&#xff0c;经过摸索发现了一个解决办法&#xff1a; 点击编辑---首选项 然后选择“音频硬件” 然后选择正确的默认输出&#xff0c;点击确定即可

Android 13 - Media框架(6)- NuPlayer::Source

Source 在播放器中起着拉流&#xff08;Streaming&#xff09;和解复用&#xff08;demux&#xff09;的作用&#xff0c;Source 设计的好坏直接影响到播放器的基础功能&#xff0c;我们这一节将会了解 NuPlayer 中的通用 Source&#xff08;GenericSource&#xff09;关注本地…

【LeetCode】224. 基本计算器

224. 基本计算器&#xff08;困难&#xff09; 方法&#xff1a;双栈解法 思路 我们可以使用两个栈 nums 和 ops 。 nums &#xff1a; 存放所有的数字ops &#xff1a;存放所有的数字以外的操作&#xff0c;/- 也看做是一种操作 然后从前往后做&#xff0c;对遍历到的字符做…

万字精讲——数据结构栈与队列必会OJ练习

W...Y的主页 &#x1f495; 代码库分享 &#x1f60a; 在之前的博客中&#xff0c;我们学习了栈与队列的基本内容&#xff0c;并且实现了栈与队列。今天我们进行刷题训练&#xff0c;走进栈与队列的世界中去感受一番&#xff01;&#xff01;&#xff01; 目录 括号匹配问题…

redis 7高级篇1 redis的单线程与多线程

一 redis单线程与多线程 1.1 redis单线程&多线程 1.redis的单线程 redis单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;Redis在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理…