JDBC简介
JDBC全称为:Java DataBase Connectivity (Java数据库连接)
SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC
Sun公司为了简化数据库开发,定义了一套JDBC接口,这套接口由数据库厂商去实现,这样,开发人员只需要学习JDBC接口, 并通过JDBC加载具体的驱动,就可以操作数据库。
组成JDBC的2个包(java.sql 、javax.sql)
(1)java.sql
类:DriverManager
接口:Connection Statement ResultSet PreparedStatement
CallableStatement(它用于调用存储过程)
(2)javax.sql
接口 DataSource
开发JDBC应用需要以上2个包的支持外
还需要导入相应JDBC的数据库驱动(即数据库驱动 mysql-connector-java-x.x.x-bin.jar)
什么是驱动?
两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
第一个JDBC程序
创建user表
create table user(
id int primary key auto_increment,
username varchar(20) unique not null,
password varchar(20) not null,
email varchar(40) not null
);
INSERT INTO USER VALUES(NULL,'tom','123','tom@163.com');
INSERT INTO USER VALUES(NULL,'fox','123','fox@163.com');
编程从user表中读取数据,并打印在命令行窗口中。
(一)搭建实验环境
1、在MySQL中创建一个库,并创建user表和插入表的数据。
2、新建一个Java工程,并导入数据驱动
(二)编写程序,在程序中加载数据库驱动(称为注册驱动)
DriverManager.registerDriver(Driver driver);
(三)建立连接(Connection)
Connection conn = DriverManager.getConnection(url, user, pass);
(四)创建用于向数据库发送SQL的Statement对象,并发送SQL
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
(五)从代表结果集的ResultSet中取出数据,打印到命令行窗口
(六)断开与数据库的连接,并释放相关资源。
新建项目工程,创建cn.itcast.jdbc包 创建JdbcDemo1.java
package cn.itcast.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.Driver;
public class JdbcDemo1 {
public static void main(String[] args) throws SQLException {
// 1.注册驱动
DriverManager.registerDriver(new Driver());
// 2.获取连接对象
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb1", "root", "root");
// 3.通过连接对象获取操作sql语句Statement
Statement st = con.createStatement();
// 4.操作sql语句
String sql = "select * from user";
// 操作sql语句(select语句),会得到一个ResultSet结果集
ResultSet rs = st.executeQuery(sql);
// 5.遍历结果集
// boolean flag = rs.next(); // 向下移动,返回值为true,代表有下一条记录.
// int id = rs.getInt("id");
// String username=rs.getString("username");
// System.out.println(id);
// System.out.println(username);
while(rs.next()){
int id=rs.getInt("id");
String username=rs.getString("username");
String password=rs.getString("password");
String email=rs.getString("email");
System.out.println(id+" "+username+" "+password+" "+email);
}
//6.释放资源
rs.close();
st.close();
con.close();
}
}
JDBC 编程步骤以及JDBC访问数据库的流程
JDBC编程步骤
简单的说,JDBC的意义在于在Java程序中执行SQL语句。
驱动程序的意义在于提供统一的接口并隐藏实现细节。驱动程序定义了数据库能做什么,比如上面所说的几个步骤,数据库的制造商(例如Oracle)提供符合这些接口的实现(怎么做),我们在编写Java程序中只需要调用驱动程序中的接口就可以操作数据库,完成这四个步骤。同计算机硬件的驱动程序类似,JDBC的驱动实现了 "做什么"和"怎么做"的分离。
与使用SQLPlus访问数据库类似,在操作数据库之前,需要先跟数据库建立连接。建立连接后,可以通过获得的连接对象来调用SQL语句。
操作数据基本的含义是执行SQL语句,包括DML,DDL,DCL 均可,还可以调用数据库中已有的存储过程,释放资源。
使用JDBC编程时,与数据库建立的连接以及通过这个连接创建的语句对象,都有可能需要调用响应的close方法来释放底层建立的网络连接,或者打开文件。
JDBC访问数据库的流程
- 通过DriverManager加载驱动程序driver;
- 通过DriverManager类获得表示数据库连接的Connection类对象;
- 通过Connection对象绑定要执行的语句,生成Statement类对象;
- 执行SQL语句,接收执行结果集ResultSet;
- 可选的对结果集ResultSet类对象的处理;
- 必要的关闭ResultSet、Statement和Connection
程序详解—DriverManager
JDBC程序中的DriverManager用于加载驱动,并创建与数据库的链接,这个API的常用方法:
DriverManager.registerDriver(new Driver);
DriverManager.getConnection(url, user, password);
它是java.sql包下的一个驱动管理的工具类,可以理解成是一个容器(Vector),可以装入很多数据库驱动
它的registDriver方法分析
public static synchronized void registerDriver(java.sql.Driver driver)
参数:java.sql.Driver
我们传递的是 com.mysql.jdbc.Driver;
在com.mysql.jdbc.Driver类中有一段静态代码块:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
它的registDriver方法分析
public static synchronized void registerDriver(java.sql.Driver driver)
参数:java.sql.Driver
我们传递的是 com.mysql.jdbc.Driver;
在com.mysql.jdbc.Driver类中有一段静态代码块:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
注意:在实际开发中并不推荐采用registerDriver方法注册驱动。原因有二:
(一)有上述的的源代码可知,如果采用此种方式,会导致驱动程序注册两次,也就是说在内存中会有两个Driver对象
(二)程序依赖MySQL的API,脱离MySQL的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。
推荐方式:利用反射Class.forName("com.mysql.jdbc.Driver");
采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。
同样,在开发中也不建议采用具体的驱动类型指向getConnection方法返回connection对象。
在cn.itcast.jdbc包下新建JdbcDemo2.java 如下:
package cn.itcast.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//解决关于加载驱动问题
public class JdbcDemo2 {
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
// 1.注册驱动
// DriverManager.registerDriver(new Driver()); //加载了两个驱动
Class.forName("com.mysql.jdbc.Driver"); // 加载mysql驱动
Class.forName("oracle.jdbc.driver.OracleDriver");// 加载oracle驱动
// String url="jdbc:mysql://localhost:3306/day17";
String url = "jdbc:mysql:///mydb1";
// 2.获取连接对象
Connection con = DriverManager.getConnection(url, "root", "root");
// 3.通过连接对象获取操作sql语句Statement
Statement st = con.createStatement();
// 4.操作sql语句
String sql = "select * from user";
// 操作sql语句(select语句),会得到一个ResultSet结果集
ResultSet rs = st.executeQuery(sql);
// 5.遍历结果集
// boolean flag = rs.next(); // 向下移动,返回值为true,代表有下一条记录.
// int id = rs.getInt("id");
// String username=rs.getString("username");
// System.out.println(id);
// System.out.println(username);
while (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
System.out.println(id + " " + username + " " + password + " "
+ email);
}
// 6.释放资源
rs.close();
st.close();
con.close();
}
}
数据库URL
URL用于标识数据库位置,程序员通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
jdbc:mysql://localhost:3306/test?key=value
- jdbc: 协议
- mysql:子协议