MySQL:JDBC

2023-11-11

什么是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 的内容,难度又是大幅度提升。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL:JDBC 的相关文章

  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • 使用 google-api-java-client 的 2 足 OAuth

    有谁知道如何将 2 legged OAuth 与 google api java client 一起使用 我正在尝试访问 Google Apps 配置 API 以获取特定域的用户列表 以下不起作用 HttpTransport transpo
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • 在 OS X 10.7 中找不到 Mysql 命令

    我无法让我的 mysql 在 os x 10 7 上启动 它位于 usr local mysql bin mysql 当我输入时 我得到命令未找到mysql version在终端中 我试过这个无法从 mac 命令行访问 mysql http
  • 如何为 MySQL 和 Postgres 编写不区分大小写的查询?

    我在本地运行 MySQL 数据库进行开发 但部署到使用 Postgres 的 Heroku Heroku 处理几乎所有事情 但我不区分大小写的 Like 语句变得区分大小写 我可以使用 iLike 语句 但我的本地 MySQL 数据库无法处
  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate
  • JFreeChart - 创建移动图表时出现问题

    我在我的 java 应用程序中使用 JFreeChart Problem 我想绘制一个XY面积图 whose 域轴 x 轴 当我们开始绘制数据时应该自动水平滚动 我在中看到了同样的事情时间序列图表但我不想要任何时间系列图表 我只想要滚动的
  • 在 ASP.NET MVC 中使用 MySQL 的 AccountController

    在 Visual Studio 中创建默认的 ASP NET MVC 项目会设置一个可以在其中注册用户的基本项目 我将如何继续更改它以使用 MySQL 服务器而不是 SQLServer 现在可以使用了 安装最新的 Connector NET
  • Tomcat - 多个 webapps 文件夹

    是否可以有多个文件夹来放置要部署的应用程序 这些是如何定义的 是否可以将一个文件夹限制为仅是 domain com 的应用程序 而不是其他域 Thanks 看一眼conf server xml
  • “未找到 JAVA 路径。请检查 JAVA 是否已安装。”初始化 RSelenium 时出错

    我正在尝试启动一个 RSelenium 会话到 webscrape 但是 当运行此代码时 driver lt rsDriver browser c chrome chromever 76 0 3809 126 port 4444L 我收到此
  • Android 反向地理编码不适用于华为设备

    我正在尝试通过这段代码反转地理编码纬度 经度 Geocoder geocoder new Geocoder context Locale ENGLISH try List
  • 语言翻译语法

    我正在尝试为我的项目添加另一种语言 我们知道语言可以表现出主语和谓语的差异 例如 英语 Mustafa和他的朋友去看电影ahmet today 土耳其 Mustafa布昆 阿卡达西ahmetile birlikte sinemaya git
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • SQL:比较不同表中的两个计数

    我有 3 张桌子 一张桌子上有世界上每个国家及其代币 NAME CODE Afghanistan AFG Albania AL Algeria DZ American Samoa AMSA Andorra AND Angola ANG An
  • Java“非法访问操作”方法将被弃用? [复制]

    这个问题在这里已经有答案了 JDK 9 JVM 发出非法访问操作警告后 如果您使用一些非法访问 例如setAccessible 我的问题 Is setAccessible 以后会被封吗 此功能的官方参考 如果将被弃用 在哪里 我在任何地方都
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • Java 中 .NET 的 Lambda 表达式

    我最近 再次 从 C 迁移到 Java 但我非常怀念 lambda 表达式和 C 的 IEnumerable Foreach 之类的东西 所以我正在寻找Java中的lambda表达式库 有比这更好的图书馆吗LambdaJ http code
  • 为什么 sql 字段名称中不应该包含逗号?

    人们一直告诉我列名中不应包含空格 我只是想知道 这是为什么 这是我为学校创建的一些数据库表遇到的问题 字段名称包括 Preble 和 Darke 相反 它们需要是 普雷布尔县 俄亥俄州 和 达克县 俄亥俄州 如果它们是行名称 我只需创建一个
  • 安装 JDK 时出错:keytool 命令需要已安装的 proc fs (/proc)。 Linux 的 Windows 子系统

    我尝试在 Linux 的 Windows 子系统 Ubuntu 14 04 上安装 Oracle JDK 1 7 但出现以下错误 the keytool command requires a mounted proc fs proc Jav

随机推荐

  • Istio熔断器功能解析

    前言 Istio因灵活的可观察性和安全的服务间通信受到了赞许 然而 其他更重要的功能才真正使得Istio成为了服务网格里的瑞士军刀 当遇到运行时长 延迟和错误率等SLO问题时 服务间的流量管理能力是至关重要的 在今年早些时候发布 Istio
  • java两个日期比较相等

    1 利用Date的equals比较大小 1 利用Date的equals比较大小 SimpleDateFormat sdf new SimpleDateFormat yyyy MM dd HH mm ss String timeStr1 20
  • stm32 串口发送字符串第一个字节丢失、复位发送00

    1 stm32 串口发送字符串第一个字节丢失 这个问题如下解决 while USART GetFlagStatus USART1 USART FLAG TXE RESET 防止一个字节丢失 USART SendData USART1 dat
  • 魏副业而战:闲鱼无货源爆款热销产品推荐

    我是魏哥 与其在家躺平 不如魏副业而战 每天分享一个闲鱼技巧 今天给大家推荐一些闲鱼爆款 很多人做闲鱼过了新鲜期之后 觉得选品太难了 很羡慕那些月入过万每天爆单的人 那为什么别人能每天轻松卖出几十单 而自己却不知道上架什么产品呢 下面就告诉
  • 检查nacos是否正常启动

    可以通过以下几种方式检查nacos是否启动 查看nacos日志文件 启动nacos时 控制台会输出一些信息 可以查看控制台输出的信息 如果显示 Server startup in XXX ms 等字样 则说明nacos已经启动 查看端口是否
  • mybatis-plus 判断参数是否为空并作为查询条件

    方式一 在配置文件中加上全局配置 mybatis plus global config db config field strategy not empty 方式二 对某一字段单独进行判断非空 QueryWrapper
  • Stable Disffusion 采样器总结

    Stable Disffusion 采样器 1 Euler a Euler a 属于超快采样模式 采样10次 即可完成基本画面 但是继续提高采样步数 就基本脱离了提示词 是个插画 tag利用率仅次与DPM2和DPM2 a 环境光效菜 构图有
  • springcloud配置详解

    在这里插入代码片 1 版本信息 父项目 依赖管理 pom文件
  • git创建/合并分支原理

    来源 https blog csdn net abcnull article details 90288499 创建与合并分支简单原理 分支被合并可以被 d 删除 分支没有被合并 d 删除会出错 需要 D 强制删除 master分支 一个分
  • Mysql教程(一):Mysql数据模型和SQL语法分析

    Mysql教程 一 Mysql数据模型和SQL语法分析 1 Mysql数据模型 1 1 关系型数据库 RDBMS 概念 建立在关系模型基础上 由多张相互连接的二维表组成的数据库 特点 使用表存储数据 格式统一 便于维护 使用SQL语言操作
  • 宝塔使用composer安装laravel 时报错 The Process class relies on proc_open, which is not available on your PHP

    Symfony Component Process Exception RuntimeException The Process class relies on proc open which is not available on you
  • vue自定义全局组件(自定义插件)

    有时候我们在做开发的时候 就想自己写一个插件然后就可以使用自己的插件 那种成就感很强 博主最近研究element ui和axios的时候 发现他们是自定义组件 但是唯一有一点不同的是 在用element ui的时候是使用Vue use 语句
  • M35J型多普勒流量计使用说明书

    一 产品原理 产品有三个功能 测平均流速 测水深 测水温 并可显示断面流量 其中水温测量使用温度探头 温度探头不与水接触 紧贴仪器外包装材料顶部 需要置于水底一定时间后才能反映实际水温 测水温的目的是校正超声波在水中的速度 并修正压力传感器
  • CVPR 2021

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 本文转载自 AI人工智能初学者 Coordinate Attention for Efficient Mobile Network Design论文 https arx
  • Windows7(x64) 安装Python3.7.0

    日期 2018年8月8日 作者 Commas 注释 本文写Windows7 x64 安装Python3 7 0 讲述了基本的安装操作 同时也介绍了一些相关的基础知识 本文若有哪些地方写的有所纰漏 还望各位看客指出 谢谢 如果您想了解更多有关
  • ros调试IMU

    ROS与传感器教程 razor imu 9dof使用 新固件 说明 介绍如何使用razor imu 9dof m0 创客智造采购的产品已经刷好固件 可以跳过刷固件 进行测试即可 点击淘宝采购IMU板子 步骤 环境搭配和固件更新 imu板子通
  • Linux常用性能检测命令搜集

    我们在维护网站 管理后台时 经常遇到的问题比如 网络断开 磁盘剩余空间不足 CPU占用过高等等 针对这些问题事前预防总比事后处理要好 当系统出现问题时 我们更要能及时准确定位错误的原因 才能针对性地解决问题 下面搜集一些常用的系统命令及使用
  • 网络编程3——网络层复习(三次握手、四次握手、滑动窗口)

    bkg 一 分层模型结构 OSI七层模型 物 数 网 传 会 表 应 TCP IP 4层末次那个 网 链路层 网络接口层 网 传 应 应用层 http ftp nfs ssh telnet 传输层 TCP UDP 网络层 IP ICMP I
  • 关于textarea限制字数的总结

    在input标签中 只需要设置maxlength 200 即可 但是在textarea标签中 IE9及IE9以下浏览器是不支持的 IE10 IE11则支持 估计后续的版本应该都会支持 现在来说下怎么让大部分IE版本都支持textarea 标
  • MySQL:JDBC

    什么是JDBC JDBC Java DataBase Connectivity 称为 Java数据库连接 它是一种用于数据库访问的应用程序 API 由一组用Java语言编写的类和接口组成 有了JDBC就可以 用统一的语法对多种关系数据库进行