MySQL:JDBC编程

news2024/12/21 10:06:37

       在实际开发中,SQL很少是手动输入的,绝大多数的SQL都是通过代码,自动执行的。这个时候就需要其他编程语言来操作数据库服务器。

       自己写一个数据库客户端是非常容易的,各种数据库本身就提供了一系列的API,但是自己写一个数据库服务器就非常困难了。Java中,就出现了JDBC。

       JDBC就是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。

JDBC的作用:可以通过java代码操作数据库,同时各种数据库厂商,都提供了能够适应JDBC相关的驱动包。只要掌握了这套API,无论操作哪个数据库,操作的代码都是基本相同的。JDBC屏蔽了不同数据库原生API之间的差异,使用同一套API接口来规范了所有数据库的编程操作。

目录

JDBC的使用

驱动包查找

导入jar包

编写JDBC代码

创建数据源

和数据库建立连接

构造SQL语句

执行SQL语句

断开连接

SQL动态语句

查找

总结


JDBC的使用

驱动包查找

先能够安装对应数据库的驱动包,以我使用的mysql 5.7为例,通过Maven Repository: Search/Browse/Explore (mvnrepository.com)来找到所需要的驱动包。

因为我的mysql版本是5.7,所以我们选择任何5.1的版本都可以

 

 我们下载的是一个jar文件,jar是一个java格式的压缩包,类似于.rar .zip一样。

.jar中有很多的.class文件,.java编译生成的二进制字节码文件,同时我们写一个程序发布出去,主要就是通过.jar的形式。

导入jar包

(1)在项目中创建目录,把.jar复制进来

(2)右键这个目录,然后点击Add as Library,此时idea就可以解析出jar包里面包含的内容

 

编写JDBC代码

创建数据源

在创建好类文件和主函数后,我们首先要创建一个DataSource

DataSource dataSource = new MysqlDataSource();

DataSource是java自带的包中的类,而MysqlDataSource是驱动包里面具体提供的类,这里是向上转型。

        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/lzx?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

后面的具体的代码我们先不关注,我们看到 ((MysqlDataSource)dataSource),这里是向下转型。

后续代码使用DataSource类型的实例,避免MysqlDataSource这个名字扩散到代码的各种地方(高内聚),未来要是交换数据库,只需要动这一个数据库即可。

当然也可以不做任何转型,

MysqlDataSource mysqlDataSource = new MysqlDataSource();

在当前的简单的实例代码中,向上转型/向下转型和直接写相比,没有任何优势,但一但涉及到数据库的切换问题,就会知道高内聚的代码更有优势。

我们往下看:

.setURL("jdbc:mysql://127.0.0.1:3306/lzx?characterEncoding=utf8&useSSL=false");
.setUser("root");
.setPassword("123456");

这个代码是固定写法,URL是唯一资源地址符,也就是网址

 

 上面的数据源的创建操作,只是描述了服务器在哪,并没有进行真正的访问,紧接着的连接操作才是真正开始通过网络进行通信。

和数据库建立连接

Connection connection = dataSource.getConnection();

 通过Connection新建一个对象,

 但是我们发现,getConnection报错了,这里是一个异常,我们要处理这个异常

 处理好了之后就算和数据库建立了连接,但是真正的执行还没开始

构造SQL语句

SQL语句,我们用String类型来表示

String sql = "insert into student values(1,'张三')";

但是JDBC中还需要搭配一个特定的对象,来描述这里的sql的情况

PreparedStatement statement = connection.prepareStatement(sql);

PreparedStatement背后做了很多事情,比如会对SQL语句进行一些预处理(对语法进行解析之类的),以前通过cmd输入的sql,都是把sql直接发给服务器,让服务器来解析,一个服务器是要做很多的事情的,要对应很多客户端的。

执行SQL语句

针对增,删,改,使用executeUpdate 来执行.
针对,使用executeQuery 来执行

执行就是给服务器发送网络请求

具体的代码:

int ret = statement.executeUpdate();
System.out.println("ret = " + ret);

这个ret就是executeUpdate的返回结果,是一个整数,代表着代码操作了几行数据,跟cmd客户端中返回的结果是一样的

 断开连接

statement.close();
connection.close();

当连接不再使用的时候,就需要释放连接。

同时注意到:资源释放的顺序和创建的顺序是相反的,后出创建的statement,那么就先关闭它。

JDBC支持两种风格的代码,一种是DriverManager,一种是DataSource。

1.DriverManager使用的时候,需要借助反射.咱们不喜欢。
反射不属于常规编程手段,特殊情况下的特殊手段。
2.DataSource相比于DriverManager,内置了数据量连接池可以重复利用连接。

SQL动态语句

String sql = "insert into student values("+ id +",' " + name + " ')";

在前面的构造sql语句中,这段代码比较丑,也不方便阅读,同时还容易引起SQL注入攻击,更靠谱的方案,是使用PreparedStatement来通过占位符替换的方式,来实现动态sql的构造。

 通过占位符,然后再通过statement引用替换,可以把具体的值修改。

查找

刚刚演示的是插入的代码,修改和删除几乎一模一样,下面我们重点说一下查找,和上面的曹锁相比,查找还需要遍历结果集

ResultSet resultset = statement.executeQuery();
while (resultSet.next()){
    //next相当于移动一下光标,光标指向下一行.然后移动到结尾,就返西false
    //使用 getXX方法获取到每一列.
    //获取 int,就使用getInt,获取String,使用getString
    //这里的参数,就是数据库表的列名.
    int id = resultSet.getInt("id"));
    String name = resultSet.getString("name");
    System.out.println(id + ": " + name);
}

 并且最后断开连接的时候也需要多加一个步骤:

resultSet.close();
statement.close();
connection.close();

总结

如果一个SQL代码一天要执行一万次,那么JDBC就可以让Java程序快速的把这一万次执行完毕。

借助代码自动的完成重复劳动,代码写一次。就可以自动的执行很多次,提高效率,解放生产力

JDBC 实际工作中,可能并不会直接使用,因为JDBC代码写起来有点麻烦。
因此就有一些库和框架,对JDBC进行了进一步的封装,让我们用起来更方便,Mybatis,或者JPA这种,让我们写起来非常方便。但是学习JDBC是仍然有巨大的意义的,框架一直在变更,但是JDBC是恒定,框架也都是基于JDBC的。如果你发现现有的框架,难以满足你的需求,就可以基于JDBC来进行框架魔改或者自定义。
 

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

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

相关文章

ActivityWatch配置跨平台同步(放弃)

老版本探索 老版本启动aw_qt.exe报错如下: 解决方案: ActivityWatch\activitywatch\PyQt5\Qt\plugins\platforms 复制到 ActivityWatch\activitywatch 下面重新启动aw_qt.exe即可解决 最新版 具体内容如下: Traceback (most recent call last): …

【前端】解决element-ui的form组件resetFields()方法不生效的问题

问题 使用element-ui的form组件,在输入栏较多的时候,有时resetFields只能重置一部分输入框的值 解决 给每个值赋值初始值为空即可 例如,需要清除的:model"queryForm.bgnTime"、:model"queryForm.endTime"等一系列的值…

基于Java+SpringBoot+vue前后端分离阿博图书馆管理系统设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

【Boost搜索引擎项目】

文章目录 一、项目流程二、项目展示 一、项目流程 1.编写数据去标签模块–parser.cc 将去标签之后干净文档以title\3content\3url\ntitle\3content\3url\n格式放入同一文件中。 2.建立索引模块–index.hpp 读取处理好的行文本文件进行分词、权重计算等操作,在内存中…

ICMP_1靶场详解

ICMP_1靶场复盘 这个靶场还是很有意思的,尤其在提权阶段。 靶场下载地址:https://download.vulnhub.com/icmp/icmp.ova.gz arp-scan --localnet首先扫描ip,登陆后发现是个这样的页面。 我们发现这个页面在提醒我们的就是出现了monitorr 然…

如何部署MHA高可用MySQL数据库

目录 一、MHA概念 MHA 的组成 MHA 的特点 MHA工作原理 二、部署MySQL数据库MHA高可用 第一步 关闭所有防火墙和安全机制 第二步 修改主数据库配置文件 第三步 修改从数据库的配置文件 第四步 重启服务 第五步 优化所有数据库路径 第六步 授权所有数据库节点 第七步…

nodejs+vue+elementui在线课程知识点管理系统

前端技术:nodejsvueelementui,视图层其实质就是vue页面,通过编写vue页面从而展示在浏览器中,编写完成的vue页面要能够和控制器类进行交互,从而使得用户在点击网页进行操作时能够正常。 可以设置中间件来响应 HTTP 请求。 对于之前…

C++ 使用tinyxml库处理XML文件

文章目录 前言一、下载tinyxml二、创建一个XML文件三、XML文件增加数据四、修改XML文件五、解析XML文件六、XML文件删除数据总结 前言 TinyXML是一个开源的解析XML的解析库,能够用于C,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件&…

解决使用@Field注解配置分词器失效问题(Spring Data Elasticsearch)

问题复现:插入数据时,实体类配置的Field注解没有生效 实体类: package cn.aopmin.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import…

机器学习李宏毅学习笔记38

文章目录 前言一、生成式学习二、各个击破和一次到位的对比1.各个击破(Autoregressive(AR) model)2.一次到位(Non-autoregressive(NAR) model) 总结 前言 生成式学习两种策略:各个击破/一次到位 有结构的生成物比如语…

【vue3】常见的使用vue3创建项目的几种方法

1、使用ui界面创建,winr打开命令提示符,输入vue ui 2、winr打开命令提示符,输入vue create 项目名称 3、使用脚手架创建 其中方法一,方法二是使用npm run serve来运行的,方法三是使用npm run dev运行的

基于MOT数据集的高精度行人检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于MOT数据集的高精度行人检测系统可用于日常生活中检测与定位行人目标,利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数据集&…

react native 本地存储 AsyncStorage

An asynchronous, unencrypted, persistent, key-value storage system for React Native. Async Storage 只能用来储存字符串数据,所以为了去储存object类型的数据,得先进行序列化(JSON.stringify())当你想要使用数据的时候&…

redis(9):spring里面使用redis

1 创建一个mave项目 自行创建一个maven项目 2 修改pom.xml <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven…

Python电商爬虫保姆级入门教程(纯新手向)

图灵Python课堂 长沙图灵教育于2001年开始进入教育行业&#xff0c;立足泛IT类职业教育&#xff0c;以打造高新技术人才为宗旨&#xff0c;专注于提供多层次、个性化的职业技能培训课程&#xff0c;为各行业培养技术开发、应用和管理等岗位的中高端人才&#xff0c;致力于成为…

vue全局状态管理工具 Pinia 的使用

先了解一下关于Pinia的一些故事&#xff0c;面试把这些讲给面试官挺加分的&#xff0c;同时这是我持续学习下去的动力 1.为什么叫Pinia&#xff1f; 官网解释是西班牙语中的 pineapple&#xff0c;即“菠萝”&#xff0c;菠萝花是一组各自独立的花朵&#xff0c;它们结合在一起…

王道考研数据结构--4.1.顺序队列

目录 前言 1.顺序队列的定义 2. 顺序队列的结构 3.顺序队列的操作 3.1定义顺序队列 3.2初始化 3.3入队 3.4出队 3.5遍历求表长 3.6清空&#xff0c;销毁队列 4.完整代码 前言 日期&#xff1a;2023.7.25 书籍&#xff1a;2024年数据结构考研复习指导&#xff08;王道…

从小白到大神之路之学习运维第67天-------Tomcat应用服务 WEB服务

第三阶段基础 时 间&#xff1a;2023年7月25日 参加人&#xff1a;全班人员 内 容&#xff1a; Tomcat应用服务 WEB服务 目录 一、中间件产品介绍 二、Tomcat软件简介 三、Tomcat应用场景 四、安装配置Tomcat 五、配置目录及文件说明 &#xff08;一&#xff09;to…

pcie

pcie有两层意思&#xff1a;一层是总线&#xff0c;一层是接口。 下面说的是pcie接口&#xff0c;也就是插槽 一、PCI-E插槽有何作用&#xff1f; 作用是连接显卡、独立声卡、独立网卡、USB 3.0/3.1接口扩展卡、RAID阵列卡、PCI-E SSD等设备。 二、PCI-E插槽分类 PCI-E x1/x2…

ansible自动化运维

&#x1f618;作者简介&#xff1a;正在努力的99年公司职员。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;…