当前位置:网站首页 > Java基础 > 正文

java基础jdbc



文章目录

  • 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,进行简单修改即可。

【代码示例】

 
 
   
 

版权声明


相关文章:

  • java异常处理基础2025-04-13 08:34:03
  • java基础346讲2025-04-13 08:34:03
  • 制作java基础镜像2025-04-13 08:34:03
  • java基础知识讲解2025-04-13 08:34:03
  • java 基础教程 0基础2025-04-13 08:34:03
  • java基础期末题库2025-04-13 08:34:03
  • java基础试题 判断2025-04-13 08:34:03
  • java开发基础很差2025-04-13 08:34:03
  • java基本基础2025-04-13 08:34:03
  • java语言基础推荐2025-04-13 08:34:03