数据库:JDBC编程

基本概念

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.hqwc.cn/news/256047.html

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

相关文章

C++刷题 -- 链表

C刷题 – 链表 文章目录 C刷题 -- 链表1.删除链表的倒数第 N 个结点2.链表相交3.环形链表 1.删除链表的倒数第 N 个结点 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 快慢指针的应用 fast指针先移动N步,slow依然指向head;然后fa…

Halcon threshold_sub_pix (Operator)

read_image(Image,fabrik) threshold_sub_pix(Image,Border,35) dev_display(Border)Image是输入的原始图像,Threshold是设定的阈值,Width和Height是像素值计算区域的大小,ThresholdedRegion是经过分割后得到的二值化结果。 在对图像进行二值…

Docker-compose容器编排与容器监控

一、Docker-compose 1、概念: Docker-Compose 是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。 2、作用: Docker-Compose可以管理多个Docker容器组成一个应用。需要定义一个yaml格式的配置文件 docker-compose.yml&#…

PostGIS学习教程十一:投影数据

PostGIS学习教程十一:投影数据 地球不是平的,也没有简单的方法把它放在一张平面纸地图上(或电脑屏幕上),所以人们想出了各种巧妙的解决方案(投影)。 每种投影方案都有优点和缺点,一…

LabVIEW使用单板RIO开发远程监控电源信号

LabVIEW使用单板RIO开发远程监控电源信号 设计和构建用于智能电网的本地功耗分析系统,主要服务于领先的电力监控设备设计者和制造商。随着智能电网投资的增加,对于能够有效处理替代电源(如太阳能和风能)间歇性功率水平的技术需求…

揭秘强化学习:Python 实践指南

一、说明 强化学习 (RL) 是机器学习和人工智能 (AI) 的一个子领域,专注于开发能够通过与环境交互进行学习的智能代理。与传统的监督和无监督学习不同,强化学习主要关注动态、顺序环境中的决策。它在人工智能中具有重要意义,特别是在自主代理必…

数字与数学基础问题

关卡名 数字与数学基础问题 我会了✔️ 内容 1.数字里统计的处理技巧 ✔️ 2.必须熟练掌握溢的处理方法 ✔️ 3.掌握进制的处理方法 ✔️ 1. 数字统计专题 统计一下特定场景下的符号,或者数字个数等是一类非常常见的问题 。如果按照正常方式强行统计&#xf…

MX6ULL学习笔记 (八) platform 设备驱动实验

前言: 什么是 Linux 下的 platform 设备驱动 Linux下的字符设备驱动一般都比较简单,只是对IO进行简单的读写操作。但是I2C、SPI、LCD、USB等外设的驱动就比较复杂了,需要考虑到驱动的可重用性,以避免内核中存在大量重复代码&…

uc_13_共享内存_消息队列_IPC对象

1 IPC对象 多个IPC -> 一个IPC对象 -> 一个IPC对象标识符 -> 一个键(整数)(即IPC对象的外部名称) 共享内存、消息队列和信号量,这三种IPC一般被合称为XSI IPC,它们有很多相似之处。 为了实现进程间的数据交换,系统内核会为参…

dockerfile简单实践部署(jenkins,wordpress)

实现部署jenkins的流程 配置java环境,导入jenkins包,运行命令 java -jar jenkins包,这里为了减少进入jenkins的web端安装插件,将插件提前部署到容器内。 制作dockerfile 创建镜像所在的文件夹和Dockerfile文件 mkdir /test cd …

【项目日记(一)】高并发内存池项目介绍

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:项目日记-高并发内存池⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 项目日记 1. 前言2. 什么是高并发内存池…

Textual Inversion

参考博客1:https://www.bilibili.com/read/cv25430752/