JDBC基础,介绍了简单的连接数据库,并通过在后端写SQL语句对数据库进行基本的增删查改操作

news/2024/5/10 18:52:36/文章来源:https://blog.csdn.net/hariya/article/details/129633646

一、JDBC基础

跟数据库连接,并且可以对数据库里面的数据通过SQL语句进行处理等操作。

1.1 JDBC

JDBC是SUN公司的,所以要按照他们的规范来,因为MYSQL和Oracle都是SUN公司的。三个产品都是一个公司的,一般不会出现兼容性不好的问题吧,甚至用他们来配合非常的美。

1.2 JDBC链接数据库需要的参数

  1. 需要明确哪一个数据库,针对于不同的数据库有着不同的驱动去进行连接。

  2. 导包 我们现在项目一般用到的是msyql数据库,导mysql-connector-java-5.1.47.jar包

  3. 对数据库进行连接,需要知道链接的数据库,当前的主机名,ip地址以及端口号等

 jdbcUrl=jdbc:mysql://localhost:3306/连接的数据库名称?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
  1. 链接对应数据库需要使用用户名和密码,使用字符串数据

1.3 连接数据库案例

IDEA连接数据库,这是灰常重要的IDEA需要连接数据库!!!

显示

依次点击,会进入到一个数据库连接界面

现在是

接下来,我们需要回想一下反射当中的获取Class对象的方法:Class.forName(String str)

这个方法有两种用途~

package JDBC;
public class JdbcDemo01 {public static void main(String[] args) throws ClassNotFoundException, SQLException {String JbdcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";String password = "root";/*** 加载驱动,Class.forName(String str)* 通过反射的形式去加载,当前方法有两个用处*  1.获取指定类型的Class*  2.如果对应类型当前Java程序尚未加载,则加载指定类型*  当前的方法只是用了第二个功能*/Class.forName("com.mysql.jdbc.Driver");Connection connection = DriverManager.getConnection(JbdcUrl, username, password);System.out.println(connection);connection.close();}
}

在这里插入图片描述

1.4 JDBC核心API

class java.sql.DriverManager 	Java JDBC 驱动管理类,主要负责驱动注册和数据库连接对象获取常用方法:public static void registerDriver(java.sql.Driver driver);	注册符合 JDBC 规范要求的 Driver 对象,增强当前 Java 程序,可以操作数据库public static java.sql.Connection getConnection(String jdbcUrl, String username, String password)根据提供的 JdbcUrl JDBC 数据库连接规范 URL,对应的数据库用户名和密码获取到数据库 java.sql.Connection 连接对象interface java.sql.Connection Java JDBC 数据库连接对象接口,主要用于获取数据库连接相关的信息,获取数据库 SQL 搬运工对象常用方法:public java.sql.Statement createStatement();通过该数据库连接对象,获取对应当前数据库的 SQL 语句搬运工对象public java.sql.PreparedStatement prepareStatement(String sql);通过该数据库连接对象,根据参数 SQL 语句,获取对应当前数据库的 SQL 语句预处理搬运工对象。interface java.sql.StatmentJava JDBC 规范 数据库搬运工对象,在项目中主要处理的 SQL 语句可以分为两大部分,一部分为更新(insert, update, delete),一部分为查询(select)常用方法:public int executeUpdate(String sql);执行 SQL 语句更新操作,主要可以执行的 SQL 语句类型为 insert,update,delete 操作,返回值是 int 类型,返回值是当前 SQL 语句执行,对应数据表受到影响的行数。Query OK, 1 row affected(5ms)public java.sql.Resultset executeQuery(String sql);执行 SQL 语句查询操作,主要可以执行的 SQL 语句类型为 select 操作,返回值为 java.sql.ResultSet 数据库查询结果集对象。interface java.sql.PreparedStatment extends java.sql.StatmentJava JDBC 规范 数据库【预处理】搬运工对象,在项目中主要处理的 SQL 语句可以分为两大部分,一部分为更新(insert, update, delete),一部分为查询(select)PreparedStatment 可以引入 SQL 语句参数操作。SQL参数为 ? 占位符常用方法:public void setXXX(int index, XXX value);可以给予 SQL 语句参数赋值操作,第一个参数是 SQL 语句参数下标位置(1 开始),给予当前 SQL 语句的实际参数。类型支持任意类型(int, double, float, long, Object, String ...)public int executeUpdate();执行 SQL 语句更新操作,主要可以执行的 SQL 语句类型为 insert,update,delete 操作,返回值是 int 类型,返回值是当前 SQL 语句执行,对应数据表受到影响的行数。Query OK, 1 row affected(5ms)public java.sql.Resultset executeQuery();执行 SQL 语句查询操作,主要可以执行的 SQL 语句类型为 select 操作,返回值为 java.sql.ResultSet 数据库查询结果集对象。interface java.sql.ResultSetJava JDBC 规范,数据库查询结果集对象。可以认为是 select 查询 SQL 语句最终结果表格对应的 Java 类型。常用方法:XXX getXXX(String columnName);根据列名/字段名,获取数据库当前数据行对应的数据信息,类型可以是任意类型,但是要求和数据库存储类型一致。支持(int, String, Long...)XXX getXXX(int columnIndex);	根据列下标,获取数据库当前数据行对应的数据信息,类型可以是任意类型,但是要求和数据库存储类型一致。支持(int, String, Long...)【注意】列下标从 1 开始boolean next();1. 判断当前数据库查询结果集对象是否还有数据行可以解析,如果可以返回 true,否则返回 false2. 提取当前数据行进行解析操作,同时指向下一行数据

1.5 使用JDBC进行初步的增删改查操作

添加操作

package JDBC;
import java.sql.*;
public class JdbcDemo02 {public static void main(String[] args) {String JbdcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";String password = "root";Connection connection = null;Statement statement = null;/*** 加载驱动,Class.forName(String str)* 通过反射的形式去加载,当前方法有两个用处*  1.获取指定类型的Class*  2.如果对应类型当前Java程序尚未加载,则加载指定类型*  当前的方法只是用了第二个功能*/try {//加载JDBC连接数据库的驱动Class.forName("com.mysql.jdbc.Driver");//通过DriverManager连接到数据库 数据库连接对象接口,主要用于获取数据库连接相关的信息connection = DriverManager.getConnection(JbdcUrl, username, password);// 准备SQL插入语句String sql = "insert into gp_01.student(name, age, gender) VALUES ('小申',22,true)";//获取 SQL 语句搬运工对象statement = connection.createStatement();//执行 SQL 语句 返回结果是对数据库影响的行数int rows = statement.executeUpdate(sql);System.out.println("对数据库影响了" + rows + "行");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {//按照先开后关的原则进行关闭资源try {if (statement != null) {statement.close();}if (connection != null){connection.close();}} catch (SQLException throwables) {throwables.printStackTrace();}}}
}

运行结果发现数据已经添加到数据库中~
显示

修改操作

//跟上面的代码除了sql语句外完全一样 
String sql = "update gp_01.student set name = '被修改的小申' where id = 14";

显示

删除操作

String sql = "delete from gp_01.student where id = 14";

显示

查询操作

接下来开始变的不一样了,查询操作!一般我们都是很少动数据库中的数据,大部分都只是对数据库中的数据进行查询操作,但是想查询操作返回影响了几行数据,怪怪的~

查询操作和上面的有所不同,代码如下:

package JDBC;
public class JdbcDemo03 {public static void main(String[] args) {String JbdcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";String password = "root";Connection connection = null;Statement statement = null;ResultSet resultSet = null;/*** 加载驱动,Class.forName(String str)* 通过反射的形式去加载,当前方法有两个用处*  1.获取指定类型的Class*  2.如果对应类型当前Java程序尚未加载,则加载指定类型*  当前的方法只是用了第二个功能*/try {//加载JDBC连接数据库的驱动Class.forName("com.mysql.jdbc.Driver");//通过DriverManager连接到数据库 数据库连接对象接口,主要用于获取数据库连接相关的信息connection = DriverManager.getConnection(JbdcUrl, username, password);// 准备SQL插入语句String sql = "select * from gp_01.student where id = 1";//获取 SQL 语句搬运工对象statement =   connection.createStatement();//执行 SQL 语句 返回结果是ResultSet数据类型,里面存储了数据resultSet = statement.executeQuery(sql);while (resultSet.next()){int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");int gender = resultSet.getInt("gender");System.out.println(id);System.out.println(name);System.out.println(age);System.out.println(gender);}} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {//按照先开后关的原则进行关闭资源try {if (resultSet != null){resultSet.close();}if (statement != null) {statement.close();}if (connection != null){connection.close();}} catch (SQLException throwables) {throwables.printStackTrace();}}}
}

显示

可以看出查询的代码和增删改的代码是不同的~~

public void testSelectAll() {// 1. 准备数据库连接必要的参数String jdbcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";String password = "root";Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection(jdbcUrl, username, password);statement = connection.createStatement();String sql = "select * from student";resultSet = statement.executeQuery(sql);ArrayList<Student> list = new ArrayList<>();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");boolean gender = resultSet.getBoolean("gender");list.add(new Student(id, name, age, gender));}list.forEach(System.out::println);} catch (ClassNotFoundException | SQLException e) {throw new RuntimeException(e);} finally {try {if (resultSet != null) {resultSet.close();}if (statement != null) {statement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}
}

1.6 包含有未知数的SQL增删改查操作

package JDBC;
/*** @Description* @Author zpd* @Date 2023/3/17*/
public class JdbcDemo04 {public static void main(String[] args) {// 1. 准备数据库连接必要的参数String jdbcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";String password = "root";Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection(jdbcUrl, username, password);/*PreparedStatement   操作流程1. 准备 SQL 语句,可以使用 ? 占位参数2. 通过数据库连接对象 预处理 SQL 语句,得到 PreparedStatement 对象3. PreparedStatement 对象 赋值参数操作4. 执行 SQL 语句得到对应结果*/String sql = "select * from gp_01.student where id = ?";statement = connection.prepareStatement(sql);//给sql第一个未知数据赋值为1statement.setString(1, "1");resultSet = statement.executeQuery();if (resultSet.next()) {System.out.println("PreparedStatement 操作登陆成功");} else {System.err.println("PreparedStatement 操作登陆失败");}} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {try {if (resultSet != null) {resultSet.close();}if (statement != null) {statement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

请添加图片描述

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

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

相关文章

智能手机2023:高端前攻、中端后守

配图来自Canva可画 沉寂许久的行业&#xff0c;终于在疫情之后迎来了久违的舞台&#xff0c;MWC线下展会三年来第一次召开。2月27日至3月2日&#xff0c;2023年世界移动通讯大会如期在巴塞罗那举行&#xff0c;国内一众手机厂商们纷纷登台亮相、大秀肌肉。与以往相比&#xff…

Rocketmq-Mqtt 开发实例

一、RocketMQ MQTT 概览传统的消息队列MQ主要应用于服务&#xff08;端&#xff09;之间的消息通信&#xff0c;比如电商领域的交易消息、支付消息、物流消息等等。然而在消息这个大类下&#xff0c;还有一个非常重要且常见的消息领域&#xff0c;即IoT类终端设备消息。近些年&…

Tomcat源码:启动类Bootstrap与Catalina的加载

参考资料&#xff1a; 《Tomcat源码解析系列&#xff08;一&#xff09;Bootstrap》 《Tomcat源码解析系列&#xff08;二&#xff09;Catalina》 《Tomcat - 启动过程&#xff1a;初始化和启动流程》 《Tomcat - 启动过程:类加载机制详解》 《Tomcat - 启动过程:Catalina…

不用科学上网,免费的GPT-4 IDE工具Cursor保姆级使用教程

大家好&#xff0c;我是可乐。 过去的一周&#xff0c;真是疯狂的一周。 GPT-4 震撼发布&#xff0c;拥有了多模态能力&#xff0c;不仅能和GPT3一样进行文字对话&#xff0c;还能读懂图片&#xff1b; 然后斯坦福大学发布 Alpaca 7 B&#xff0c;性能匹敌 GPT-3.5&#xff…

易基因:PIWI/piRNA在人癌症中的表观遗传调控机制(DNA甲基化+m6A+组蛋白修饰)|综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2023年03月07日&#xff0c;南华大学衡阳医学院李二毛团队在《Molecular Cancer》杂志发表了题为“The epigenetic regulatory mechanism of PIWI/piRNAs in human cancers”的综述文章&am…

数据处理时代,绕不开的数据分析

数据分析的出现是因为人类难以理解海量数据所呈现出来的信息&#xff0c;不能从中找到相应的规律来对现实中的事物进行对应&#xff0c;我们都知道数据有很高的价值&#xff0c;但不能利用的价值&#xff0c;没有任何意义。 为了解决这一问题&#xff0c;数据分析在长期的数据…

Golang每日一练(leetDay0012)

目录 34. 查找元素首末位置 Find-first-and-last-position-of-element-in-sorted-array &#x1f31f;&#x1f31f; 35. 搜索插入位置 Search Insert Position &#x1f31f; 36. 有效的数独 Valid Sudoku &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 …

[vue问题]Uncaught SyntaxError: Not available in legacy mode

[vue问题]Uncaught SyntaxError: Not available in legacy mode问题描述问题分析解决方案直接回退vue-i18n的版本解决错误提示的问题问题描述 Uncaught SyntaxError: Not available in legacy modeat Object.createCompileError (message-compiler.cjs.js?af13:58:1)at creat…

GTC 2023 | 「皮衣刀客」黄仁勋畅谈 AI Top 5,科学计算、生成式 AI、Omniverse 榜上有名

内容一览&#xff1a;北京时间 3 月 21 日 23:00&#xff0c;英伟达创始人兼 CEO 黄仁勋在 GTC 2023 上发表主题演讲&#xff0c;介绍了生成式 AI、元宇宙、大语言模型、云计算等领域最新进展。 关键词&#xff1a;英伟达 黄仁勋 GTC 2023 「Don’t Miss This Defining Momen…

辉煌优配|沪指震荡涨0.25%,建筑、家居等板块拉升,数字经济概念活跃

22日早盘&#xff0c;两市股指盘中强势上扬&#xff0c;接近午盘涨幅收窄&#xff1b;两市半日成交近6000亿元&#xff0c;北向资金小幅净流出。 到午间收盘&#xff0c;沪指涨0.25%报3263.85点&#xff0c;深成指涨0.39%&#xff0c;创业板指微跌0.01%&#xff0c;两市合计成交…

html(1)

创建html项目 新建html项目&#xff0c;用记事本打开&#xff1a; 只需要浏览器就可以执行里面的代码&#xff0c;不需要安装额外的运行环境&#xff08;例如JDK&#xff09; html不需要编译&#xff0c;浏览器读取后就可以执行 上述hello world在文件是如下代码&#xff1a…

静态版通讯录的实现(详解)

前言&#xff1a;内容包括三个模块&#xff1a;测试通讯录模块&#xff0c;声明模块&#xff0c;通讯录实现模块 实现一个通讯录&#xff1a; 1 可以存放100个人的信息 每个人的信息&#xff1a; 名字 性别 年龄 电话 地址 2 增加联系人信息 删除联系人信息 查找联系人信息…

windows无盘启动技术开发之传统BIOS(Legacy BIOS)引导程序开发之二

by fanxiushu 2023-03-21 转载或引用请注明原始作者&#xff0c;接上文&#xff0c;这篇文章其实主要就是讲述上文中 Int13HookEntry 这个C函数的实现过程&#xff0c;看起来就一个函数&#xff0c;可实现起来一点也不轻松。首先得准备编译环境&#xff0c;因为是16位程序&…

LeetCode岛屿问题通用解决模板

文章目录前言第一题&#xff1a;求岛屿的周长模板整理遍历方向确定边界重复遍历问题处理模板解第一题第二题&#xff1a;求岛屿数量第三题&#xff1a;岛屿的最大面积第四题&#xff1a;统计子岛屿第五题&#xff1a;统计封闭岛屿的数目第六题&#xff1a;最大人工岛总结前言 …

04.hadoopHDFS

win java访问hadoop //复制文件夹,配置环境变量//配置HADOOP_HOME为我们的路径 ,hadoop-3.3.0 ,记得JAVA_HOME不要带有空格,!!!默认java安装环境有空格C:\Program Files//要在cmd hadoop -fs 查看是否配置成功//%HADOOP_HOME%\bin到path//maven添加依赖hadoop3.1.0//创建目录Be…

常见的CMS后台getshell姿势总结

目录 WordPress dedecms aspcms 南方数据企业系统 phpmyadmin日志 pageadmin 无忧企业系统 WordPress 默认后台登录地址 /wp-login.php /wp-admin 登录后在外观的编辑里面找一个模板&#xff0c;我们在404模板 (404.php)里面写入一句话后门 可以蚁剑连接 上传一个压缩…

自定义类型的超详细讲解ᵎᵎ了解结构体和位段这一篇文章就够了ᵎ

目录 1.结构体的声明 1.1基础知识 1.2结构体的声明 1.3结构体的特殊声明 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐 那对齐这么浪费空间&#xff0c;为什么要对齐 1.7修改默认对齐数 1.8结构体传参 2.位段 2.1什么是位段 2.2位段的内存分配…

web前端框架——Vue的特性

目录 前言&#xff1a; 一.vue 二.特性 1.轻量级 2.数据绑定 3.指令 4.插件 三.比较Angular 、React 、Vue 框架之间的比较 1. Angular Angular的优点&#xff1a; 2. React React 的优点&#xff1a; 3.vue 3.Vue的优点&#xff1a; 前言&#xff1a; 本篇文章…

QT开发笔记(多媒体)

多媒体 多媒体&#xff08;Multimedia&#xff09;是多种媒体的综合&#xff0c;一般包括文本&#xff0c;声音和图像等多种媒体形式。 在计算机系统中&#xff0c;多媒体指组合两种或两种以上媒体的一种人机交互式信息交流和传播媒体。 使用的媒体包括文字、图片、照片、声音…

头歌c语言实训项目-函数(2)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 第1关&#xff1a;模拟投掷骰子游戏: 题目&#xff1a; 代码思路&#xff1a; 代码表示&#xff1a; 第…