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 ...
随机推荐
- MySQL系统时间函数NOW(),CURRENT_TIMESTAMP(),SYSDATE()的区别
CURRENT_TIMESTAMP是NOW的同义词,也就是说两者是相同的. SYSDATE函数返回的是执行到当前函数时的时间,而NOW返回的是执行SQL语句时的时间. 测试语句: SELECT NOW ...
- Cookie&Session会话跟踪技术
今日内容学习目标 可以响应给浏览器Cookie信息[response.addCookie()] 可以接受浏览器Cookie信息[request.getCookies()] [创建cookie,设置pa ...
- input 隐藏边框
style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px; border-bottom-color:Black'
- 如何用shell脚本执行或关闭jar包服务?
现在springboot很流行,但是大家都知道springboot是以jar包的方式进行打包的,那样就少不了开启或关闭服务的操作了,但是命令方式未免过于繁琐. 下面记录shell脚本的方式启动或关闭服 ...
- C#HTML解析利器HtmlAgilityPack
HtmlAgilityPack是一个开源的解析HTML元素的类库,最大的特点是可以通过XPath来解析HMTL,如果您以前用C#操作过XML,那么使用起HtmlAgilityPack也会得心应手.目前 ...
- ProxyPattern(23种设计模式之一)
设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大 ...
- String.getBytes()[转]
在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不通OS下,返回的东西不一样! String.getBytes(String decode)方 ...
- java判断一个数是否为素数[转]
http://blog.csdn.net/lwcumt/article/details/8027586 import java.util.Scanner; //质数又称素数,是指在一个大于1的自然数中 ...
- Python正则表达式的七个使用范例-乾颐堂
作为一个概念而言,正则表达式对于Python来说并不是独有的.但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别. 本文是一系列关于Python正则表达式文章的其中一部分.在这个系列 ...
- json操作工具-LitJson
LitJSON是json生成与读取的操作工具,使用很方便并且网上还能找到源码.下面是使用LitJSON的例子: 一.生成json:实例化一个JsonData,然后按照List数组的方式向里面填. Js ...