看到数据库链接不禁得想起了大一末参加团队考核时的悲催经历~~,还记得当初傻傻地按照书本的代码打到 Eclipse 上,而后一运行就各类报错。。。报错后还傻傻地和书本的代码一遍又一遍地进行核对,发现无误后,还特别纠结——代码和书本同样,怎么就报错了呢? 最后经过 Google 才得知要添加驱动包,就这样好多个小时就白白浪费掉了 ~~ 当初连 JDBC 与 JDBC Driver 还没区分好,往事不堪回首。。。html
大二末,抱着“本身被抗了,也坑坑师弟,让他们体验下爬坑的经历”的心态,考核师弟时故意没发驱动包给他们,过后听他们说就由于这坑了他们几天的时间。。。java
大三末,轮到大二师弟考核大一的师弟,而后大二的师弟和大一的说,“数据库链接时,须要一个驱动包,大家本身去了解、下载,具体的就不说了,要学会解决问题。当年带个人师兄也没直接提供给我,还害我花了几天的时间。因此今年我算好了,还提醒大家要注意。。。”,听到这我背后不禁的一凉,这得有多大的怨气。。。(^_^,这不怪我,叫了大家遇到解决不了的问题能够问师兄,大家没问而已,逃~~)mysql
好了,回忆结束~~。为了怀念之前的“懵懂青春”,总结下 Java的数据库链接以及 JDBC、JDBC Driver。sql
首先要搞清楚的是,什么是 JDBC,什么是 JDBC Driver:数据库
JDBC,JDBC 的全称为 Java Database Connectivity,它定义了一套访问数据库的 API。使用这些 API 你就可使用 Java 来操控数据库,执行 select
、update
、delete
、insert
等经常使用的操做。(具体定义请看维基百科)api
JDBC Driver,JDBC Driver 就是 Java 与数据库之间的一层软件组件——驱动。就像咱们的鼠标驱动、键盘驱动等驱动,它担任了一个中间人、一名翻译者。所以,要想使用 Java(JDBC API)来访问操控数据库,咱们还须要 JDBC Driver 来负责翻译。(维基百科上有具体介绍)oracle
JDBC Driver 通常是由相应的数据库提供的,好比 MySQL 提供了 Connector/J 驱动 (根据官方说明,Connector/J 属于第 4 种类型的驱动。想了解更详细、更多的驱动类型能够参加维基百科)。函数
JDBC Driver 的安装很简单,只须要去官网下载它提供的驱动,并把相应的 Jar 包(一般叫做 mysql-connector-java-version-bin.jar)放在 Java Classpath 下就 OK,若是你和我同样是搞 J2EE 的,你也能够直接把它放在 WEB-INF/lib 目录下,或者用相似 Maven 之类的工具来添加。详细请看 官方文档 。工具
JDBC Driver 的使用在 这 有不少例子,所以再也不累赘了。毕竟它只是一个驱动,咱们更多的是使用 JDBC API 调用这个驱动与数据库打交道。更多的使用总结请看下部分。性能
JDBC 只是 Java 中定义的一些接口,它也属于 JDK 的一部分,就像文件等普通接口同样,咱们只须要调用它来完成目的就 OK 。既然是 API 咱们就要去看文档熟悉它才能更好地使用它,这些类分别处于 java.sql 和 javax.sql。
要想使用 JDBC API 来操控数据库,首先要连上数据库。链接数据库有两种方法:
使用 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 语句,而且返回执行结果:
相应地,建立语句也有三种方法:
Connection.createStatement()
——建立普通的语句,它一般不须要提供参数。更多Connection.prepareStatement(String stringSQL)
——建立预编译语句,一般要提供一个带有占位符的字符串 SQL 语句。 更多Connection.prepareCall()
——建立存储过程。更多这里要注意的是,Statement
与 PreparedStatement
的区别。它们的最主要区别就是:
PreparedStatement
对 SQL 语句进行了预编译,在须要运行屡次 SQL 语句是能获得显著的性能提高Date
、Time
、Timestamp
、BigDecimal
等平时咱们操控数据库,最经常使用的、最简单的就是select
、update
、delete
、insert
等经常使用的操做了。那么咱们是怎么经过 JDBC API 来实现这些行为的呢?
一般,咱们会使用 Statement.executeQuery(String sql)
来执行 select
查询操做,它会返回一个 ResultSet 的对象,这个对象包含了查询返回的数据。update
、delete
、insert
等更新操做使用 Statement.executeUpdate(String sql)
,它会返回一个整数,表明影响的行数。
ResultSet 是查询数据库时返回的数据集,咱们能够把它想象为一张与数据表相似的数据表,就像咱们使用命令行执行 select 语句时控制台返回的数据表。不一样之处是它拥有一个一开始处于第一行数据的前一行的指针。而后咱们就能够经过不停地调用 ResultSet.next()
来移动指针获取每一行的数据,该函数在指针移动到最后一行的下一行时就返回 false
,咱们能够利用这个特性来做为终止条件遍历整张表。(第一行的前一行与最后一行的下一行都是不存在的行,是虚拟的行)
此外,ResultSet 有 3 中类型(更多):
next()
方法把指针向下一行移动,而不能往回走。next()
方法把指针向下一行移动外,还能够调用previous()
方法把指针指向前一行,使用 first
方法把指针移动到第一行等。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