JDBC
JDBC(JavaDatabase Connectivity):
1. 是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API)
2.JDBC为访问不同的数据库提供了一种统一的途径,
3.JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统
4.JDBC接口(API)包括两个层次:
- 面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
- 面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。
JDBC驱动程序: 各个数据库厂商根据JDBC的规范制作的 JDBC 实现类的类库。
**Driver接口:**Java.sql.Driver接口是所有JDBC驱动程序需要实现的接口。
加载与注册 JDBC 驱动: 加载 JDBC 驱动需调用 Class 类的静态方法 forName("DriverClass").
DriverManager类是驱动程序管理器类,负责管理驱动程序.
注意: 通常不手动调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例.
建立连接: 调用 DriverManager 类的 getConnection() 方法建立到数据库的连接 如connection.getConnection
JDBC URL: 用于标识一个被注册的驱动程序,驱动程序管理器通过 URL 选择正确的驱动程序,建立到数据库的连接。
JDBC URL的标准由三部分组成,各部分间用冒号分隔: jdbc:<子协议>:<子名称>
- 协议:JDBC URL中的协议总是jdbc
- 子协议:子协议用于标识一个数据库驱动程序
- 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息
常见JDBC Url:
- Oracle 数据库:jdbc:oracle:thin:@localhost:1521:sid
- SQLServer :jdbc:microsoft:sqlserver//localhost:1433;DatabaseName=sid
- MYSQL 数据库:jdbc:mysql://localhost:3306/sid
连接数据库的步奏:
1.将数据库jar包复制到MyEclipse当前项目的lib目录下(没有就手动建目录)
2.右键jar文件,add to bulidPath 加入到类路径下.
3.通过数据库提供的驱动创建对象 Driver driver=new com.mysql.jdbc.Driver();
4.通过driver调用connect方法获取数据库连接.
5.关闭连接资源.
一个获取数据库链接的最简单例子:
[java] view plain copy
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCTest {
public void getConnection() throws SQLException {
/**
* 连接Mysql数据库
*/
// 创建MysqlDriver对象
Driver mySqlDriver = new com.mysql.jdbc.Driver();
// 数据库url,这里代表mysql数据库下,本地主机的3306端口号,Student数据库
String url1 = "jdbc:mysql://localhost:3306/student";
// 创建一个properties对象
Properties info = new Properties();
// 数据库的用户名和密码,前面必须为user和password
info.put("user", "root");
info.put("password", "admin");
Connection conn1 = mySqlDriver.connect(url1, info);
System.out.println(conn1);
/**
* 连接Oracle数据库
*/
// 通过对象调用connect方法获取链接
Driver oracleDriver = new oracle.jdbc.driver.OracleDriver();
String url2 = "jdbc:oracle:thin:@localhost:1521:orcl";
Properties info2 = new Properties();
info2.put("user", "scott");
info2.put("password","tiger");
Connection conn2 = oracleDriver.connect(url2, info2);
System.out.println(conn2);
}
public static void main(String[] args) throws SQLException {
JDBCTest gc=new JDBCTest();
gc.getConnection();
}
}
结果:com.mysql.jdbc.JDBC4Connection@196c1b0
oracle.jdbc.driver.T4CConnection@b9b538 说明已经连接上了Oracle和Mysql数据库了
通过分析以上mysql数据库的链接和Oracle数据库的链接可以发现,他们都多数的代码都是一样或者相似的,能不能用一个方法,只需改变一点点就让数据库完成连接的切换呢?
办法当然有,我们在集合和反射都用到了properties配置文件,它的作用是使代码重用性增强.
利用反射实现不同数据库的链接而不改变原有代码:
properties:文件 jdbc.properties
#mysql
driver=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/student
user=root
password=admin
#Oracle
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc\:oracle\:thin\:@localhost\:1521\:orcl
#user=scott
#password=tiger
[java] view plain copy
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.Properties;
import org.junit.Test;
public class TestJDBC1 {
public Connection getConnection() throws SQLException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException{
//初始化连接所需的四个变量
String driverClass=null;
String url=null;
String user=null;
String password=null;
//利用反射获取properties输入流
InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties=new Properties();
//加载输入流到properties
properties.load(inputStream);
//从properties中取出连接需要四个条件
driverClass=properties.getProperty("driver");
url=properties.getProperty("url");
password=properties.getProperty("password");
user=properties.getProperty("user");
//利用反射创建相应数据库Driver的对象
Driver driver=(Driver) Class.forName(driverClass).newInstance();
Properties info=new Properties();
info.put("user",user);
info.put( "password",password);
//通过driver对象调用connect方法获取数据库连接
Connection connection=driver.connect(url, info);
return connection;
}
@Test
public void testConnection() throws SQLException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException{
System.out.println(getConnection());
}
}