第12步---MySQL的JDBC操作

news2024/11/16 19:46:25

第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注入的问题。

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

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

相关文章

10个最受欢迎的免费STL模型下载网站【2023】

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 你是否决定立即购买 3D 打印机&#xff1f; 或者可能一直在考虑并正在寻找更多细节来了解它如何使您受益&#xff1f; 好吧&#xff0c;总有一天&#xff0c;你拥有 3D 打印活动所需的所有知识和资源&#xff0c;但没有时…

【SpringCloud】SpringCloudAlibaba官网资料

出现原因 Spring Cloud Netflix Projects Entering Maintenance Mode 官网 博客 https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md官网 https://spring.io/projects/spring-cloud-alibaba#overview英文 https://github.com/alibaba/spring-cloud-…

refresh大揽

注意在每一步大操作之前都有一个前期准备 prepareRefresh&#xff08;&#xff09; 设置spring启动的时间 设置spring关闭和开启的标志位 获取环境对象&#xff0c;并设置一些属性值&#xff0c;是系统环境的不是xml设置的 设置监听器&#xff0c;以及需要发布事件的集合。 Con…

Java算法_ BST 中第 k 个最小元素 (LeetCode_Hot100)

题目描述&#xff1a;给定一个二叉搜索树的根节点 &#xff0c;和一个整数 &#xff0c;请你设计一个算法查找其中第 个最小元素&#xff08;从 1 开始计数&#xff09;。 获得更多&#xff1f;算法思路:代码文档&#xff0c;算法解析的私得。 运行效果 完整代码 /*** 2 * Aut…

实验三 HBase1.2.6安装及配置

系列文章目录 文章目录 系列文章目录前言一、HBase1.2.6的安装二、HBase1.2.6的配置2.1 单机模式配置2.2 伪分布式模式配置 总结参考 前言 在安装HBase1.2.6之前&#xff0c;需要安装好hadoop2.7.6。 本篇文章参考&#xff1a;HBase2.2.2安装和编程实践指南 一、HBase1.2.6的安…

双频RTK定位技术原理及解决方案

双频RTK定位技术 双频RTK&#xff08;Real-Time Kinematic&#xff09;定位技术是一种利用卫星导航系统进行高精度实时定位的方法&#xff0c;它通过同时使用两个不同频率的载波信号来测量载波相位差&#xff0c;从而提高定位精度和抗干扰能力。以下是双频RTK定位技术的原理和解…

一篇文章教你使用Docker本地化部署Chatgpt(非api,速度非常快!!!)及裸连GPT的方式(告别镜像GPT)

本地搭建ChatGPT&#xff08;非api调用&#xff09; 第一种方法&#xff1a;使用Docker本地化部署第一步&#xff0c;下载安装Docker登录GPT 第二种方法&#xff1a;不部署项目&#xff0c;直接连接 第一种方法&#xff1a;使用Docker本地化部署 这种方法的好处就是没有登录限…

dolphinscheduler的僵尸任务清理和清理一直在运行的任务状态

dolphinscheduler的僵尸任务清理 界面操作不了的 只能去数据库更改状态或则删除掉 原因&#xff1a;海豚调度中有几百条僵尸任务&#xff0c; 界面怎么也删不掉&#xff0c;想从数据库中删除&#xff0c;开始查找从数据库删除的办法。 参考以下脚本&#xff0c;结合我库中僵尸…

在浏览器中打包 TypeScript 系列1:ES 模块和导入映射Import map

原文地址 这是“在浏览器中打包 TypeScript 系列”的第 1 部分。 第 2 部分&#xff1a;在浏览器中打包 TypeScript JS打包简史 让我们绕个小弯&#xff0c;看看在使用 ES 模块之前是如何使用 JS 的。 &#xff08;年份为近似值&#xff09; 1. 黑暗时代&#xff08;2010年…

SPSS--如何使用分层分析以及分层分析案例分享

分层分析&#xff1a;将资料按某个或某些需要控制的变量的不同分类进行分层&#xff0c;然后再估计暴露因子与某结局变量之间关系的一种资料分析方法。 分层分析的最重要的用途是评估和控制混杂因子所致的混杂偏倚。通过按混杂因子分层&#xff0c;可使每层内的两个比较组在所控…

七夕福利来袭:多种表白代码/语录超级赠送,不信你没女朋友

前言 马上七夕了~又是牛郎织女相会的一天&#xff01; 不管什么时候&#xff0c; 这都是一个特别的日子&#xff0c; 在这个充满幸福的日子里&#xff0c; 我要把最美好的祝福&#xff0c; 送给心里有我的每一个人&#xff1b; 祝愿大家&#xff1a; 一生平安&#xff0c…

兼具传统和新锐基因的极氪,是怎么做用户运营的?|新能源车专题研究

主笔&#xff1a;浣芳黛 出品&#xff1a;增长黑盒研究组 近几个月来&#xff0c;新能源车势头强劲&#xff0c;众多车企纷纷传出连月增长和再创新高的捷报&#xff0c;在当下整体经济复苏缓慢的映衬下&#xff0c;显得格外耀眼。 于是&#xff0c;增长黑盒近期针对新能源车企展…

Ganache的安装与设置连接

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 前言 Ganache 是DApp的测试网络&#xff0c;提供图形化界面&#xff0c;log日志等&#xff1b;智能合约部署时需要连接测试网络。 Ganache 是一个运行在本地测试的网络,通过结合cpol…

docker 06(docker compose)

一、服务编排 二、docker compose

【Mybatis源码分析】解析语句标签_Select|Update|Insert|Delete

解析语句标签 Select|Update|Insert|Delete 一、前言二、语句标签的源码分析三、sql 标签的解析四、总结 一、前言 在阐述解析语句标签之前&#xff0c;得先知道我们的语句标签内容最后被封装到Configuration哪&#xff1f;&#xff08;都应该知道 Mybatis 通过的是 XMLConfig…

骨传导耳机是如何让我们听到声音的?为什么要选择骨传导耳机?

骨传导耳机的工作原理就是通过人的颅骨、骨迷路、螺旋器、听觉中枢来传递声波&#xff0c;不需要接触到人的外耳道和内耳膜&#xff0c;省去了许多声波传递的步骤&#xff0c;相对于入耳式耳机会更加的保护耳朵。 说简单一点&#xff0c;平时我们自己挠头发或者通过上次碰撞牙…

交换机生成树STP

生成树协议&#xff08;spanning-tree-protocol,stp&#xff09;&#xff1a;在具有物理环路的交换机网络上生成没有回路的逻辑网络的方法&#xff0c;生成树协议使用生成树算法&#xff0c;在一个具有冗余路径的容错网络中计算出一个无环路的路径&#xff0c;使一部分端口处于…

Blazor Session设置

文章目录 前言SessionProtectedSessionStorage 类信息加密使用场景 代码部分Nuget扩展安装源码使用&#xff0c; 相关资料 前言 微软官方封装了一些浏览器的操作&#xff0c;其中就有Session的操作的封装 ProtectedSessionStorage 微软文档 因为我们知道&#xff0c;依赖注入…

每个.NET开发都应掌握的C#委托事件知识点

上篇文章讲述了C#接口的知识点&#xff0c;本文将介绍C#委托事件知识点。C#作为.NET开发的核心语言之一&#xff0c;提供了丰富的特性来支持面向对象编程和事件驱动的模型。其中&#xff0c;委托和事件是C#中不可或缺的关键概念&#xff0c;每个.NET开发者都应该深入理解它们的…

什么是原码、反码和补码

什么是原码、反码和补码 文章目录 什么是原码、反码和补码1、机器数2、原码3、反码4、补码5、总结 1、机器数 前言 一个数在计算机中的表示形式是二进制的话&#xff0c;这个数其实就叫机器数。 机器数通常是带有符号的&#xff08;指有正数和负数之分&#xff09;&#xff0c;…