数据库:JDBC编程

news2024/12/26 10:42:50

 专栏目录

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(),光标就会往下走一行

整个执行代码

        //执行sql
        ResultSet 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.coloradmin.cn/o/1292893.html

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

相关文章

基于 Flink CDC 构建 MySQL 的 Streaming ETL to MySQL

简介 CDC 的全称是 Change Data Capture ,在广义的概念上,只要是能捕获数据变更的技术,我们都可以称之为 CDC 。目前通常描述的 CDC 技术主要面向数据库的变更,是一种用于捕获数据库中数据变更的技术。CDC 技术的应用场景非常广泛…

【学习记录】从0开始的Linux学习之旅——字符型设备驱动及应用

一、概述 Linux操作系统通常是基于Linux内核,并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程,具有强大的网络功能和良好的兼容性。基于前面应用与驱动的开发学习,本文主要讲述如何在linux系统上把应用与驱动…

随笔-这都是命吗

我与鹏哥、小付有个小群,前几天,鹏哥在群里发了一个图,是他那个城市准备扶持的高新产业,有元宇宙、量子信息、生物制药、人工智能什么的。 先前的时候鹏哥给我说过,当地准备了六百多亩地,准备发展高新产业…

Labelme2Yolo labelme格式的json标注转yolo格式txt

该工作适用于目标检测工作。 由于labelme标注出的文件是如下图的单个json文件格式,不符合yolo的训练格式,需要转格式。 观察发现labelme标注的json文件中有imageData,还挺大的,查阅后得知是base64后的图片数据,也就是…

多表操作、其他字段和字段参数、django与ajax(回顾)

多表操作 1 基于对象的跨表查 子查询----》执行了两句sql,没有连表操作 2 基于双下滑线的连表查 一次查询,连表操作 3 正向和反向 放在ForeignKey,OneToOneField,ManyToManyField的-related_namebooks:双下滑线连表查询,反向…

深圳锐杰金融:用金融力量守护社区健康

深圳市锐杰金融投资有限公司,作为中国经济特区的中流砥柱,近年来以其杰出的金融成绩和坚定的社会责任立场引人注目。然而,这并非一个寻常的金融机构。锐杰金融正在用自己的方式诠释企业责任和慈善精神,通过一系列独特的慈善项目&a…

定兴县第三实验小学开展“宪法宣传周”系列活动

2023年12月4日是我国第十个国家宪法日,我校集中深入学习宣传宪法,弘扬宪法精神,维护宪法权威,开展“宪法宣传周”系列活动。 宪法主题升旗仪式 五(6)班薛谨熙同学以《学法懂法 与我同行》为主题做国旗下讲…

【开源】基于JAVA语言的APK检测管理系统

项目编号: S 038 ,文末获取源码。 \color{red}{项目编号:S038,文末获取源码。} 项目编号:S038,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软…

低代码你需要了解一下

低代码的概念可以追溯到1980年代,当时IBM的快速应用程序开发工具(RAD)被冠以新的名称——低代码,由此,低代码的概念首次面向大众。然而,在近40年的历程中,低代码发展经历了两个阶段:…

Ray构建GPU隔离的机器学习平台

Ray框架介绍 Ray 是一个开源分布式计算框架,在 机器学习基础设施中发挥着至关重要的作用。Ray 促进分布式机器学习训练,使机器学习从业者能够有效利用多个 GPU 的能力。 Ray可以在集群上分布式地运行任务,并且可以指定任务运行时需要使用的GPU数量。Ray可与Nvidia-docker等…

Adobe系列软件:创意之旅的得力助手

在数字创意领域,Adobe系列软件一直以其卓越的性能和广泛的应用而备受瞩目。从图像处理、视频编辑到音频编辑,从网页开发到排版设计,这些软件都提供了强大的功能和工具,帮助用户实现他们的创意。 让我们详细介绍这些软件的作用&…

文件管理:每个文件夹只移入1个文件要怎样操作?批量移动文件技巧

在文件管理过程中,有时要将多个文件分别移动到不同的文件夹中,每个文件夹只包含一个文件。这样的需求可能出现在许多场景中,比如整理文件、备份资料或者进行特定的项目处理。如果每个手动去移动文件就会出现丢失的情况,以及太过耗…

【设计模式-3.1】结构型——外观模式

说明:本文介绍设计模式中结构型设计模式中的,外观模式; 亲手下厨还是点外卖? 外观模式属于结构型的设计模式,关注类或对象的组合,所呈现出来的结构。以吃饭为例,在介绍外观模式之前&#xff0…

谷歌ARCore认证,什么是ARCore认证

一、谷歌ARCore认证介绍 谷歌ARCore 是 Google 推出的用于打造增强现实体验的平台,利用移动设备的传感器以及相机通过不同的 API 让您的手机能够感知其所处环境、了解世界并进行信息交互。设备要使用谷歌的ARCore功能,需要进行测试并通过认证后方可预载或使用Googl…

Python编程技巧 – 异常处理

Python编程技巧 – 异常处理 Python Programming Skills – Exception Handling By JacksonML 每一个程序都未必是健壮的,有时候很脆弱。只有在人的理想思维状况下,返回的结果才是正确的,如意的。 1. 错误发生及异常输出 面对种种编写有疏…

人工智能_机器学习061_KKT条件公式理解_原理深度解析_松弛变量_不等式约束---人工智能工作笔记0101

然后我们再来看,前面我们,拉格朗日乘子法,把带有条件的,问题,优化成了等式问题,从而, 构建拉格朗日乘子公式,进行实现了求解,但是在现实生活中,往往也有,很多不等式问题. 比如上面的这个,就是要求是h(x)<=0的情况下,函数f(x)的最小值. 可以看到,这个带有一个不等式的条件,…

揭秘C语言结构体:通往内存对齐的视觉之旅

揭秘C语言结构体&#xff1a;通往内存对齐的视觉之旅 引言 在C语言的编程旅程中&#xff0c;结构体&#xff08;structs&#xff09;是一个关键而强大的概念。结构体不仅允许我们组织和存储不同类型的数据&#xff0c;而且通过深入了解内存对齐&#xff0c;我们可以更好地优化…

ZKP Understanding Nova (2) Relaxed R1CS

Understanding Nova Kothapalli, Abhiram, Srinath Setty, and Ioanna Tzialla. “Nova: Recursive zero-knowledge arguments from folding schemes.” Annual International Cryptology Conference. Cham: Springer Nature Switzerland, 2022. Nova: Paper Code 2. Unders…

micro_ros_setup包镜像及部分注释(我觉得此包支持很有限)

GitHub - micro-ROS/micro_ros_setup at humble README.md This ROS 2 package(这是一个包) is the entry point for building micro-ROS apps for different embedded platforms. Supported platforms Standalone build system toolsDependenciesQuick startBuilding Creati…

QML与C++之间结构体输出

1.定义带有结构体的头文件TrackClass.h #ifndef TRACKCLASS_H #define TRACKCLASS_H#include <QGuiApplication> #include "QObject" #include <QVector>struct TrackPoint {Q_GADGETQ_PROPERTY(qreal lat MEMBER lat)Q_PROPERTY(qreal lon MEMBER lon)…