Java 连接、操控数据库总结(JDBC)
看到数据库连接不由得想起了大一末参加团队考核时的悲催经历~~,还记得当初傻傻地按照书本的代码打到 Eclipse 上,然后一运行就各种报错。。。报错后还傻傻地和书本的代码一遍又一遍地进行核对,发现无误后,还特别纠结——代码和书本一样,怎么就报错了呢? 最后通过 Google 才得知要添加驱动包,就这样好多个小时就白白浪费掉了 ~~ 当初连 JDBC 与 JDBC Driver 还没区分好,往事不堪回首。。。
大二末,抱着“自己被抗了,也坑坑师弟,让他们体验下爬坑的经历”的心态,考核师弟时故意没发驱动包给他们,事后听他们说就因为这坑了他们几天的时间。。。
大三末,轮到大二师弟考核大一的师弟,然后大二的师弟和大一的说,“数据库连接时,需要一个驱动包,你们自己去了解、下载,具体的就不说了,要学会解决问题。当年带我的师兄也没直接提供给我,还害我花了几天的时间。所以今年我算好了,还提醒你们要注意。。。”,听到这我背后不由的一凉,这得有多大的怨气。。。(_,这不怪我,叫了你们遇到解决不了的问题可以问师兄,你们没问而已,逃~~)
好了,回忆结束~~。为了怀念以前的“懵懂青春”,总结下 Java的数据库连接以及 JDBC、JDBC Driver。
JDBC 与 JDBC Driver
首先要搞清楚的是,什么是 JDBC,什么是 JDBC Driver:
JDBC,JDBC 的全称为 Java Database Connectivity,它定义了一套访问数据库的 API。使用这些 API 你就可以使用 Java 来操控数据库,执行
select
、update
、delete
、insert
等常用的操作。(具体定义请看维基百科)JDBC Driver,JDBC Driver 就是 Java 与数据库之间的一层软件组件——驱动。就像我们的鼠标驱动、键盘驱动等驱动,它担任了一个中间人、一名翻译者。因此,要想使用 Java(JDBC API)来访问操控数据库,我们还需要 JDBC Driver 来负责翻译。(维基百科上有具体介绍)
JDBC Driver
JDBC Driver 一般是由相应的数据库提供的,比如 MySQL 提供了 Connector/J 驱动 (根据官方说明,Connector/J 属于第 4 种类型的驱动。想了解更详细、更多的驱动类型可以参加维基百科)。
JDBC Driver 的安装
JDBC Driver 的安装很简单,只需要去官网下载它提供的驱动,并把相应的 Jar 包(通常叫作 mysql-connector-java-version-bin.jar)放在 Java Classpath 下就 OK,如果你和我一样是搞 J2EE 的,你也可以直接把它放在 WEB-INF/lib 目录下,或者用类似 Maven 之类的工具来添加。详细请看 官方文档 。
使用
JDBC Driver 的使用在 这 有很多例子,因此不再累赘了。毕竟它只是一个驱动,我们更多的是使用 JDBC API 调用这个驱动与数据库打交道。更多的使用总结请看下部分。
JDBC API
JDBC 只是 Java 中定义的一些接口,它也属于 JDK 的一部分,就像文件等普通接口一样,我们只需要调用它来完成目的就 OK 。既然是 API 我们就要去看文档熟悉它才能更好地使用它,这些类分别处于 java.sql 和 javax.sql。
连接
要想使用 JDBC API 来操控数据库,首先要连上数据库。连接数据库有两种方法:
- 使用 DriverManager 。第一次使用 DriverManager 来建立与数据库的连接时,它会自动在 class path 中寻找并加载 JDBC 4.0 驱动。要注意的是,如果是 4.0 之前的版本,需要手动去加载。
- 使用 DataSource 。根据官方推荐,我们应该优先使用 DataSource 。相对于比较简单的 DriverManager ,它比较复杂,也比较全面、详细。
使用 DriverManager 连接数据库:
要使用 DriverManager ,我们先要把该类加载进来,使用最简单的方法(在要加载的类里添加以下代码)
Class.forName("com.mysql.jdbc.Driver").newInstance();
加载了 DriverManager 后,我们就可以使用它来获取与数据库的连接(假设我们使用本地数据,默认路径为 localhost ;数据库名为 test ;用户名为 root;密码为 123):
// DriverManager、Connection 类在 java.sql 里都有定义
String URL = "jdbc:mysql://localhost:3306/test?user=root&password=123";
Connection conn = DriverManager.getConnection(URL);
//或者
String URL = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123";
Connection conn = DriverManager.getConnection(URL, user, password);
//或者
String URL = "jdbc:mysql://localhost:3306/test";
Properties connectionProps = new Properties();
connectionProps.put("user", this.userName);
connectionProps.put("password", this.password);
Connection conn = DriverManager.getConnection(URL, connectionProps);
(个人觉得,第一种看起来简单、方便,但是修改麻烦、可读性不高,不太建议使用。如果你只想简单地传递用户名与密码可以选用第二种。如果你有很多参数要传递,比如字符编码、用户名密码等,优先选择第三种。)
连接数据库,我们只需调用 getConnection() 方法并且返回与数据库的连接(Connection)就 OK ,有了此连接我们就可以操作数据了。
在这要注意的是 getConnection 方法里的字符串参数 URL 。该字符串指定了数据库的路径、数据库名、数据库配置(用户名密码等)。 MySQL 的 URL 语法如下:
jdbc:mysql://[host][,failoverhost...][:port]/[database] [?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...
详细说明
使用 DataSource 连接:
DataSource 连接涉及的东西比较多,找时间另开一篇来总结。 _
创建语句
连接上了数据库,我就可以操控数据库了。通常我们是编写 SQL 语句来操控数据库的。因此,在操控数据库之前,我们还要创建 SQL 语句。JDBC 定义了 3 种类型语句接口,用来运行 SQL 语句,并且返回执行结果:
- Statement
- PreparedStatement
- CallableStatement
相应地,创建语句也有三种方法:
Connection.createStatement()
——创建普通的语句,它通常不需要提供参数。更多Connection.prepareStatement(String stringSQL)
——创建预编译语句,通常要提供一个带有占位符的字符串 SQL 语句。 更多Connection.prepareCall()
——创建存储过程。更多
这里要注意的是,Statement
与 PreparedStatement
的区别。它们的最主要区别就是:
PreparedStatement
对 SQL 语句进行了预编译,在需要运行多次 SQL 语句是能得到显著的性能提升- 可以有效地防止 SQL 注入攻击( SQL injection attacks )
- 可以轻松地在 SQL 字符串里使用非标准的 Java 对象,如
Date
、Time
、Timestamp
、BigDecimal
等 - 相对于使用拼接方式的 Statement,它使用占位符(?) 很好地把查询语句以及变量值分开。
- 更多请看 stackoverflow 上的讨论
操控数据库
平时我们操控数据库,最常用的、最简单的就是select
、update
、delete
、insert
等常用的操作了。那么我们是怎么通过 JDBC API 来实现这些行为的呢?
通常,我们会使用 Statement.executeQuery(String sql)
来执行 select
查询操作,它会返回一个 ResultSet 的对象,这个对象包含了查询返回的数据。update
、delete
、insert
等更新操作使用 Statement.executeUpdate(String sql)
,它会返回一个整数,代表影响的行数。
ResultSet
ResultSet 是查询数据库时返回的数据集,我们可以把它想象为一张与数据表类似的数据表,就像我们使用命令行执行 select 语句时控制台返回的数据表。不同之处是它拥有一个一开始处于第一行数据的前一行的指针。然后我们就可以通过不停地调用 ResultSet.next()
来移动指针获取每一行的数据,该函数在指针移动到最后一行的下一行时就返回 false
,我们可以利用这个特性来作为终止条件遍历整张表。(第一行的前一行与最后一行的下一行都是不存在的行,是虚拟的行)
此外,ResultSet 有 3 中类型(更多):
- TYPE_FORWARD_ONLY:这个是默认的类型,它只能不同地调用
next()
方法把指针向下一行移动,而不能往回走。 - TYPE_SCROLL_INSENSITIVE:这个类型除了可以调用
next()
方法把指针向下一行移动外,还可以调用previous()
方法把指针指向前一行,使用first
方法把指针移动到第一行等。 - TYPE_SCROLL_SENSITIVE:此方法与第 2 个类型一样,可以任意移动指针。但它是敏感型的。也就是说,当你使用
Statement.executeQuery(String sql)
产生了 ResultSet 后,数据库中响应的数据发生了改变,它会更新 ResultSet 并保持数据与数据库一致。而第 2 个类型是非敏感型的,它不会更新 ResultSet。
要指定 ResultSet 的类型,我们只需在创建 Statement 时指定:
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE);
OK,我已经可以在获取数据表中的任意行了,我们现在来获取一行数据中的特定列的数据。ResultSet 提供了 getter 方法(getBoolean、getLong、getInt等方法)来获取当前行的列。这些方法的参数既可以是列的索引号(从 1 开始的整型)也可以是列的别名或者列名(字符串)。比如 ResultSet.getInt(1) 获取第一列的数据,ResultSet.getFloat("score") 获取列名为 score 的列。更多
参考
Oracle 官方 Java教程 —— JDBC(TM) Database Access
MySQL 5.6 参考手册
维基百科 JDBC Driver
java.sql 包
stackoverflow
Java 连接、操控数据库总结(JDBC)的更多相关文章
- Java连接MySql数据库之JDBC
1.首先创建一个java Project项目 2.起一个英文的项目名 3.此窗口点击NO 4.此时项目状态如下 5.创建一个文件夹,并将mysql-connector-java-5.1.8-bin.j ...
- java连接SQL数据库(JDBC)相关设置
2016-06-14 一.SQL server中的相关设置(以sql server 2012 版本为例) 建立一个SQL server 身份认证的服务器登录名 首先启动SQL客户端,以windows身 ...
- JDBC Java 连接 MySQL 数据库
MySQL 版本:Server version: 5.7.17-log MySQL Community Server (GPL) 用于测试的 MySQL 数据库:game 查看数据库中的表 mysql ...
- java连接mysql数据库详细步骤解析
java连接mysql数据库详细步骤解析 第一步:下载一个JDBC驱动包,例如我用的是:mysql-connector-java-5.1.17-bin.jar 第二步:导入下载的J ...
- Java连接SqlServer2008数据库(转)
Java连接SqlServer2008数据库 首先下载JDBC:下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=21599 下 ...
- Java连接MySQL数据库及简单操作代码
1.Java连接MySQL数据库 Java连接MySql需要下载JDBC驱动MySQL-connector-java-5.0.5.zip(举例,现有新版本).然后将其解压缩到任一目录.我是解压到D盘, ...
- 转载:Java连接MySQL 数据库的正确操作流程
转载网址:http://www.bitscn.com/pdb/mysql/201005/186551.html 以下的文章主要介绍的是Java连接MySQL 数据库(以MySQL数据库为例 ...
- Java连接MySQL数据库增删改查通用方法
版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- Java 连接 MySQL 数据库
最近想学习一下 Java 连接 MySQL 数据库,于是有了这样的一些问题&解决办法. 首先是解决 JDBC(Java Data Base Connectivity)驱动问题,因为默认安装的J ...
随机推荐
- python中的socket模块
熟悉了一下python的socket模块,感觉还是有点好玩的,不过坑也也是不少的. 1.服务器端代码 #!/usr/bin/env python import socket HOST='192.168 ...
- GNU/Linux LVM 原理图释
逻辑卷管理器(英语:Logical Volume Manager,缩写为LVM),又译为逻辑卷宗管理器.逻辑扇区管理器.逻辑磁盘管理器,是Linux核心所提供的逻辑卷管理(Logical volume ...
- 「小程序JAVA实战」小程序通用模板的使用(17)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-17/ 小程序也为了页面增加了通用模板的功能,如何去理解一个通用的模板呢?模板的定义就是为了让我们的 ...
- Spring cloud Eureka高可用 - Windows 7 hosts文件立即生效
hosts 文件所在位置 c:/windows/system32/drivers/etc/hosts 左下角 搜索框 搜索 cmd 弹出命令框 输入 ipconfig /displaydns 显示所有 ...
- Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA
找到原先备份的项目,把 .idea 文件夹重新覆盖,解决问题.
- Halcon标定
摄像头拍摄时候,图像均有畸变,但是图像的扭曲变形均是有规律的成线性的,所以可以通过算法矫正.halcon标定过程需要在镜头内放置标定板:标定板一般选用30*30mm的:可以通过halcon程序来制作: ...
- 改bug的乐趣
一直以来,我都不喜欢改bug,不管是自己的,还是别人的.因为我不相信自己的代码会出现问题,一旦出现问题我就会觉得很难堪,因为我觉得我的代码没什么问题.然后我就不知道该怎么来解决这些问题. 最近这一两次 ...
- Force SDK to create Appointment programmatically in crm 2013 onPremise
As I know based on this: msdn.microsoft.com/.../gg334289.aspx and community.dynamics.com/.../book-an ...
- java算法 第七届 蓝桥杯B组(题+答案) 7.剪邮票
7.剪邮票 (结果填空) 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红 ...
- Servlet小案例总结
亮点: 没有使用任何框架,视图层和业务层使用Servlet技术进行交互,持久层用java的jdbc工具类进行数据交互 较为底层,比较基础的工具类比较多,比如: BeanFactory工具类使用dom4 ...