JDBC

JDBC(Java DataBase Connectivity)

JDBC 简介

Java 数据库连接技术。即用 Java 程序操作数据库的一套接口。是独立与 特定数据库(MySQL、SQLServer) 的管理系统,也就是无论使用的是什么类型的数据库都可以用 JDBC 去连接。

让 JDBC 去翻译底层数据库的各种指令,我们只需要使用 JDBC 的接口即可。大大提高了开发效率和维护成本,像极了 Java 跨平台的功能。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5AGqc589-1593582157029)(JDBC.assets/image-20200503212619980.png)]

JDBC 体系接口

  • 面向应用的 API,供程序员调用
  • 面向数据库的 API,供厂商开发数据库的驱动程序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FDpqR9g5-1593582157037)(JDBC.assets/image-20200503213333802.png)]

  1. JDBC API

    提供者:Java 官方

    内容:供开发者调用的接口

    java.sql 和 javax.sql

  • DriverManager 类
  • Connection接口 ,由 DriverManager类获得此对象
  • Statement接口 由 Connection 对象获得此对象
  • ResultSet接口 由 Statement 对象的 executeQuery() 方法返回此对象
  1. DriverManager

    提供者:Java 官方

    作用:管理不同的 JDBC 驱动

  2. JDBC 驱动

    提供者:各大数据库厂商

    作用:负责连接不同的数据库

JDBC 的使用

1.加载数据库驱动,Java 程序和数据库之间的桥梁。

因为数据库驱动由数据库厂商提供,所以不属于 Java 中的资源。需要导入这个外部驱动资源。在 JavaWeb 工程中就导入web/lib文件夹下,在 Java 工程中就新建一个与 src 同级的 lib 文件夹并导入。

Class.forName("com.mysql.cj.jdbc.Driver")获取运行时类(加载到内存中的类),加载驱动,即将驱动加载到虚拟机内存中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bkAHd1qK-1593582157039)(JDBC.assets/image-20200503231104297.png)]

之前连接数据库都是直接用 UI 界面连接,在 Java 代码中都需要去实现 URL,User,Password 这些参数。

Java 代码中连接数据库所需要的 URL[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UoUVV2lW-1593582157043)(JDBC.assets/image-20200503232537244.png)]

2.获取 Connection,Java 程序与数据库的一次连接。

// 获取连接
            String url = "jdbc:mysql://localhost:3306/study"; // 最后一个斜杠表示要访问 study 数据库
            url += "?useUnicode=true&characterEncoding=UTF-8"; // 处理中文乱码
            String user = "root", // 数据库用户名
                    password = "password"; // 数据库密码
            try {
                Connection connection = DriverManager.getConnection(url, user, password); // 相当于 UI 界面真的连接
                System.out.println(connection); // 若连接成功则可以正确输出 connection 对象
            } catch (SQLException e) {
                e.printStackTrace();
            }

输出[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ow1Mp8fc-1593582157045)(JDBC.assets/image-20200503233740179.png)]

若密码错误,则输出:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CI2XEqGR-1593582157048)(JDBC.assets/image-20200503233835946.png)]

3.创建 Statement 对象,由 Connection 产生 ,执行 SQL 语句。

  • 如果是对数据库进行增、删、改操作,则使用 Statement 对象的executeUpdate(sql) 方法,返回 int 型,表示修改了数据库几行的元组。
  • 如果是查询数据库,则使用 Statement 对象的 executeQuery(sql) 方法,返回 ResultSet 对象。

这里我想访问 study 数据库,student 表中的信息。

image-20200701135514104
代码如下:

String sql = "INSERT INTO Student(S_no, Class_no, S_name, Ssex, S_birthday) VALUES('001103', 'js2222',  'JavaTest', '男', '1999-09-10');";
Statement statement = connection.createStatement();
int result = statement.executeUpdate(sql); // 执行 sql 语句,result 表示影响了数据库几行

4.如果需要接收返回值,创建 ResultSet 对象,保存Statement 执行之后查询到的结果。

ResultSet 对象的 next() 方法可以用来判断查询是否为空集

String sqlQuery = "SELECT * FROM student;";
ResultSet resultSet = statement.executeQuery(sqlQuery);
while (resultSet.next()) { // next 将 resultSet 内部的一个指针加 1(指针初始位置为第0行,也就指向表的属性行),指向下一行,返回是否存在下一行的 Boolean
    String S_no = resultSet.getString(1); // 可以使用列属性的序号来取属性值
    String Class_no = resultSet.getString("Class_no"); // 可以使用数据库表中的 属性名 来取 属性值
    String S_name = resultSet.getString(3);
    String Ssex = resultSet.getString("Ssex");
    Date S_birthday = resultSet.getDate("S_birthday");

    System.out.println(S_no + "-" + Class_no + "-" + S_name + "-" + Ssex + "-" + S_birthday);
}

PreparedStatement

Statement 的子类,提供了 SQL 占位符的功能。实际开发中都是使用 PreparedStatement 。

使用 Statement 进行开发有两个问题:

  1. 需要频繁拼接 String 字符串,出错率较高。

  2. 存在 SQL 注入的风险。

    SQL 注入:利用某些系统没有对用户输入的信息进行充分的检测,在用户输入的数据中注入非法的 SQL 语句,从而利用系统的 SQL 引擎完成恶意行为的做法。

preparedStatement 的用法

与 Statement 的用法不同,preparedStatement 在利用 Connection 对象创建自身时就写入 sql 语句当作参数,而调用 此 sql 语句的方法中不需要再写 sql 语句当作参数。

// 在 sql 语句中添加占位符 ?,减少出错概率
String sqlQueryZ = "SELECT * FROM student WHERE Class_no = ? AND Ssex = ?"; // 有2个问号占位符
PreparedStatement preparedStatement = connection.prepareStatement(sqlQueryZ);

// 属性是什么类型就调用什么 set类型 的方法
preparedStatement.setString(1, "js0001"); // 表示替换第1个问号占位符的值
preparedStatement.setString(2, "男"); // 表示替换第2个问号占位符的值
ResultSet resultSetP = preparedStatement.executeQuery();
if (resultSetP.next()) {
	System.out.println("查询成功");
} else {
	System.out.println("查询失败");
}
System.out.println(sqlQueryZ); // sqlQueryZ equals "SELECT * FROM student WHERE Class_no = 'js0001' AND Ssex = '男'"

5.断开连接

一定要记得断开连接!!

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

注意事项

  1. 若想要插入mySQL 数据的大小超过了 数据库中对应类型的数据范围,则后端会报异常。
  2. 对于后端的 Double 类数据,数据库中存储的数据类型应该是 DOUBLE !!使用 decimal 也会插入成功,但是会损失精度,这 一点 不容易察觉。

热门文章

暂无图片
编程学习 ·

浅析原型模式中的clone()

更多精彩文章请访问我的个人博客(zhuoerhuobi.cn)最近学习到设计模式中的原型模式,在学习过程中,产生了对clone()实现的原理和效率的兴趣。原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的…
暂无图片
编程学习 ·

如何将PDF转换成jpg图片?教你2种免费方法

如何将PDF格式的文件转换成JPG图片?有时为了方便需要将PDF转成图片来使用,直接截图不仅耗费时间,而且像素很不清晰,有没有其他方便快捷转出高清图片的方法呢? 方法1: 这个方法最方便就在于不用下载安装软件,甚至都不需要注册登录,只要有网络,手机和电脑都能快速操作完…
暂无图片
编程学习 ·

ps如何实现阳光照射效果

1.ps打开图片。2.按ctrl+j复制背景图层就会自动创建图层(图层 0 副本),选择图层 0 副本,按ctrl+alt+2调出高光选区,再按ctrl+j复制高光选区就会自动创建图层(图层 1)。3.选择图层1,ctrl+L打开色阶工具,拖动输入色阶的右边白色滑块向左边移动把图中亮的的地方调更亮。4…
暂无图片
编程学习 ·

操作系统虚拟页的页表表项

为了能够实现页面置换算法中的请求调页,需要在页表的下面增加一些位,来辅助完成这样的工作。 每一页上的表项里面有4个位是比较重要: 逻辑页号------------访问位--------修改位--------保护位----------驻留位----------物理页帧号 驻留位 表示该页是在内存中还是在外存。如…
暂无图片
编程学习 ·

MySql简单入门_第四篇(1)_视图

4、使用视图【将视图用于检索SELECT 而不用于更新INSERT,UPDATE和DELETE】视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询。视图提供了一种MySQL的SELECT语句层次的封装,可用来简化数据处理以及重新格式化基础数据或保护基础数据。【视图仅仅是用…
暂无图片
编程学习 ·

计算机网络知识点梳理(上)

计算机网络知识点梳理(上) 参考资料:计算机网络(哈尔滨工业大学:李全龙、聂兰顺)MOOC目录计算机网络知识点梳理(上)1. 基础1.1. 计算机网络结构1.2. 应用模型:1.2.1. 客户/服务器应用模型1.2.2. 对等应用模型(P2P)1.3. 交换设备与交换网络1.4. 多路复用技术1.5. 性能1.5…
暂无图片
编程学习 ·

Oracle-函数

文章目录SQL 函数SQL 函数分类单行函数1.字符函数1.大小写控制函数1.lower、upper、initcap2.字符控制函数1.concat2.substr3.length | lengthb4.instr5.lpad | rpad6.trim7.replace2.数字函数1.rou
暂无图片
编程学习 ·

现代开发者必备:5个更流畅、更受欢迎的Python web框架

全文共1837字,预计学习时长9分钟图源:unsplash如今,可供选择的Python web框架有不少,能帮助你更快更轻松地创建web应用。本文就将为大家介绍一些更现代、使用更广泛的web框架。1.FastAPIFastAPI致力于实现轻便和快速,笔者很喜欢它,它的开发速度和简单程度令人欣慰。这对于…
暂无图片
编程学习 ·

CentOS系统安装好之后输入ifconfig指令无法查看ip解决办法

CentOS系统安装好之后输入ifconfig指令无法查看ip解决办法 第一次使用虚拟机安装CentOS系统,安装完之后想要通过Xshell连接Linux系统,在输入ifconfig指令后,无法查看到ip地址,也就无法通过ip地址连接Linux系统 本人经过多次百度,找了很多的解决办法都无法解决问题,但也发现了无…
暂无图片
编程学习 ·

希尔排序的原理,图解,java代码实现

希尔排序希尔排序就是一种插入排序,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。排序原理排序原理:选定一个增长量h,按照曾长亮h作为分组的依据,对数据进行分组。 对分好组的每一组数据完成插入排序。 减少增长量,最小减为1,重复第二步操作。举例排序过…
暂无图片
编程学习 ·

sed详解

1. Sed简介sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有…
暂无图片
编程学习 ·

css3属性选择器

属性选择器 基本用法选择符 简介E[att] 选择具有att属性的E元素E[att=val] 选择具有att属性且属性值等于val的E元素E[att^=“val”] 匹配具有att属性、且值以val开头的E元素E[att$=“val”] 匹配具有att属性、且值以val结尾的E元素E[att*=“val”] 匹配具有att属性、且值中含有…
暂无图片
编程学习 ·

数据结构的基本概念和常用术语

下面是对android数据结构的基本概念和常用术语的一些理解,大家可以了解学习一下。我收集了一些学习用的资料,其中包含了很多学习,面试,中高进阶fluuter资料,还有很多视频详解,如果有同学想进一步了解,详情请看文末。数据是信息的载体,是描述客观事物属性的数、字符以及…
暂无图片
编程学习 ·

数独小游戏开发(1)---自定义界面

放假闲着没事,自己写个小游戏练练手平时看到的数独小游戏的界面都是直接一个999\times999的小方格,这里使用自定义View实现。 重写onDraw()实现自定义界面的显示@Overridepublic void onDraw(Canvas canvas) { // super.onDraw(canvas);//浅色线条Paint grayPaint = n…
暂无图片
编程学习 ·

Python科学计算系列12—积分变换

1.拉普拉斯变换及逆变换拉普拉斯变换公式拉普拉斯逆变换公式例子:代码如下:from sympy import * from sympy.integrals import laplace_transformt, s, a = symbols(t s a) # 拉普拉斯变换 F1 = laplace_transform(sin(a * t), t, s) F2 = laplace_transform(exp(a * t), t, …
暂无图片
编程学习 ·

《MYSQL数据库》TCL语言和DCL语言

一、TCL语言的操作语法有时候我们的一个需求(一个任务),可能会涉及到多个DML(增删改)操作。那么这一系列操作, 我们要看成一个整体,不可切割。如在一个员工系统中,某员工A的数据可能会存在多个表中,如基本信息表,业务信息表,邮箱信息表等。当我们想删除此人的所有信息时,…
暂无图片
编程学习 ·

库存补单及销量预测

库存补单的数学模型 摘要根据顾客对商品的需求,科学合理的制定库存补单决策对于自家商店发展具有重大的影响,进而成为商家关注的热点问题。本文研究的是补单的策略问题。针对问题一,是典型的预测问题,要求我们能够准确的预测出未来五天的日销售量。由于日销售量是个非线性的…
暂无图片
编程学习 ·

大数据独角兽TOP10榜单发布,“内永洪,外Tableau”领跑BI领域

近日,“2020大数据独角兽企业排行榜”重磅发布,国内厂商永洪科技和国际厂商Tableau双双入选TOP10,领跑BI &数据分析领域。在行业内,一直有着“内永洪,外Tableau”的说法。用一句话概括就是,Tableau是国际领头羊,永洪科技是国内领导者。 1、主办方是如何看待数据分析…
暂无图片
编程学习 ·

自学笔记

JAVA自学笔记——? ##类与对象 一、类 1、概念:具有相同属性和行为的一组对象 2、类的定义: 【修饰符】 class 类名{ 成员变量 类的方法 } 修饰符:※ default:默认模式,即无需添加任何修饰符,修饰的方法或类,只能在同一个包内访问private修饰的方法、变量、构造方法只能…
暂无图片
编程学习 ·

7月1日 Day1

7月2日中午补 111 制定了最近的训练计划,大致方向 222 7月1日晚 CodeforcesRound#654(Div.2) 赛时水过了四题, EF待补 思路没有问题,代码需要重新写下. 补题: