文章目录
- 1 前言
- 2 JDBC概述
-
- 2.1 JDBC定义
- 2.2 JDBC接口调用方和实现方
- 2.3 接口的作用
- 2.4 连接数据库驱动
- 2.5 JDBC原理
- 3 使用JDBC编程之前,先介绍几个概念
-
- 3.1 API
- 3.2 URL
- 3.3 SQL的分类
- 4 JDBC编程六步曲
-
- 4.1 第一步:注册驱动
- 4.2 第二步:获取数据库连接java基础jdbc
- 4.3 第三步:获取数据库操作对象
- 4.4 第四步:执行SQL语句
- 4.5 第五步:处理查询结果集
- 4.6 第六步:释放资源
- 4.7 JDBC编程六步曲小结
- 5 JDBC编程六步曲优化
-
- 5.1 通过键盘输入的方式(不推荐)
- 5.2 通过配置文件的方式(推荐使用)
- 5.3 数据库连接时,硬编码在程序中(不推荐)
- 6 Statement 和 PreparedStatement
-
- 6.1 SQL注入现象
-
- 6.1.1 SQL注入定义
- 6.1.2 SQL注入实例
- 6.1.3 如何解决SQL注入呢
- 6.2 Statement 和 PreparedStatement 对比
- 7 JDBC事务
-
- 7.1 事务的定义
- 7.2 事务的四个特性
- 7.3 JDBC中的事务
- 8 JDBC编程六步曲最终版
1 前言
项目开发中,操作数据库是必不可少的,常用的操作数据库的框架,如:、等有很多。但是,无论使用哪种框架操作数据库,最底层的api实现都是JDBC,就是说,在开发中,JDBC有着举足轻重的地位,是最基础也是最核心的。
2 JDBC概述
2.1 JDBC定义
Java数据库连接,(Java Database Connectivity,简称JDBC)是。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。(百度百科)
JDBC是Java语言连接数据库系统,JDBC接口是一套class文件,由SUN公司负责制定JDBC规范。
2.2 JDBC接口调用方和实现方
- JDBC接口调用方
JDBC一般都是,用来连接数据库并且操作数据库。 - JDBC接口实现方
数据库的厂商有很多,对应的数据库产品也很多,例如:、、、SQLServer 等。的程序员,负责。
2.3 接口的作用
。
接口的作用:
- 面向抽象编程,面向接口编程,尽量使用多态机制
- 可以提高程序的扩展力,降低程序的耦合度
- 让程序变得具有很强的可接插特性(可插拔)
2.4 连接数据库驱动
- SUN公司负责制定JDBC规范,各数据库厂商编写的JDBC接口的实现类,编译之后将这些实现类打成 jar 包并且发布。
- 所有需要连接数据库的程序员,都需要从官网上下载这些再使用,这些通常被我们称为。
2.5 JDBC原理

3 使用JDBC编程之前,先介绍几个概念
因为数据库连接需要使用到和,下面简单介绍下API和URL的概念,老铁们有个简单的认识。
3.1 API
我们通常,会使用官网的API进行编程,那么,什么是API呢?
定义: 应用程序编程接口,就是一套类库
Java中的API包括三个元素: 、、
以上三个元素的版本要保持一致
例如:JDK1.8源码、JDK1.8字节码 和JDK1.8帮助文档,三者的版本要保持一致
3.2 URL
连接数据库时,需要使用URL连接,那么,什么是URL?
URl定义:
统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法。它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址。现在它已经被万维网联盟编制为互联网标准RFC1738。(百度百科)
- URL是统一资源定位符,代表网络中的某个资源的绝对路径
- 通过URL可以定位网络中的资源
- URL主要包含四部分:、、和
协议是: 提前制定好的通信数据格式、规范,按照这种特定格式发送数据包,对方收到数据包之后,也按照这种规范解析这个数据包,获取有价值数据
IP作用: 定位计算机
端口号作用: 定位服务
数据库中的URL:
如:和
- MySQL数据库:
a、表示协议
b、表示IP
c、表示端口号
d、表示数据库名称 - Oracle 数据库:
a、表示协议
b、表示IP
c、表示端口号
d、表示数据库名称
3.3 SQL的分类
- 数据库查询语言()
简称:DQL,
代表关键字: - 数据库操作语言()
简称:DML,
代表关键字:、 、 - 数据库定义语言()
简称:DDL,
代表关键字:、、 - 事务控制语言()
简称:TCL,
代表关键字:、 - 数据控制语言()
简称:DCL,
代表关键字:、 - 和的区别是什么
下面,是时候表演真正的技术啦。
4 JDBC编程六步曲
下边,笔者以MySQL数据库为例
需要mysql驱动依赖:
4.1 第一步:注册驱动
- 创建驱动对象,告知JDBC我们即将连接哪个数据库
- 通过注册驱动
【代码示例】
4.2 第二步:获取数据库连接
- 通过获取连接
- 连接对象不能随意创建,最后使用完要手动关闭
【代码示例】
- MySQL数据库默认支持的最多连接数量为100
我们大家都知道,这个数值对于高并发下的应用是远远不够的,当连接请求大于默认连接数后,就会出现无法连接数据库的错误,因此我们需要把它适当调大一些。在使用MySQL数据库的时候,经常会遇到这么一个问题,就是错误,这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。通常,mysql的最大连接数默认是100,最大可以达到16384。
MySQL查看最大连接数和修改最大连接数:
- 查看最大连接数
- 修改最大连接数
也可以通过修改配置文件来修改mysql最大连接数(max_connections),这种方式说来很简单,只要修改MySQL配置文件或的参数,将其改为,然后重启MySQL即可。
- 查看最大连接数
4.3 第三步:获取数据库操作对象
- 一个数据库连接对象可以创建多个数据库操作对象
- 通过获取数据库操作对象
【代码示例】
4.4 第四步:执行SQL语句
- 通过数据库操作对象编译执行SQL
- JDBC编写SQL语句不需要以分号结尾
- 数据库管理系统会将编写好的SQL语句编译并执行
【代码示例】
4.5 第五步:处理查询结果集
处理查询结果集,获取当前光标指向行中的数据,有三种方式:
- 第一种方式:根据字段下标获取,不管数据库表中的字段是什么类型,都以字符串方式取出,JDBC所有下标都是以1开始
- 第二种方式:通过结果集中字段名称获取数据,该方式的程序更加健壮,建议使用
- 第三种方式:通过特定类型获取数据,该方式,明确知道字段的类型,可以节省类型转换花费的性能,该方式的程序更加健壮,性能更高,推荐使用
【代码示例】
4.6 第六步:释放资源
- ,,所以先关闭,再关闭,最后关闭
- 需要关闭、、
- 为了保障能够释放资源,将释放代码编写到语句中
- 分别进行关闭资源
JDBC驱动对象的创建、连接、获取数据库操作对象,执行sql、处理结果集等,都需要消耗时间,其中,这里面涉及到的ResultSet、Statement、Connection对象,使用完了需要释放,否则,造成资源浪费,严重的,服务器宕机
在编程时,由于用MySQL语句调用数据库时,在每次执行语句前,会做一个临时的变量用来打开数据库,所以你在使用MySQL语句的时候,记得在每次调用完MySQL之后就关闭MySQL临时变量。
【代码示例】
4.7 JDBC编程六步曲小结
【代码示例】
5 JDBC编程六步曲优化
可在,而不是硬编码到代码中
JDBC获取数据库连接有三种方式:
- 通过键盘输入的方式(实际开发中也不会这样用)
- 直接在数据库连接时,硬编码定义在程序中(不推荐)
5.1 通过键盘输入的方式(不推荐)
【代码示例】
5.2 通过配置文件的方式(推荐使用)
步骤:
1、创建db.properties配置文件,内容如下:
2、通过FileReader fileReader = new FileReader(“db.properties”);读取配置文件
3、创建属性对象Properties pro = new Properties();
4、通过属性对象pro.load(reader)方法将配置信息读取到Map集合对象中(内存中)
5、关闭流 reader.close();
6、通过属性对象的getProperty(String key)方法获取配置文件中的value属性值
7、通过获取到的连接信息,创建数据库连接
【代码示例】
5.3 数据库连接时,硬编码在程序中(不推荐)
6 Statement 和 PreparedStatement
JDBC中,,都可以操作sql获取到想要的结果,但是,这两个还是有一些差别。
6.1 SQL注入现象
6.1.1 SQL注入定义
- 定义
SQL注入即是。SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。 (百度百科)
6.1.2 SQL注入实例
假设有一个场景: 用户通过进行用户名称,进行精确查询,用户输入的信息中有SQL关键字,并且参与了SQL语句的编译,导致SQL语句含义扭曲,最终导致了SQL注入。用户本来只应该查询到他自己的信息,但是却查出来了所有的用户信息。
SQL注入,简单来说,就是用一些SQL关键字,来导致一些不正常的现象,下面的这条sql,,在用户录入userName = 信息进行查询时,执行时sql就变成了,导致SQL语句条件永远为真,会查出所有的用户信息数据。
以上SQL注入原因分析: ,该条sql最终执行时,查询条件被分为两部分,导致SQL语句条件永远为真,会查出所有的用户信息数据。
6.1.3 如何解决SQL注入呢
定义SQL语句框架的时候,使用PreparedStatement数据库操作对象,这个是预编译对象,先将SQL语句框架进行了编译,。
- 先定义 SQL 语句构架,然后对SQL语句进行预先编译,
- 然后再接收用户提供的信息,即使用户提供的信息中包含SQL关键字,这些关键字也不参
与编译,是不起作用的。主要修改的部分:
通过日志也可以看出,即使用户提供的信息中包含SQL关键字,这些关键字也不参
与编译,是不起作用的
赋值后,编译的SQL: select * from user where status = '1’ and userName = '’,其实编译后的sql,是把用户录入的,整体作为了一个,即执行的sql是:select * from user where status = '1’ and userName = “”,这样就不会发生SQL注入问题了。
6.2 Statement 和 PreparedStatement 对比
- SQL语句对于来说是:
- SQL语句对于来说,是
原因:数据库管理系统(DBMS)厂商实现了JDBC接口,DBMS将编译后的SQL语句保存在DBMS中,由于DBMS中有很多编译好的SQL语句,这时通过同一个PreparedStatement对象进行赋值,便会找到其对应的PreparedStatement对象,从而实现其参数的赋值,即:一次编译多次执行。 - PreparedStatement是类型安全的,编译期可以检查传入参数类型
7 JDBC事务
7.1 事务的定义
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。。(百度百科)
。
7.2 事务的四个特性
事务应该具有4个属性:、、、,这四个属性通常称为特性。
一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
7.3 JDBC中的事务
操作数据库时,肯定会有事务的存在,那么,JDBC中的事务是怎么使用的呢?
- :即在JDBC中执行一条DML语句就执行了一次事务
- 将事务的自动提交,修改为手动提交即可避免自动提交
- 在事务执行的过程中,任何一步出现异常都要进行回滚
JDBC中使用事务只有三行代码:
- 设置手动提交事务:
- 事务提交:
- 事务回滚:
【代码示例】
在获取数据库连接后面开启事务,在 catch 语句块中进行事务回滚

8 JDBC编程六步曲最终版
经过以上详细的介绍,相信童鞋们也对JDBC编程有了详细的认识,下面,给出最终版的JDBC编程六部曲代码,以后使用的时候,可以直接copy,进行简单修改即可。
【代码示例】
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/2698.html