数据库:JDBC编程

 专栏目录

MySQL基本操作-CSDN博客

MySQL基本操作-CSDN博客

数据库的增删查改(CRUD)基础版-CSDN博客

数据库增删改查(CRUD)进阶版-CSDN博客

数据库的索引-CSDN博客

基本概念

JDBC编程就是通过Java代码来操作数据库

api

数据库是一个类别:MySQL,Oracle,sql server,sqlite

代码操作数据库的前提:数据库提供api,我们要调用api才能完成操作

(api:application programming interface 应用程序调用接口,就是一些实现好的类和方法

(只要是基于某个东西来编程,就需要这个东西提供api)

如果某个东西提供的api特别多,就会把这个东西叫做SDK

我们平时说的JDK就是JAVA SDK(Java开发工具包)

每个数据库软件的api不同,但是Java把这些api重新封装,形成一套api的标准,程序员就不需要再关心数据库的api差异了😊


安装JDBC

1)引入mysql的jdbc驱动包

这种驱动包属于第三方库,JDK里面是没有的

我们可以到Java世界里的中央仓库里面获取Maven 存储库:搜索/浏览/探索 (mvnrepository.com)

第一个是更高版本的驱动包,第二个是低版本的

我们选择第二个就好了

因为我的MySQL服务器用的是5的,所以这里也要用5系列的驱动包

下载下来的是.jar的文件,本质上是一个压缩包,主要是存放Java程序编译文件.class文件

左边的.pom文件是maven项目的配置文件,不用理他

2)把jar包引入到项目中

随便在项目中创建一个目录,把jar包拷贝进去

再点击add as library就好了


编写JDBC代码

第一步

数据库是服务器,服务器可能在你的主机上,也可能在其他主机上,所以我们要明确服务器的位置

一般都是用 ip地址+端口号+数据库名 来定位的

ip地址是用来描述一个主机在网路上的位置,往往由一串数字构成

一般用环回ip:127.0.0.1 (表示主机)来进行举例

端口号:区分不同的服务程序,相当于快递包裹里的手机号(MySQL默认端口号3306)

        //1.创建数据源,数据源描述了你要操作的数据库在哪里DataSource dataSource = new MysqlDataSource();

DataSource是JDBC提供的接口,MysqlDataSource是MySQL驱动包提供的

实现类提供的方法

当然下面这种写法也没问题

但是业内一般用第一种方法,原因:

拓展:低耦合,高内聚

耦合:两个东西之间的关联关系,关联越紧密,耦合就越高

代码耦合高了,后面改某个代码前面的代码就容易出bug

内聚:把有关系的代码放到一起,不要放的东一处西一处的

低内聚:某个功能的代码会散落在各个地方

高内聚:把有关联的代码放到一起

返回我们刚刚的代码

这里的url可以不用记,password就是你数据库的密码

        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/javasql?characterEncoding=tuf8&&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("1234");

 第二步

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

 这里的建立连接是抽象连接,通信双方保存各自的信息而已

注意:这里的Connection要用第一个

 


第三步

        //3.构造一个sql,需要把sql转成String对象String sql = "insert into student values(1,'张三')";PreparedStatement statement = connection.prepareStatement(sql);

PreparedStatement:prepared表示预处理过的,已经解析的sql语句

通过控制台写sql,是先把sql发给服务器,服务器解析并执行的

statement也差不多

但是PreparedStatement可以在客户端这边先提前把sql解析好,把解析后的结果发给服务器,服务器的开销就大幅度降低了


 第四步

        //4.把构造好的sql发送给服务器执行int n = statement.executeUpdate();System.out.println("n= " + n);

此时代码会构造一个网络请求,发送给mysql服务器,这个代码相当于扮演了mysql客户端的角色

等待服务器的相应数据,把得到的相应最终显示在控制台上


第五步

        //5.释放必要的资源statement.close();connection.close();

这两个对象内部有一些计算机的重要软/硬件资源,需要释放

释放的顺序与创建的顺序相反


程序执行之后我们就能在我们学生表里看见变化了

而itellij里面打印的

表示有1行受到影响

整个的代码

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestJDBC {public static void main(String[] args) throws SQLException {//1.创建数据源,数据源描述了你要操作的数据库在哪里DataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/javasql?characterEncoding=utf8&&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("1234");//2.和数据库服务器建立连接Connection connection = dataSource.getConnection();//3.构造一个sql,需要把sql转成String对象String sql = "insert into student values(2,'李四')";PreparedStatement statement = connection.prepareStatement(sql);//4.把构造好的sql发送给服务器执行int n = statement.executeUpdate();System.out.println("n= " + n);//5.释放必要的资源statement.close();connection.close();}
}

修改代码 

上面的代码里的sql指令是写死的,也就是说,要想插入其他数据就需要修改代码,重新编译!

一般程序员写的代码要打包发给用户,每个用户要修改需求就要你修改代码里的sql语句,这样会很麻烦

所以我们要让用户输入信息

        Scanner scanner = new Scanner(System.in);System.out.println("请输入学号:");int id = scanner.nextInt();System.out.println("请输入姓名:");String name = scanner.next();//3.构造一个sql,需要把sql转成String对象String sql = "insert into student values(" + id + ",'" + name + "')";

这种字符串拼接很丑陋,而且有sql注入攻击的风险

如果用户不好好输入name,他直接给你输入什么); drop database....

那完蛋了你的数据库可能就被端了

我们换种写法

这里的?作为占位符,然后用下面的setInt和setString方法分别把这两个?号的位置填上

这样写比较安全


插入,修改,删除的jdbc代码其实完全一样

查询的就不太一样,因为查询会有一个返回的结果集合(临时表)

查询的代码

前面的操作差不多,到了第四步执行,我们用类似迭代器遍历的方式遍历每行数据

这里的ResultSet就是结果集合,代表查询返回的临时表

这个循环来遍历这张表,想象初始情况下,光标指向第一行上的第一个位置,每次调用next(),光标就会往下走一行

整个执行代码

        //执行sqlResultSet resultSet = statement.executeQuery();while(resultSet.next()){//获取”id“这一列的数值int id = resultSet.getInt("id");//获取”name“这一列的数值String name = resultSet.getString("name");System.out.println("id: "+id);System.out.println("name: "+name);}

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

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

相关文章

深入理解网络 I/O 多路复用:SELECT、POLL

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

工业4G路由器助力轨道交通城市地铁实现数字化转型

随着城市的科技不断发展,地铁系统的智能化程度也在不断提高。地铁闸机的网络部署已经成为地铁建设中必不可少环节。而4G路由器作为地铁闸机的网络通讯设备,助力轨道交通地铁闸机实现数字化转型。 工业4G路由器在地铁系统光纤宽带网络遇到故障或其他问题…

CGAL的推进前表面重建

从非结构化点云进行的曲面重建相当于生成一个合理的曲面,该曲面很好地近似于输入点。由于可能生成许多曲面,因此此问题不适合解决。已经提出了一系列广泛的方法来解决这个问题。其中包括变分方法、张量表决、隐式曲面和Delaunay三角剖分。 对于基于Delau…

gRPC三种流和消息格式

文章目录 消息格式RPC流长度前缀的消息分帧请求消息响应信息 三种流一元RPC服务流RPC客户流RPC双工流RPC 代码仓库 消息格式 RPC流 服务端实现protocol buffer定义的方法,客户端保留一个存根,提供服务端方法的抽象,客户端只需要调用存根中的…

【dig命令查询方法】

dig(Domain Information Groper)是一个用于查询DNS(域名系统)的命令行工具,它可以帮助您获取关于域名的各种信息,如IP地址、MX记录、NS记录等。下面是dig的详细使用教程。 基本语法: dig [ser…

文件被删除了怎么恢复?3个宝藏方法,快来get!

“我是一个学生党,期末的一些资料保存在电脑上,但是不知道是不是被我误删了,导致很多文件都找不到了。文件被删除了怎么恢复呢?大家帮我出出主意吧!” 对于经常在电脑上保存各种文件的用户来说,文件误删除是…

IPC之五:使用 System V 信号量集解决经典的‘哲学家就餐问题‘

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍信号量集(Semaphore Sets),尽管信号量集被认为是 IPC 的一种方式,但实际上通常把信号量集用于进程间同步或者资源访问互斥,信号量集和共享内存(Shared …

系列学习前端之第 2 章:一文精通 HTML

全套学习 HTMLCSSJavaScript 代码和笔记请下载网盘的资料: 链接: https://pan.baidu.com/s/1-vY2anBdrsBSwDZfALZ6FQ 提取码: 6666 HTML 全称:HyperText Markup Language(超文本标记语言) 1、 HTML 标签 1. 标签又称元素&#…

PR剪辑视频素材|真实胶片特效转场PR项目模板文件

Premiere转场模板,8个真实胶片特效转场PR项目模板视频素材。可以编辑和自定义媒体占位符。在视频的开头、中间和结尾使用。包含视频教程。 适用软件:PR2023及更新版本 | 分辨率:38402160 (4K) | 文件大小:16.43MB | 无需插件 来自…

AI并行计算:CUDA和ROCm

1 介绍 1.1 CUDA CUDA(Compute Unified Device Architecture)是Nvidia于2006年推出的一套通用并行计算架构,旨在解决在GPU上的并行计算问题。其易用性和便捷性能够方便开发者方便的进行GPU编程,充分利用GPU的并行能力&#xff0…

如何使用ArcGIS Pro制作类似CAD的尺寸注记

经常使用CAD制图的朋友应该比较熟悉CAD内的尺寸标注,这样的标注看起来直观且简洁,那么在ArcGIS Pro内能不能制作这样尺寸注记呢,答案是肯定的,这里为大家介绍一下制作的方法,希望能对你有所帮助。 数据来源 本教程所…

OpenGL ES 帧缓冲对象介绍和使用示例

一、介绍 1. 帧缓冲对象 默认情况下,OpenGL渲染的目标是屏幕,但如果你不想直接渲染到屏幕上,还需要对渲染结果做某些后期处理、渲染到纹理、阴影映射等操作,便可以使用帧缓冲对象,实现离屏渲染。 帧缓冲对象&#x…

JSON字符串转泛型对象

JSON字符串转泛型对象 以下问题只仅限于博主自身遇到&#xff0c;不代表绝对出现问题 相关类展示&#xff1a; 参数基类 public class BaseParams { }基类 public abstract class AbstractPush<Params extends BaseParams> {protected abstract void execute(Params…

怎么选护眼灯?考公必备护眼灯推荐

随着现在的近视问题受到越来越广泛的关注&#xff0c;各种护眼产品的需求量也一直在快速增加&#xff0c;其中最受广大家长、学生党欢迎的还是护眼台灯。因为专业的护眼台灯不仅可以补充我们夜晚工作、学习时不足的光亮&#xff0c;避免眼睛长时间处于昏暗的环境导致疲劳。 而…

018 OpenCV 人脸检测

目录 一、环境 二、分类器原理 2.1、概述 2.2、工作原理 三、人脸检测代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、分类器原理 CascadeClassifier是OpenCV&#xff08;开源计算机视觉库&#xff09;中的一个强大的类…

day01十五模拟第二期

2 2——608#include <stdio.h> #include <math.h>int main(int argc, const char * argv[]) {int res1;for(int i1;i<2023;i){res(res*2)%1000;}printf("%d",res );return 0; }3 4-----4169 #include <stdio.h> #include<string.h> #inc…

C语言——指针(五)

&#x1f4dd;前言&#xff1a; 上篇文章C语言——指针&#xff08;四&#xff09;更加深入的介绍了不同类型指针的特点&#xff0c;这篇文章主要想记录一下函数与指针的结合运用以及const和assert关于指针的用法&#xff1a; 1&#xff0c;函数与指针 2&#xff0c;const 3&am…

3.PyTorch——常用神经网络层

import numpy as np import pandas as pd import torch as t from PIL import Image from torchvision.transforms import ToTensor, ToPILImaget.__version__2.1.13.1 图像相关层 图像相关层主要包括卷积层&#xff08;Conv&#xff09;、池化层&#xff08;Pool&#xff09;…

node.js和浏览器之间的区别

node.js是什么 Node.js是一种基于Chrome V8引擎的JavaScript运行环境&#xff0c;可以在服务器端运行JavaScript代码 Node.js 在浏览器之外运行 V8 JavaScript 引擎。 这使得 Node.js 非常高效。 浏览器如何运行js代码 nodejs运行环境 在浏览器中&#xff0c;大部分时间你所…

Linux系统调试课:USB 常用调试方法

文章目录 一、USB调试工具有哪些二、USB相关节点2.1、USB枚举成功标志2.2、USB speed查询2.3、USB 查询PID、VID沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要 介绍 USB 常用调试方法。 一、USB调试工具有哪些