MySQL:JDBC

什么是JDBC?

JDBC( Java DataBase Connectivity ) 称为 Java数据库连接 ,它是一种用于数据库访问的应用程序 API ,由一组用Java语言编写的类和接口组成,有了JDBC就可以 用统一的语法对多种关系数据库进行访问,而不用担心其数据库操作语言的差异 。 有了JDBC,就不必为访问Mysql数据库专门写一个程序,为访问Oracle又专门写一个程序等等。

为什么要有JDBC?

看看大佬的回答:

第一 :JDBC是Java中操作数据库数据的规范,注意是规范和标准,除此之外别无它号,即使Hibernite,Batis 也是要建立在JDBC基础上的。JDBC定义了如何链接数据库(Connection),如何操作数据(ResultSet,Stement)和事务管理(Transcation ,SavePoint...),JDBC具体的实现是由数据库厂商或第三方提供。
第二: 理论上说,不用JDBC也可以直接操作数据库,但是很多情况下这些东西是无法实现的,比如在链接一个数据库时厂商会对通讯协议中的部分内容保密仅提供数据库驱动,很难查找到相关的资料,即使有也会涉及到版权这些问题。除此之外上层的数据操作接口也要重新定义和编写。

JDBC工作原理

既然JDBC主要是用于java连接数据库的,能连接什么数据库没有指定,其实能连接很多种数据库,而且一般来说可以连接oracle和mysql,通常也是这两种。但是既然JDBC能连接这么多的数据库,开发起来太麻烦了,于是sun公司那帮人想出了一个办法,我定义一套规则,大家都按照这个规则来,实现自己公司访问数据库的实现。这套规则就是JDBC,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动。

JDBC是不动的,但是驱动包有很多种。

如何链接JDBC

首先需要下载驱动包

Java驱动包一般在该网站中下载:maven中央仓库

Maven Repository: (mvnrepository.com) 

在搜索框中输入你想下载的驱动包:

如图:

点进去以后:

 注意要下载与你MySQL版本相同(大版本)的驱动包,否则就会报错;

中间的红色是说该版本有缺陷,黑客可以通过该缺陷攻击你的数据库,但是我们初学者没必要慌,咱数据库随便他们偷!

下载完以后,打开编译器,创建一个 lib 包:

然后将下载的驱动包直接用鼠标拖进来就可以了。

然后右键点击add as library : 

这样idea就可以识别目录中的 jar 包了,从而调用里面的类来编写代码。 

包中类/接口,如下图:

准备工作完成,接下来就可以正式开始写代码了;

JDBC完成开发需要如下几个步骤来操作:

  1. 遍历并初始化一个数据源
  2. 和数据库服务器建立链接
  3. 构造MySQL语句
  4. 执行MySQL语句
  5. 释放必要资源

1. 遍历并初始化一个数据源

我们需要创建一个数据源:

该数据源来自我们下载的驱动包:

DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_107_3?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("");

为什么我们要这么做,我们不能创建一个MysqlDataSource()拿 MysqlDataSource 类型来接收吗?

当然可以,这样后面也就不用再向下转型了,这样还更方便了。

但是上面代码为啥要这么写呢?

主要是大家都这么写,体现接口的统一性。

我们来看看每一句数据源的含义: 

setUrl("jdbc:mysql://127.0.0.1:3306/java_107_3?characterEncoding=utf8&useSSL=false")

setUser("root")

setPassword("")

2. 和数据库建立链接


Connection connection = dataSource.getConnection();//注意包要导对:java.sql.Connection

getConnection 方法好多包中有存在,但是我们需要 sql 包下的方法。

注意:

这里包一个异常需要抛出。

3. 构造MySQL语句

即使使用代码来操作数据库仍然需要使用mysql语句来构造。

String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);

 切记,构造时要确保该表存在。

PreparedStatement statement = connection.prepareStatement(sql);

该语句是对mysql语句进行预编译,

如果请求是sql 字符串,服务器是可以处理的,服务器就需要对其解析并执行,但是如果大量数据同时发起请求,那么服务器压力就会非常大。

那么进行一个预编译就会减小服务器的压力。

preparestatement

1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程

2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理。

当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。

这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。

来自:preparestatement的用法-百度知了好学 

4. 执行MySQL语句

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

statement.executeUpdate();

预编译过的sql语句发送给服务端,服务端作出相应,返回值为 int类型;其含义为:sql语句所影响的行数。

5. 释放必要资源

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

谁后创建,谁先释放。

释放完资源这样简单的JDBC链接就完成了。

修改sql构造语句

但是显然我们整个过程还是有缺陷的。

看下图: 

这里直接将sql语句写死了,无法灵活改变,改写法可读性差,且易被sql注入

所以我们还需要在这里进一步改变。

我们在这里改为从控制台读取输入信息,再通过拼装功能来完成对构造。

 虽然这样解决了以上问题,但是明显不好写,并且容易写错,那么我们可以通过PreparedStatement拼装功能来实现。

代码如下:

        //3. 从控制台读取用户输入内容
        System.out.println("请输入学生学号");
        int id = scanner.nextInt();
        System.out.println("请输入学生名字");
        String name = scanner.next();
        //4. 构造MySQL语句
        String sql = "insert into student values(?,?)";//'?' 表示一个占位符
        PreparedStatement statement = connection.prepareStatement(sql);
        //将占位符替换成指定的值
        statement.setInt(1,id);//将第一个 '?' 替换为id
        statement.setString(2,name);//将第二个 '?' 替换为name

        //  打印需要加到拼凑之后
            System.out.println(statement);
        //5. 执行MySQL语句
        int ret = statement.executeUpdate();
        System.out.println("ret = " + ret);

 那么本章的JDBC就到这里了,MySQL也就结束了,下一章内容就要开始JavaEE 的内容,难度又是大幅度提升。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker三剑客之swarm

一、什么是docker swarm Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker…

排序算法 - 冒泡排序

冒泡排序算法应该可以说是很经典的一种对数据进行排序的的算法了,甚至在很多的介绍算法的数据中,它可能还是放在最前面开始讲解的。 冒泡排序算法到底是咋样的呢?冒泡这个说法又是怎么得来的呢? 首先先理解一下冒泡算法的实现原理…

Java开发 - 布隆过滤器初体验

目录 前言 布隆过滤器 什么是布隆过滤器 布隆过滤器的作用 布隆过滤器原理 怎么设计布隆过滤器 布隆过滤器使用案例 安装布隆过滤器 添加依赖 添加配置 添加工具类 添加测试代码 简单测试 特别提醒​​​​​​​ 结语 前言 前面三篇,已经把消息队列…

裸辞3个月,面试了25家公司,终于找到心仪的工作了

​上半年裁员,下半年裸辞,有不少人高呼裸辞后躺平真的好快乐!但也有很多人,裸辞后的生活五味杂陈。 面试25次终于找到心仪工作 因为工作压力大、领导PUA等各种原因,今年2月下旬我从一家互联网小厂裸辞,没…

蓝桥杯刷题第九天

题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。素数就是不能再进行等分的整数。比如7,11。而 9 不是素数,因为它可以平分为 3 等份。一般认为最小的素数是2,接着是 3,5&…

深度学习面试题汇总(一)

深度学习面试题汇总(一) 文章目录深度学习面试题汇总(一)1.Dropout1.1Dropout在训练的过程中会随机去掉神经元,那么在编码过程中是怎么处理的呢?1.2dropout的训练过程需要做rescale,这个过程是什…

Candence PCB Si 仿真设计篇3:板级链路仿真

接上篇Candence PCB Si 仿真设计篇2;提示仿真链路中无VIA过孔仿真模型,可手动添加VIA过孔仿真模型; 1.添加过孔VIA仿真模型. 在SigXplorer PCB SI GXL界面中,菜单栏Analyze->Via Model Generator弹出设置VIA模型设置&#xf…

VR全景城市,用720全景树立城市形象,打造3D可视化智慧城市

随着城市化进程的加速,城市之间的竞争也日益激烈。城市管理者们需要寻求新的方式来提升城市的品牌形象和吸引力。在这个过程中,VR全景营销为城市提供了一种全新的营销手段,可以帮助提升城市的价值和吸引力。一、城市宣传新方式VR全景营销是一…

自学大数据第八天~HDFS命令(二)

嗨喽,好久不见,最近抽空复习了一下hadoop,书读百遍,其意自现这句话还真是; 继续学习HDFS常用命令 改变文件 拥有者~chown hdfs dfs -chown -R hadoop /user/hadoop使用 -R 将使改变在目录结构下递归进行。命令的使用者必须是超级用户。 改变文件所属组-chgrp hdfs dfs -chgr…

Swing开发教程从入门到实践(一)

文章目录开发工具设置实战示例自定义组件常用组件总览JFrameJDialogJPanelLayout布局高级扩展扩展皮肤FlatLafweblaf扩展组件自定义组件SwingX打包部署打包成可执行Jar打包成成品参考开发工具 传统套件IDEAUI Designer。 UI Designer是一个idea插件,可以帮助我们通…

tailwind和bootstrap对比优劣有哪些,给前端开发者的一些建议

一、概述Tailwind和Bootstrap是两种流行的CSS框架,它们都提供了快速、易用的CSS类库来帮助前端开发者构建出现代化的网站和应用程序。它们有一些相似之处,但也有很多不同的优势和劣势。二、对比Tailwind的优势:1.自定义程度更高: Tailwind提供的所有CSS类…

【数论】最大公约数、约数的个数与约数之和定理

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

朋友去华为面试,轻松拿到26K的Offer,羡慕了......

最近有朋友去华为面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…

java面试八股文之------Java并发夺命23问

java面试八股文之------Java并发夺命23问👨‍🎓1.java中线程的真正实现方式👨‍🎓2.java中线程的真正状态👨‍🎓3.如何正确停止线程👨‍🎓4.java中sleep和wait的区别👨‍…

【STC15单片机】 超声波模块的使用

目录 1 基于STC15F2K60S2的超声波测距代码 1.1 基本注意事项 1.1.1 跳线帽接法 1.1.2 晶振设置 1.2 板载超声波工作原理 1.2.1 原理总结 1.2.2 超声波代码思路 1.3 STC15单片机代码部分 1.3.1 定时器0&定时器1初始化 1.3.2 超声波ultrasonic.c ultrasonic.h文件配…

C++修炼之练气期第八层——内联函数

文章目录 一、宏的缺点 引例 改正一 改正二 改正三 宏的缺陷 二、内联函数的概念 三、内联与非内联的区别 四、内联函数的特性 专栏导读 🌸作者简介:花想云,在读本科生一枚,致力于 C/C、Linux 学习。 🌸本文收…

【linux】:进程地址空间

文章目录 前言一、进程地址空间总结前言 本篇文章接着上一篇文章继续讲解进程,主要讲述了进程在运行过程中是如何在内存中被读取的以及为什么要有虚拟地址的存在,CPU在运行过程中是拿到程序的虚拟地址还是真实的物理内存。 一、进程地址空间 下面我们先…

【Spring从入门到实战】第 5 讲:SpringBoot实现拦截器及其原理

本文已收录于专栏🌲《Spring从入门到实战》🌲专栏前言 大家好,我是执梗。本专栏将从Spring入门开始讲起,详细讲解各类配置的使用以及原因,到使用SpringBoot进行开发实战,旨在记录学习生活的同时也希望能帮到…

【Maven】Maven的安装与下载

目录 一、Maven 软件的下载 二、Maven 软件的安装 三、JDK 的准备与统一 1. JDK 环境: 2. Maven 及 JDK 配置 四、Maven 软件版本测试 💟 创作不易,不妨点赞💚评论❤️收藏💙一下 一、Maven 软件的下载 为了使用 Maven 管理…

6万字144道耗时72小时吐血整理【金三银四(金九银十)面试小抄之Java经典面试题基础篇总结】(附答案)

目录一.前言二.Java基础面试篇1. 什么是Java?2.Java 和 C的区别?3.Java中常用的注释以及作用?4.标识符的命名规则5.JVM、JRE和JDK的关系6.Oracle JDK 和 OpenJDK 的对比7.Java中基本数据类型8.int 和 Integer 有什么区别9.switch 是否能作用在…