当前位置: 首页 > news >正文

【java web篇】使用JDBC操作数据库

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:java 小白到高手的蜕变🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

目录

    • 📋 个人简介
  • 前言
    • JDBC简介
    • JDBC快速入们
    • JDBC API 详解
      • DriverManager
      • Connection
      • Statement
      • ResultSet
      • PreparedStatement - SQL注入演示
  • 结语

前言

一个项目肯定是离不开数据库的,每种语言都有涉及到操作数据库的内容,本节来看看java语言中如何使用JDBC如何操作数据库!

JDBC简介

就是使用java语言操作关系型数据库的一套API。
请添加图片描述

JDBC快速入们

主要有7步,当然在这之前肯定要先在当前项目或者模块中导入java操作mysql的jar包。对于这个jar包的下载不再总结!
在这里插入图片描述
如图,在模块中新建一个libs目录,将这个jar包放到里面。然后我们要让这个模块识别这个jar包:
在这里插入图片描述
在这里插入图片描述
我们选择模块有效就可以,然后就可以写代码了!
这7步我注视到代码里:

package JdbcDemo;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args){try {methods();} catch (Exception e) {e.printStackTrace();}}public static void methods() throws Exception{// 1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.获取连接String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 3.定义sqlString sql = "update spj set QTY = 400 where SNO = 'S1'";// 4.获取执行sql的对象StatementStatement stmt = conn.createStatement();// 5. 执行sqlint count = stmt.executeUpdate(sql); //返回更新的数据条数// 6.输出执行结果System.out.println("受影响行数:" + count);// 7.释放资源stmt.close();  //关闭执行sql的对象conn.close(); //关闭连接}
}

在这里插入图片描述

JDBC API 详解

DriverManager

DriverManager (驱动管理类)作用:

  1. 注册驱动
  2. 获取数据库的连接

在这里插入图片描述
但是,我们上面的案例代码中,并没有使用registerDriver来注册驱动,而是使用反射的方式加载Driver类,这个类里面用到了这个方法,来看看源码:
在这里插入图片描述
当然,mysql 5.0之后的jar包,注册驱动的这行代码可以不用写了:

Class.forName("com.mysql.cj.jdbc.Driver");

因为这个jar包中有文件记录了这个类名,会读取文件自动加载!
在这里插入图片描述

Connection

Connection的参数说明:
请添加图片描述
Connection(数据库连接对象)作用

  1. 获取执行sql的对象

请添加图片描述

  1. 管理事务

请添加图片描述

package Demo;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;/*** @Author:Aniu* @Date:2023/2/26 14:16* @description TODO*/
public class Demo {public static void main(String[] args){try {methods();} catch (Exception e) {e.printStackTrace();}}public static void methods() throws Exception{// 1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.获取连接String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 3.定义sqlString sql1 = "update spj set QTY = 450 where SNO = 'S1'";String sql2 = "update spj set QTY = 250 where SNO = 'S2'";// 4.获取执行sql的对象StatementStatement stmt = conn.createStatement();try {// 开启事务conn.setAutoCommit(false);// 5. 执行sqlint count1 = stmt.executeUpdate(sql1); //返回更新的数据条数// 6.输出执行结果System.out.println("受影响行数:" + count1);// 5. 执行sqlint count2 = stmt.executeUpdate(sql2); //返回更新的数据条数// 6.输出执行结果System.out.println("受影响行数:" + count2);// 提交事务conn.commit();} catch (Exception e) {// 回滚事务conn.rollback();e.printStackTrace();}// 7.释放资源stmt.close();  //关闭执行sql的对象conn.close(); //关闭连接}
}

在这里插入图片描述
开启事务的目的就是当发生异常的时候回滚,让这几条sql操作都不执行,这里不再多说!

Statement

Statement 的作用

  • 执行sql操作
    请添加图片描述

ResultSet

ResultSet (结果集对象)作用
1.封装了DQL查询语句的结果

ResultSet stmt.execute(sql)  //执行DQL语句,返回ResultSet对象

在这里插入图片描述
请添加图片描述
例:

package Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;/*** @Author:Aniu* @Date:2023/2/26 14:50* @description ResultSet*/
public class Test {public static void main(String[] args) throws Exception {// 1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.获取连接String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 3.定义sqlString sql = "select * from spj";// 4.获取Statement对象Statement stmt = conn.createStatement();// 5.执行sqlResultSet rs = stmt.executeQuery(sql);// 6.处理结果,遍历rs中的所有数据while(rs.next()){String sno = rs.getString("SNO");String pno = rs.getString("PNO");String jno = rs.getString("JNO");int qty = rs.getInt("QTY");System.out.println(sno);System.out.println(pno);System.out.println(jno);System.out.println(qty);System.out.println("------------");}// 7.释放资源rs.close();stmt.close();  //关闭执行sql的对象conn.close(); //关闭连接}
}

在这里插入图片描述

PreparedStatement - SQL注入演示

PreparedStatement 作用:

  • 预编译SQL语句并执行:预防SQL注入问题

SQL注入

  • SQL注入是通过操作输入来修改事先定义的SQL语句,用以达到执行代码对服务器进行攻击的方法。

进行这个案例,我们要先创建一张用户表:

CREATE TABLE `user` (`uid` bigint NOT NULL AUTO_INCREMENT COMMENT '用户uid', `login_name` varchar(20) NOT NULL COMMENT '登录用户名',`login_pwd` varchar(32) NOT NULL COMMENT '登录密码',PRIMARY KEY (`uid`)
) 

在这里插入图片描述

package Login;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;/*** @Author:Aniu* @Date:2023/2/26 15:36* @description TODO*/
public class UserLogin {public static void main(String[] args) throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 模拟用户输入的值String login_name = "aniu";String login_pwd = "123456";String sql = "select * from user where login_name = '" + login_name + "' and login_pwd = '" + login_pwd + "'";System.out.println(sql);Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);// 判断是否登录成功if(rs.next()){System.out.println("登录成功!");}else{System.out.println("登录失败!");}}
}

在这里插入图片描述
现在我们模拟sql注入,即使密码错误也可以登录成功!

public static void main(String[] args) throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 模拟用户输入的值(演示sql注入,用户名和密码随便写)String login_name = "aniu666";String login_pwd = "' or '1' = '1";String sql = "select * from user where login_name = '" + login_name + "' and login_pwd = '" + login_pwd + "'";System.out.println(sql);Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);// 判断是否登录成功if(rs.next()){System.out.println("登录成功!");}else{System.out.println("登录失败!");}// 释放资源rs.close();stmt.close();  //关闭执行sql的对象conn.close(); //关闭连接}

在这里插入图片描述
即使用户明和密码错误我们也可以登录,这是因为这个sql是恒等式所导致的!

那么怎么避免这个问题呢?就是通过这个PreparedStatement来解决!

请添加图片描述

public class UserLogin {public static void main(String[] args) throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 模拟用户输入的值(演示sql注入,用户名和密码随便写)String login_name = "aniu666";String login_pwd = "' or '1' = '1";String sql = "select * from user where login_name = ? and login_pwd = ?";PreparedStatement pstmt = conn.prepareStatement(sql);// 设置?的值pstmt.setString(1,login_name);pstmt.setString(2,login_pwd);ResultSet rs = pstmt.executeQuery();// 判断是否登录成功if(rs.next()){System.out.println("登录成功!");}else{System.out.println("登录失败!");}// 7.释放资源rs.close();pstmt.close();  //关闭执行sql的对象conn.close(); //关闭连接}
}

在这里插入图片描述
此时则显示登陆失败,避免了sql注入!本质上就是将sql中单引号进行了转义
’ \’ ',使用prepareStatement预编译sql性能更高!当然你要开启预编译,给Connection的url加参数:

String url = "jdbc:mysql://127.0.0.1:3306/myclasswork?useServerPrepStmts=true";

结语

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门

相关文章:

【java web篇】使用JDBC操作数据库

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…...

华为OD机试题,用 Java 解【最小步骤数】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...

JAVA中 throw 和 throws 的区别含案例

JAVA中 throw 和 throws 的区别含案例 在 Java 中,throw 和 throws 是两个关键字,它们用于处理异常。 throw 关键字用于抛出一个异常对象。一旦抛出异常,程序将停止执行当前方法的剩余代码,并尝试寻找与该异常匹配的 catch 块来…...

基于SpringCloud的可靠消息最终一致性05:保存并发送事务消息

在有了分布式事务的解决方案、项目的需求、骨架代码和基础代码,做好了所有的准备工作之后,接下来就可以继续深入了解「核心业务」了。 在前面了解分布式事务时,可靠消息最终一致性方案的流程图是这样的: 图三十一:可靠消息最终一致性 整个的流程是: 1、业务处理服务在事务…...

SQL语句大全(详解)

SQL前言1 DDL1.1 显示所包含的数据库1.2 创建数据库1.3 删除数据库1.4 使用数据库1.4.1 创建表1.4.2 查看表的结构1.4.3 查看当前数据库下的所有表1.4.4 基础的增删改查1.4.4.1 删除表1.4.4.2 添加列1.4.4.3 修改表名1.4.4.4 修改数据类型1.4.4.5 修改列名和数据类型2 DML2.1 给…...

视频营销活动中7个常见的错误

如今,越来越多的企业在社交媒体平台上开展视频营销活动。与其他传统营销策略不同,视频营销可以为企业带来更多的销售机会。随着越来越多的视频社交媒体平台的出现,营销人员更应该抓住这个机会。但在开始视频创作之前,您需要有一个…...

MapReduce小试牛刀

部署完hadoop单机版后,试下mapreduce是怎么分析处理数据的 Word Count Word Count 就是"词语统计",这是 MapReduce 工作程序中最经典的一种。它的主要任务是对一个文本文件中的词语作归纳统计,统计出每个出现过的词语一共出现的次…...

2023年全国最新工会考试精选真题及答案7

百分百题库提供工会考试试题、工会考试预测题、工会考试真题、工会证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 21.会员大会或会员代表大会与职工代表大会或职工大会须分别行使职权,()…...

13-mvc框架原理与实现方式

1、mvc原理 # mvc 与框架## 1.mvc 是什么1. m:model,模型(即数据来源),主要是针对数据库操作 2. v:view,视图,html 页面。视图由一个一个模板构成(模板是视图的一个具体展现或载体,视图是模板的一个抽象) 3. c:controller,控制器,用于mv之间的数据交互## 2.最简单的 mvc 就是一…...

弹性盒子布局

目录一、弹性盒子属性二、认识flex的坐标轴三、简单学习父级盒子属性三、属性说明3.1、flex-grow一、弹性盒子属性 说明: div的默认样式:display:block 块盒子 display:flex弹性盒子(可以控制下级盒子的位置) 当两种盒子单独出现…...

C# Sqlite数据库加密

sqlite官方的数据库加密是收费的,而且比较贵。 幸亏微软提供了一种免费的方法。 1 sqlite加密demo 这里我做了一个小的demo演示如下: 在界面中拖入数据库名、密码、以及保存的路径 比如我选择保存路径桌面的sqlite目录,数据库名guigutool…...

高压放大器在声波谐振电小天线收发测试系统中的应用

实验名称:高压放大器在声波谐振电小天线收发测试系统中的应用研究方向:信号传输测试目的:声波谐振电小天线颠覆了传统电小天线以电磁波谐振作为理论基础的天线发射和接收模式,它借助声波谐振实现电磁信号的辐射或接收。因为同频的…...

锁相环的组成和原理及应用

一.锁相环的基本组成 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步,利用锁相环路就可以实现这个目的。 锁相环路是一种反馈控制电路,简称锁相环(PLL)。锁相环的特点是:利用外部输入的参考信号控制环路内…...

[C++]string类模拟实现

目录 前言: 1. string框架构造 2. 默认函数 2.1 构造函数 2.2 析构函数 2.3 拷贝构造 2.4 赋值重载 3. 迭代器 4. 整体程序 前言: 本篇文章模拟实现了C中string的部分功能,有助于大家了解和熟悉string类,虽然这个类不难实…...

一个更适合Java初学者的轻量级开发工具:BlueJ

Java是世界上最流行的编程语言之一,它被广泛用于从Web开发到移动应用的各种应用程序。大部分Java工程师主要是用IDEA、Eclipse为主,这两个开发工具由于有强大的能力,所以复杂度上就更高一些。如果您刚刚开始使用Java,或者您更适合…...

从程序员到项目组长,要经历六重修炼

最近和粉丝朋友们交流时发现,有很多刚刚开始做项目组长的朋友自我认可度非常低,感觉做组长之后天天打杂,技术也荒废了。领导天天找你要成果,下属天天找你说困难,你在中间受领导和下属的夹板气。时间久了,你…...

我的 System Verilog 学习记录(5)

、 引言 本文简单介绍 System Verilog 语言的 控制流。 前文链接: 我的 System Verilog 学习记录(1) 我的 System Verilog 学习记录(2) 我的 System Verilog 学习记录(3) 我的 System Ver…...

多芯片设计 Designing For Multiple Die

Why a system-level approach is essential, and why its so challenging作者:Ann MutschlerAnn Mutschler is executive editor at Semiconductor Engineering.将多个裸片或芯粒集成到一个封装中,与将它们放在同一硅片上有着很大的区别。在同一硅片上&a…...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A(10)

目录 竞赛内容 模块A 基础设施设置与安全加固 一、项目和任务描述: 二、服务器环境说明 三、具体任务(每个任务得分以电子答题卡为准) A-1任务一 登录安全加固(Windows, Linux) 1.密码策略(Windows, …...

数据结构-简介

目录 1、简介 2、作用 3、分类 4、实现分类 1、简介 数据结构指的是组织和存储数据的方法。它涉及到一系列的算法和原则,用来设计和实现不同种类的数据类型,如数组、链表、树、图等等。数据结构的目的是在计算机程序中有效地管理和操作数据&#xff…...

python装饰器及其用法

python装饰器是什么? Python装饰器是一种语法结构,它可以让开发者在不修改原函数的基础上,在函数的前后运行额外的代码,这些代码可以达到修改函数行为的目的。Python装饰器的实质是一个可调用的对象,它可以接收函数作为参数…...

Appium自动化测试之启动时跳过初始化设置

Appium每次启动时都会检查和安装Appium Settings,这是完全没有必要的,在首次使用Appium连接设备是Appium Settings便已经安装好。怎样跳过安装Appium Settings呢?之前的做法是修改appium中的源文件中的android-helpers.js实现,如M…...

JavaScript DOM【快速掌握知识点】

目录 DOM简介 获取元素 修改元素 添加和移除元素 事件处理 DOM简介 JavaScript DOM 是指 JavaScript 中的文档对象模型(Document Object Model);它允许 JavaScript 与 HTML 页面交互,使开发者可以通过编程方式动态地修改网页…...

不需要高深技术,只需要Python:创建一个可定制的HTTP服务器!

目录 1、编写服务端代码,命名为httpserver.py文件。 2、编写网页htmlcss文件,命名为index.html和style.css文件。 3、复制htmlcss到服务端py文件同一文件夹下。 4、运行服务端程序。 5、浏览器中输入localhost:8080显示如下: 要编写一个简单的能发布…...

渗透测试常用浏览器插件汇总

1、shodan这个插件可以自动探测当前网站所属的国家、城市,解析IP地址以及开放的服务和端口,包括但不限于FTP、DNS、SSH或者其他服务等,属被动信息搜集中的一种。2、hackbar(收费之后用Max Hackerbar代替)这个插件可用于…...

社区1月月报|OceanBase 4.1 即将发版,哪些功能将会更新?

我们每个月都会和大家展开一次社区进展的汇报沟通会,希望通过更多的互动交流让OceanBase 开源社区更加透明,实现信息共享,也希望能营造更加轻松的氛围,为大家答疑解惑,让大家畅所欲言。如果您对我们的社区有任何建议&a…...

Javascript的API基本内容(二)

一、事件监听 结合 DOM 使用事件时,需要为 DOM 对象添加事件监听,等待事件发生(触发)时,便立即调用一个函数。 addEventListener 是 DOM 对象专门用来添加事件监听的方法,它的两个参数分别为【事件类型】和…...

ChatGPT热度“狂飙”,OceanBase也去找它唠了唠

最近互联网的关键字 非 ChatGPT 莫属 就是这个小东西 集唠嗑、提问、答疑、科普、写作于一体 让我看看哪个孤独的打工人 还没和 ChatGPT 聊上一聊 有人说 ChatGPT 这么智能 或将取代人类的工作 OceanBase 的小编表示不服气 于是,抱着好奇之心试了一试 对 …...

HTTP协议基础知识点扫盲;HTTPS协议及密码学基础

目录 一、Http协议的特性 二、http协议的请求 1.请求行第一行,包含三个信息:请求方式,url,http协议版本 2.请求头浏览器向服务器发送一些状态数据,标识数据等等 3.请求主体请求代理端项服务器端,发送的…...

【golang/go语言】Go语言之反射

本文参考了李文周的博客——Go语言基础之反射。 一、反射初识 1. 什么是反射 在计算机科学中,反射是指计算机程序在运行时(run time)可以访问、检测和修改它本身状态和行为的一种能力。用比喻来说,反射就是程序在运行的时候能够…...

网站诊断方案/学校seo推广培训班

Redhat Linux网卡及IP设置单网卡多IP例:将eht0 添加新地址 eth0:1拷贝/etc/sysconfig/network-scripts/ifcfg-eth0文件为ifcfg-eth0:1修改其中DEVICEeth0:1根据需要修改IP地址(IPADD)和掩码(NETMASK),可以删除NETWORK、BROADCAST、HWADDR重启网络服务#service netwo…...

最低价网站建设/百度网址查询

在Windows中,就是这样.我认为这个问题的答案是我需要创建Windows服务.对于我想做的事情,这似乎很可笑.我只是想在这里为我的经理拍些原型,我不负责产品的生产……事实上,它甚至可能永远都不会被产品化.它可能只是一些研究人员在玩的东西.我有一个CGI脚本,该脚本接收要上传的文件…...

朋友做的网站图片不显示/贵阳网站建设推广

一:标准的JavaWeb工程的工程结构 一个JavaWeb应用,需要有一个目录结构,tomcat才能够对其进行运行; ● tomcat安装目录/webapps/:所有的web应用应该存放在这个目录;在/webapps/目录下,所有的工…...

wordpress位置/营销软文是什么

NEW关注Tech逆向思维视频号最新视频→【做核酸?打疫苗?3分钟假期安全出行攻略】出品|刺猬公社文| 张展编辑 | 石灿星星点灯,照亮前程。在咖啡的舞台上,我们习惯把目光聚焦于那些咖啡明星——门店总数突破53…...

网站关键词做的越多越好吗/南宁seo网站排名优化公司

ApiOperation(value "说明", httpMethod "get", notes "信息")ApiOperation.httpMethod.get改成httpMethod.GET即可...

电商网站有哪些类型/网站seo排名公司

在攻克了围棋以后,人工智能研究者们似乎不约而同地把电子竞技游戏作为了下一个练兵场。雷锋网(公众号:雷锋网)上周报道,在Dota2国际邀请赛TI7上,OpenAI率先展示了自己的成果,在西雅图让AI在1v1比赛中击败了职业选手&am…...