JDBC连接Mysql

ops/2024/9/20 3:56:58/ 标签: mysql, 数据库

一、JDBC实战技术

1.1JDBC概念

JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。JDBC的作用:可以通过java代码操作数据库

在这里插入图片描述

1.2创建连接:步骤

在这里插入图片描述

1.2.1Mysql对应Jar包下载

下载官网
在这里插入图片描述在这里插入图片描述在这里插入图片描述
下载ZIp
在这里插入图片描述

1.2.2Idea中导入Jar包

在这里插入图片描述
在Maven工程中直接配置依赖信息即可
在这里插入图片描述
让项目识别Jar包
在这里插入图片描述
在这里插入图片描述

1.2.3Java代码实现连接

package JavaSE_JDBC;import java.sql.*;/*** @author Pengwei Qu* @Date 2024/8/17 22:05*/
public class Jdbc_mysql01 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//01、注册驱动Class.forName("com.mysql.jdbc.Driver");//02、获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_student", "root", "123456");//03、定义SqlString sql = "SELECT * FROM studinf";//04、获取执行者对象Statement stat = conn.createStatement();//05、执行Sql并获取结果ResultSet rs = stat.executeQuery(sql);//06、处理返回结果while(rs.next()) {System.out.println(rs.getInt("ID") + "\t" + rs.getString("Name"));}//07、关闭资源rs.close();stat.close();conn.close();}
}

在这里插入图片描述

在这里插入图片描述

1.3JDBC中的功能类API

1.3.1DriverManager

(1)作用:

1.加载注册驱动
2.获取连接对象
在这里插入图片描述

(2)注册驱动

下面代码中注册驱动用的是:Class.forName("com.mysql.jdbc.Driver");并不是DriverManager
点开Driver的源码:
在这里插入图片描述

    public static void main(String[] args) throws ClassNotFoundException, SQLException {//01、注册驱动Class.forName("com.mysql.jdbc.Driver");//02、获取连接对象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_student", "root", "123456");//03、定义SqlString sql = "SELECT * FROM studinf";//04、获取执行者对象Statement stat = conn.createStatement();//05、执行Sql并获取结果ResultSet rs = stat.executeQuery(sql);//06、处理返回结果while(rs.next()) {System.out.println(rs.getInt("ID") + "\t" + rs.getString("Name"));}//07、关闭资源rs.close();stat.close();conn.close();}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(3)获取连接对象

在这里插入图片描述在这里插入图片描述

(4)警告解决

当使用高版本的Mysql的时候会提示使用SSL的安全连接,配置好SSL安全连接,就不会出现此警告,但是配置SSL安全连接比较繁琐,而且性能会下降,所以一般不去配置,直接设置不用SSL即可
在这里插入图片描述
在这里插入图片描述

1.3.2Connection 数据库连接对象

(1)作用

在这里插入图片描述

在这里插入图片描述

(2)事务管理

事务回滚:当两条执行命令有任何一条出现问题都会执行事务回滚,将数据库的状态恢复到事务开始前的状态。
在这里插入图片描述

package JavaSE_JDBC;import java.sql.*;/*** @author Pengwei Qu* @Date 2024/8/17 22:05*/
/*Connection作用:获取连接对象/事务管理*/
public class JdbcAPI_Connection {public static void main(String[] args) throws ClassNotFoundException, SQLException {/*如果连接的是本机可简写省略:localhost:3306*/Connection conn = DriverManager.getConnection("jdbc:mysql:///jdbc_student?useSSL=false", "root", "123456");//03、定义SqlString sql = "SELECT * FROM studinf";String sql2 = "update studinf set Age = 31 Where ID=202403";//04、获取执行者对象Statement stat = conn.createStatement();ResultSet rs = null;try {//(1)开启事务conn.setAutoCommit(false);//05、执行Sql并获取结果//事务1:rs = stat.executeQuery(sql);while(rs.next()) {System.out.println(rs.getInt("ID") + "\t" + rs.getString("Name"));}//事务2int count = stat.executeUpdate(sql2);受影响的行数System.out.println(count);//(2)提交事务conn.commit();} catch (Exception e) {//(3)事务回滚conn.rollback();e.printStackTrace();}//07、关闭资源rs.close();stat.close();conn.close();}
}

1.3.3Statement

作用就是执行SQL语句。
在这里插入图片描述在这里插入图片描述

1.3.4ResultSet

(1)作用

对于查询的结果如图中右边表格形式存在,列的初始值是1,可以传入getXX(1)参数来获取第一列,或者传入列名效果一样
在这里插入图片描述

boolean next() throws SQLException;String getString(int columnIndex) throws SQLException;
boolean getBoolean(int columnIndex) throws SQLException;
byte getByte(int columnIndex) throws SQLException;
int getInt(int columnIndex) throws SQLException;
double getDouble(int columnIndex) throws SQLException;
......
String getString(String columnLabel) throws SQLException;
......

(2)用法

在这里插入图片描述

//处理执行结果while(rs.next()) {System.out.println(rs.getInt("ID") + "\t" + rs.getString("Name"));}

(3)案例

在这里插入图片描述
实体类

package JavaSE_JDBC.model;/*** @author Pengwei Qu* @Date 2024/8/18 11:12*/
//实体类
public class jdbc_student {public int getID() {return ID;}public void setID(int ID) {this.ID = ID;}public String getName() {return Name;}public void setName(String name) {Name = name;}public String getGender() {return Gender;}public void setGender(String gender) {Gender = gender;}public int getAge() {return Age;}public void setAge(int age) {Age = age;}//对应于数据库表对象一行数据private int ID;private String Name;private String Gender;private int Age;@Overridepublic String toString() {return "jdbc_student{" +"ID=" + ID +", Name='" + Name + '\'' +", Gender='" + Gender + '\'' +", Age=" + Age +'}';}
}

JDBC连接数据库

package JavaSE_JDBC;import JavaSE_JDBC.model.jdbc_student;import java.sql.*;
import java.util.ArrayList;/*** @author Pengwei Qu* @Date 2024/8/18 10:58*/
//案例
public class jdbcAPI_ResultSet {public static void main(String[] args) throws ClassNotFoundException, SQLException {/*DriverManager*///01注册驱动//Class.forName("com.mysql.jdbc.Driver");//02获取连接对象Connection conn= DriverManager.getConnection("jdbc:mysql:///jdbc_student?useSSL=false", "root", "123456");/*Connection:1.获取执行SQL的对象2.事务管理*///03获取执行对象Statement statement = conn.createStatement();String sql = "SELECT * FROM studinf";/*ResultSet*///04执行Sql并获取结果ResultSet resultSet = statement.executeQuery(sql);//05返回结果处理ArrayList<jdbc_student> arrayList = new ArrayList<>();while (resultSet.next()){//创建实体类对象接收数据jdbc_student jdbcStudent = new jdbc_student();jdbcStudent.setID(resultSet.getInt("ID"));jdbcStudent.setName(resultSet.getString("Name"));jdbcStudent.setGender(resultSet.getString("Gender"));jdbcStudent.setAge(resultSet.getInt("Age"));//将对象存入集合arrayList.add(jdbcStudent);}//打印集合System.out.println(arrayList);//06释放资源conn.close();statement.close();resultSet.close();}
}

在这里插入图片描述

1.3.5PrepareStatement

(1)SQL注入

在这里插入图片描述
正常代码:输入的账号密码正确登陆成功

 /*演示SQL注入问题*/@Testpublic  void Test() throws SQLException {Scanner scanner = new Scanner(System.in);
/*        System.out.println("输入账号");String user = scanner.nextLine();System.out.println("输入密码");String pwd = scanner.nextLine();*/String user="Jack";String pwd="123456";//01获取连接对象Connection conn= DriverManager.getConnection("jdbc:mysql:///jdbc_student?useSSL=false","root","123456");//02获取执行sql对象,执行SqlString Sql="Select * FROM login where User='"+user+"' and Pwd='"+pwd+"'";System.out.println("查看当前拼接好输入的账号信息的Sql语句"+Sql);Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery(Sql);if (resultSet.next()){System.out.println("登录成功");}else {System.out.println("登录失败");}}

在这里插入图片描述

SQL注入问题:由于原来的Sql语句中存在字符串的现象,很容易被修改原来的语义
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

    @Testpublic  void Test2() throws SQLException {Scanner scanner = new Scanner(System.in);
/*        System.out.println("输入账号");String user = scanner.nextLine();System.out.println("输入密码");String pwd = scanner.nextLine();*/String user="Jack";String pwd="'or'1'='1";//01获取连接对象Connection conn= DriverManager.getConnection("jdbc:mysql:///jdbc_student?useSSL=false","root","123456");//02获取执行sql对象,执行SqlString Sql="Select * FROM login where User='"+user+"' and Pwd='"+pwd+"'";System.out.println("查看当前拼接好输入的账号信息的Sql语句"+Sql);Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery(Sql);if (resultSet.next()){System.out.println("登录成功");}else {System.out.println("登录失败");}}

(2)解决SQL注入

在这里插入图片描述

/*03解决Sql注入*/@Testpublic  void Test3() throws SQLException {Scanner scanner = new Scanner(System.in);
/*        System.out.println("输入账号");String user = scanner.nextLine();System.out.println("输入密码");String pwd = scanner.nextLine();*/String user="Jack";String pwd="'or'1'='1";//01获取连接对象Connection conn= DriverManager.getConnection("jdbc:mysql:///jdbc_student?useSSL=false","root","123456");//02获取执行sql对象,执行SqlString Sql="Select * FROM login where User=? and Pwd=?";//System.out.println("查看当前拼接好输入的账号信息的Sql语句"+Sql);PreparedStatement prSt = conn.prepareStatement(Sql);//设置?对应的值prSt.setString(1,user);prSt.setString(2,pwd);//03执行SqlResultSet resultSet = prSt.executeQuery();if (resultSet.next()){System.out.println("登录成功");}else {System.out.println("登录失败");}}

在这里插入图片描述
原理:

//设置?对应的值prSt.setString(1,user);prSt.setString(2,pwd);

在这里插入图片描述

(3)原理

  1. 可以预编译Sql提高性能,但是默认预编译功能是关闭的,需要再url中手动打开

在这里插入图片描述
在这里插入图片描述

1.4数据库连接池


http://www.ppmy.cn/ops/95688.html

相关文章

C语言—函数递归

一、递归概念 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。下面举一个例子&#xff1a; 上述就是⼀个简单的递归程序&#xff0c;只不过上⾯的递归只是为了演⽰递归的基本形式&#xff0c;不是为了解决问题&#xff0c;代码最终…

gitlab设置中文

Centos7&#xff08;最小化&#xff09;系统安装部署私人gitlab远程仓库-CSDN博客 目录 登录gitlab 点击edit profile 点击preferences&#xff08;偏好&#xff0c;爱好&#xff09;&#xff0c; 下滑找到Localization&#xff08;本地&#xff09; 点击language&#xf…

redis五种数据结构以及一些基本操作

Redis 支持五种基本的数据结构&#xff0c;这些数据结构使得 Redis 能够灵活应用于各种场景。 字符串&#xff08;Strings&#xff09; 是 Redis 中最基本的数据类型&#xff0c;可以被理解为简单的 key-value 对&#xff0c;其中 value 是字符串。字符串类型的数据可以是任何…

为什么要有二级指针

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 之前一直疑问为什么要有二级指针&#xff0c;一直没有写这个帖子&#xff0c;今天整理了一下&#xff0c;收获颇丰 二、 2.1 // 增加对二级指针…

数据可视化之旅,从数据洞察到图表呈现,可视化的产品设计

图表作为数据可视化的重要工具&#xff0c;是对原始数据进行深度加工与解读的有效手段&#xff0c;它助力我们洞悉数据背后的真相&#xff0c;使我们能更好地适应这个由数据驱动的世界。无论是工作汇报、项目实施、产品设计、后台界面还是数据大屏展示&#xff0c;图表都扮演着…

【学习笔记】Day 16

一、进度概述 1、ddnet_main 相关代码学习 二、详情 今天的主要内容是逐句分析 ddnet_main 相关代码&#xff0c;暂未完成&#xff0c;具体整理见明天的笔记。 在阅读代码的过程中&#xff0c;发现自己的 Python 相关代码能力还有些弱&#xff0c;很多语法&#xff0c;用法上的…

已解决ArkTS开发webview,html页面中的input和按钮等操作均无响应

在使用 ArkTS 开发 HarmonyOS 应用时&#xff0c;如果遇到 WebView 中的 HTML 页面元素&#xff08;如 input 输入框和 button 按钮&#xff09;无法响应操作的情况&#xff0c;通常与 WebView 的配置或权限设置有关。以下是常见的原因和解决方法。 1. 启用交互权限 确保你的…

Spring boot 使用 jSerialComm 对串口使用发送信息并接收

什么是 jSerialComm&#xff1f; jSerialComm 是一个 Java 库&#xff0c;旨在提供一种独立于平台的方式来访问标准串行端口&#xff0c;而无需外部库、本机代码或任何其他工具。它旨在替代 RxTx 和&#xff08;已弃用的&#xff09;Java Communications API&#xff0c;具有更…

周报_2024/8/18

周报 时间 2024/8/12——2024/8/18 科研进展 修改了et-bert的微调代码&#xff0c;使用et-bert模型在ISCX-botnet数据集的训练集部分做多分类预测&#xff0c;目前效果&#xff1a;5分类任务&#xff0c;acc0.9938 (930082/935928) 下周计划 1.做实验对比et-bert原论文中的数…

c语言中比较特殊的输入函数

目录 一.getchar()函数 1.基本功能 2.使用方法 (1).读取单个字符 (2).读取多个字符&#xff08;直到遇到换行符&#xff09; (3).处理输入中的空白字符 3.返回值 4.应用场景 5.注意事项 二.fgets()函数 1.函数原型 2.工作原理 3.使用示例 (1).从标准输入读取一行…

Redis主从哨兵模式

简介 主从 – 用法 像MySQL一样&#xff0c;redis是支持主从同步的&#xff0c;而且也支持一主多从以及多级从结构。 主从结构&#xff0c;一是为了纯粹的冗余备份&#xff0c;二是为了提升读性能&#xff0c;比如很消耗性能的SORT就可以由从服务器来承担。 redis的主从同步是异…

电脑监控怎样看回放视频?一键解锁电脑监控回放,守护安全不留死角!高效员工电脑监控,回放视频随时查!

你是否曾好奇那些键盘敲击背后的秘密&#xff1f;电脑监控不仅是守护企业安全的隐形盾牌&#xff0c;更是揭秘高效与合规的魔法镜&#xff01;一键解锁安企神监控回放&#xff0c;就像打开时间宝盒&#xff0c;让过去的工作瞬间跃然眼前。无论是精彩瞬间还是潜在风险&#xff0…

ubuntu基于sealos搭建k8s集群,helm3安装配置自动化扩容Prometheus,grafana出图展示,以及动态web搭建

1.项目简介 大方向&#xff1a;k8s云原生方向&#xff0c;运维技术&#xff0c;配置问题解决 解决技术:ubuntu模板机安装&#xff0c;配置远程xshell连接ubuntu&#xff0c;设置静态ip&#xff0c;换ubuntu阿里云源&#xff0c;配置集群间域名解析&#xff0c;解决双IP冲突网…

Ricardo Milos

目录 一、题目 二、思路 三、payload 四、思考与总结 一、题目 <!-- Challenge --> <form id"ricardo" method"GET"><input name"milos" type"text" class"form-control" placeholder"True" va…

AI学习指南深度学习篇-迁移学习与模型微调

AI学习指南深度学习篇-迁移学习与模型微调 在深度学习领域&#xff0c;迁移学习和模型微调是两个非常重要的概念。它们可以帮助我们更好地利用已有的知识和经验&#xff0c;加快模型的训练速度&#xff0c;提高模型的精度。本文将重点探讨迁移学习在CNN中的应用&#xff0c;以…

基于开源MaxKB构建大语言模型的本地知识库系统

基于开源MaxKB构建大语言模型的本地知识库系统 什么是MaxKB MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB的产品命名内涵为“Max Knowledge Base”&#xff0c;为用户提供强大的学习能力和问答响应速度&#xff0c;致力…

【Kubernetes】k8s集群对外服务之Ingress

目录 一.Ingress 概述 1.什么是ingress 2.外部应用访问集群内部服务的方案 3.ingress 组成 4.ingress-Nginx 工作原理 二.部署 nginx-ingress-controller 方式一 方式二 三.总结 一.Ingress 概述 1.什么是ingress service的作用体现在两个方面&#xff0c;①对集群内…

CocoaPods 官宣进入维护模式,不在积极开发新功能,未来将是 Swift Package Manager 的时代

昨天 CocoaPods 官宣现在项目**处于维护模式 **&#xff0c;简单来说&#xff0c;就是 CocoaPods 不会再像以前一样积极投入资源进行开发&#xff0c;这里的维护模式&#xff0c;就是让项目处于「可用」的状态&#xff0c;而此时距离 CocoaPods 的出现&#xff0c;也过去了有 1…

F. Valuable Cards D. Smithing Skill

D题 F题 F题&#xff1a; 因为是连续的且都要选&#xff0c;我们直接从左到右去取每个区间到不合法的情况即可&#xff0c;可以在n1的位置添加一个x来结束区间判断。因为是要乘积为x&#xff0c;那么我们只需要放x的因子进去&#xff0c;不然会超时&#xff0c;同时也可以用v…

Java中腾讯云对象存储COS的优化集成:增加图片临时访问URL

文章目录 优化背景主要优化点1. 封装COS客户端创建逻辑2. 增加图片临时访问URL的功能3. 整体代码结构更清晰 优化后的效果 在最近的项目中&#xff0c;我对使用Java集成腾讯云对象存储&#xff08;COS&#xff09;的代码进行了优化&#xff0c;并增加了一个非常实用的功能——生…