MySQL---JDBC编程

文章目录

  • 什么是JDBC?
  • JDBC的工作原理
  • JDBC的使用
    • 添加驱动
    • 创建数据源DataSource
    • 创建数据库连接Connection
    • 创建操作命令Statement
    • 执行SQL指令
    • 释放资源
  • 通过JDBC演示CRUD
    • 新增
    • 查询(需要增加一步 遍历结果集合的操作)
    • 修改
    • 删除

什么是JDBC?

JDBC:Java Database Connectivity,即Java数据库连接。是一种用于执行SQL语句的Java API,它是Java的数据库连接规范。

API:Application Programming Interface,即应用程序编程接口。它提供了一组类/方法,可以让程序员直接调用。

JDBC是怎么出现的呢?
不同的数据库厂商都会提供各自的一组数据库API供程序员使用,这样就会带来两个问题:1.程序员的学习成本太高,得学习多种API来使用不同的数据库 2. 当哪一天需要给项目更换数据库时,改动非常大,不方便。 而Java是一门可移植性高的语言,它为了解决这些问题就提供了一组统一风格的数据库API,然后要求各个厂商适配这些API,程序员只要掌握这一组API就可以操作各种数据库了,这组API就叫做JDBC

JDBC的工作原理

JDBC为多种关系型数据库提供了统一访问方式,

在这里插入图片描述

JDBC的使用

添加驱动

  1. 从网络获取到驱动资源
  2. 创建一个与src同级的目录,把刚才的驱动jar包拷贝进去

在这里插入图片描述
3. 右击新建好的目录,点击 Add as Library

在这里插入图片描述

创建数据源DataSource

		//1.创建数据源对象DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/learning?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("xu0123.");
  • 解释第一行代码

在这里插入图片描述
结合我们上面讲到的JDBC原理图,DataSource属于JDBC模块,MysqlDataSource属于驱动模块,DataSource是MysqlDataSource的父类,我们在使用JDBC进行数据库操作时都需要通过驱动将JDBC转化为数据库原生API才能让对应的数据库识辨指令。因此,在创建对象的时候也需要创建一个驱动对象。

  • 解释第二行代码

在这里插入图片描述
首先,setURL这个方法存在于MysqlDataSource中在DataSource中没有,所以需要向下转型。那为什么没有呢? 因为DataSource是JDBC中有的类,用来操作使用的数据库。但是,只有客户端—服务器结构的数据库才有URL的说法来定位服务器位置,对于非客户端—服务器结构的数据库不需要使用URL,所以DataSource就不能包含setURL方法。

其次,URL是什么呢? URL就是 唯一资源定位符 。用来定位位置的。

在这里插入图片描述

  • 解释第三行代码

在这里插入图片描述
输入数据库的用户名,默认都是 root 。用来登录数据库。

  • 解释第四行代码

输入数据库的密码,每个用户都有自己的密码。用来登录数据库。

  • 为什么都得向下转型呢? 不能直接创建MysqlDataSource对象吗?
    在这里插入图片描述
    这个写法也是可以的,它没有使用多态。 但是它有一个问题:每个不同的数据库都需要使用不同的驱动,如果不统一向上转型用JDBC里有的DataSource保存,那么在更换数据库的时候所有使用MysqlDataSource的地方都得更换,提高了代码的耦合度!

创建数据库连接Connection

		//2.让代码和数据库服务器建立连接Connection connection = dataSource.getConnection();

在这里插入图片描述

注意在导包的时候使用第一个 不要使用第二个

  1. 还可以使用DriverManager的静态方法来建立数据库连接,但是一般不用!

Connection connection = DriverManager.getConnection(url);

  1. 他们俩的区别是: DriverManager:每次getConnection都需要重新建立连接; DataSource:则是内置了连接池,实现了连接复用,提高了效率;

创建操作命令Statement

		//3.构造要执行的SQL语句Scanner scanner = new Scanner(System.in);System.out.println("请输入要插入的学号");int id = scanner.nextInt();System.out.println("请输入要插入的姓名");String name = scanner.next();String sql = "insert into student values(?,?)";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,id);statement.setString(2,name);

首先,把SQL语句写成一个字符串,并且使用占位符? 代替真正要操作的数据,这是为了避免有人使用SQL注入的方式来破坏你的数据库。

其次,使用PreparedStatement进行预处理SQL语句,得到一个预处理过的SQL语句对象。

然后,通过set方法来填充预处理SQL语句中的占位符?,把真正的数据替换进去。set方法的第一个参数表示替换第几个?,第二个参数表示填充的数据是啥。

执行SQL指令

		//4.执行SQL语句int n = statement.executeUpdate();

执行方法有俩个:
executeUpdate:对应插入、修改、删除语句使用。返回这次SQL操作影响到的行数。
executeQuery:对应查询语句使用。返回查询的结果集。

释放资源

		//5.关闭释放资源statement.close();connection.close();

释放资源的顺序要和申请资源的顺序相反,即:先申请的后释放,后申请的先释放。

通过JDBC演示CRUD

新增

	public static void main(String[] args) throws SQLException {//1.创建数据源对象DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/learning?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("xu0123.");//2.让代码和数据库服务器建立连接Connection connection = dataSource.getConnection();//3.构造要执行的SQL语句Scanner scanner = new Scanner(System.in);System.out.println("请输入要插入的学号");int id = scanner.nextInt();System.out.println("请输入要插入的姓名");String name = scanner.next();String sql = "insert into student values(?,?)";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,id);statement.setString(2,name);//4.执行SQL语句int n = statement.executeUpdate();//5.关闭释放资源statement.close();connection.close();}

查询(需要增加一步 遍历结果集合的操作)

	public static void main(String[] args) throws SQLException {//1.建立数据源DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/learning?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("xu0123.");//2.建立程序和数据库的连接Connection connection = dataSource.getConnection();//3.构造SQL语句String sql = "select* from student where id = ?";Scanner scanner = new Scanner(System.in);System.out.println("请输入要查询的id");int inputId = scanner.nextInt();PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,inputId);//4.执行SQL语句ResultSet resultSet = statement.executeQuery();//5.处理结果集while (resultSet.next()){//每次循环能得到结果集的一行//get方法里的参数代表要得到第几列的数据int id = resultSet.getInt(1);String name = resultSet.getString(2);System.out.println("id:"+ id + "name:" + name);}//6.释放资源resultSet.close();statement.close();connection.close();}

修改

	public static void main(String[] args) throws SQLException {//1.创建数据源DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/learning?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("xu0123.");//2.建立程序和数据库的连接Connection connection = dataSource.getConnection();//3.构造SQL语句String sql = "update student set name = ? where id = ?";Scanner scanner = new Scanner(System.in);System.out.println("请输入要修改成什么名字");String name = scanner.next();System.out.println("请输入要修改的id");int id = scanner.nextInt();PreparedStatement statement = connection.prepareStatement(sql);statement.setString(1,name);statement.setInt(2,id);//4.执行SQLint n = statement.executeUpdate();//5.释放资源statement.close();connection.close();}

删除

	public static void main(String[] args) throws SQLException {//1.创建数据源DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/learning?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("xu0123.");//2.建立程序和数据库的连接Connection connection = dataSource.getConnection();//3.构造SQL语句String sql = "delete from student where id = ?";Scanner scanner = new Scanner(System.in);System.out.println("请输入要删除的id");int id = scanner.nextInt();PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,id);//4.执行SQL语句int n = statement.executeUpdate();//5.释放资源statement.close();connection.close();}

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

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

相关文章

Qt界面实现中英文切换

要实现的效果,是下拉列表切换中文和English实现按钮文本中英文内容切换。 实现步骤: 1.在VS中鼠标对Translation Files文件右击,选择“添加”--->“模块”. 在弹窗的窗口中选择“Qt”--->“Qt Translation File”。 添加Translation_e…

BIOS MBR UEFI GPT详解

先来看下名词 启动方式: BIOS:Basic Input Output System,中文名称"基本输入输出系统"。 UEFI:Unified Extensible Firmware Interface,中文名称"统一的可扩展固件接口"。 Legacy:…

DAY38 动态规划 + 509. 斐波那契数 + 70. 爬楼梯 + 746. 使用最小花费爬楼梯

动态规划理论 动态规划,Dynamic Programming, DP, 如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导…

【Git】HEAD detached from xxx 问题及解决方案

问题背景 最近用git的时候遇到了一个问题,场景是这样的。 我有一个分支main,其中有两个commit A和B,A是最新commit,B是历史commit。我先切到B看了看之前的代码,然后切到A,并进行了一些代码修改&#xff0…

AD教程(一)工程组成及创建

AD教程(一)工程组成及创建 工程组成 原理图库 绘制电阻模型、芯片模型、电容模型等,即将元件模型绘制出来。 原理图 将绘制的原件模型放置到原理图中,然后再添加连接的导线、网络标号。器件和器件之间的连接关系,在原…

SDL事件处理以及线程使用(2)

事件使用 #include <stdio.h> #include <SDL.h>#define FF_QUIT_EVENT (SDL_USEREVENT 1) // 定义自定义事件#undef main int main() {SDL_Window* pWindow NULL;SDL_Init(SDL_INIT_VIDEO);// 创建窗口pWindow SDL_CreateWindow("Event Test Title&…

【方法】如何给PDF文件添加“打开密码”?

PDF文件可以在线浏览&#xff0c;但如果想要给文件添加“打开密码”&#xff0c;就需要用到软件工具&#xff0c;下面小编分享两种常用的工具&#xff0c;小伙伴们可以根据需要选择。 工具一&#xff1a;PDF编辑器 PDF阅读器一般是没有设置密码的功能模块&#xff0c;PDF编辑器…

深入浅出排序算法之希尔排序

目录 1. 原理 2. 代码实现 3. 性能分析 1. 原理 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff0c;把待排序文件中所有记录分成个组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&#xf…

7.scala方法初探

概述 在 scala 中&#xff0c;方法定义在内中&#xff0c;这点类似于 java &#xff0c;此文说明如何定义方法&#xff0c;及方法一些 用法 相关链接 阅读之前&#xff0c;可以先行浏览一下 官方文档 scala相关文章 定义一个参数的方法 这个例子定义了一个名为 double 方法&a…

【Linux】权限完结

个人主页点击直达&#xff1a;小白不是程序媛 系列专栏&#xff1a;Linux被操作记 目录 前言 chown指令 chgrp指令 文件类型 file指令 目录的权限 粘滞位 umask指令 权限总结 前言 上篇文章我们说到对于一个文件所属者和所属组都是同一个人时&#xff0c;使用所属者身…

Linux(Centos7)操作记录

1、nginx -t #Nginx配置文件检查 上述截图代表检查没问题 上述截图检查配置文件配置错误&#xff0c;并提示错误文件位置 2、systemctl restart nginx #重启Nginx 重启Nginx失败 3、systemctl status nginx.service #查看Nginx服务状态 80端口被占导致服务启动失败 4、n…

DVWA-SQL Injection SQL注入

概念 SQL注入&#xff0c;是指将特殊构造的恶意SQL语句插入Web表单的输入或页面请求的查询字符串中&#xff0c;从而欺骗后端Web服务器以执行该恶意SQL语句。 成功的 SQL 注入漏洞可以从数据库中读取敏感数据、修改数据库数据&#xff08;插入/更新/删除&#xff09;、对数据…

Vue实现首页导航和左侧菜单,介绍mock.js并实现登录注册间的跳转,实现左侧栏折叠效果,优化Main.vue组件,使用mock.js生成随机响应数据

目录 1. mockjs 1.1 mockjs介绍 1.2 mockjs使用步骤 1.2.1 安装mockjs依赖 1.2.2 在项目中引入mockjs 1.2.3 创建目录和文件 1.2.4 为每个组件准备模拟数据 1.2.5 测试 1.2.6 前端调试 1.2.7 mockjs生成随机响应数据 1.2.8 根据不同响应&#xff0c;给出不同提示 2…

在 Elasticsearch 中丰富你的 Elasticsearch 文档

作者&#xff1a;David Pilato 对于 Elasticsearch&#xff0c;我们知道联接应该在 “索引时” 而不是查询时完成。 本博文是一系列三篇博文的开始&#xff0c;因为我们可以在 Elastic 生态系统中采取多种方法。 我们将介绍如何在 Elasticsearch 中做到这一点。 下一篇博文将介…

Python深度学习实战-基于class类搭建BP神经网络实现分类任务(附源码和实现效果)

实现功能 上篇文章介绍了用Squential搭建BP神经网络&#xff0c;Squential可以搭建出上层输出就是下层输入的顺序神经网络结构&#xff0c;无法搭出一些带有跳连的非顺序网络结构&#xff0c;这个时候我们可以选择类class搭建封装神经网络结构。 第一步&#xff1a;import ten…

【队列的顺序表示,链式表示】

文章目录 队列的表示和实现相关术语队列的表示链队的表示链队的定义链队的初始化销毁链队列 链队列的入队出栈 队列的表示和实现 相关术语 队列&#xff08;Queue&#xff09;是仅在表尾进行插入操作&#xff0c;在表头进行删除操作的线性表。表尾即an端&#xff0c;称为队尾…

39 :C语言与汇编语言混合编程

目录 编译过程 编译小知识 C语言中函数是如何进行调用的&#xff1f; 寄存器压栈过程 C语言函数调用过程 函数调用过程 函数返回过程 C语言中的调用约定 gcc编译器使用的栈帧布局 ebp是函数调用以及函数返回的核心寄存器 用汇编语言编写Linux应用程序 交互关键字 …

校园物业报修小程序开发笔记一

背景 校园规模和复杂性&#xff1a; 大型学校和校园通常拥有众多的建筑物、设施和设备&#xff0c;需要有效的维护和报修系统&#xff0c;以满足学生、教职员工和校园管理人员的需求。 学生和员工需求&#xff1a; 学生和员工在校园内可能遇到各种维修问题&#xff0c;如故障的…

Windows一键添加命名后缀(文件)

温馨提示&#xff1a;使用前建议先进行测试和原文件备份&#xff0c;避免引起不必要的损失。 &#xff08;一&#xff09;需求描述 之前老板让我给大量文件添加命名前缀&#xff0c;如今为了防患于未然&#xff0c;我决定把添加命名后缀的功能也实现一下&#xff0c;虽然这与添…

uniapp 模仿 Android的Menu菜单栏

下面这张图就是我们要模拟的菜单功能 一、模拟的逻辑 1. 我们使用uni-popup组件&#xff08;记得要用hbuilder X导入该组件&#xff09;uni-app官网 2. 将组件内的菜单自定义样式 二、uniapp代码 写法vue3 <template><view><uni-popup ref"showMenu"…