一、JDBC引入
1. 之前操作数据
1)通过mysql的客户端工具,登录数据库服务器 (mysql -u root -p 密码)
2)编写sql语句
3)发送sql语句到数据库服务器执行
2. 什么是 JDBC?
使用java代码(程序)发送sql语句的技术,就是jdbc技术!!!!
实质:
jdbc是sun公司设计的一套通用的用java语言操作不同数据库的接口(接口:抽象方法)。
数据库厂商实现这套接口,提供自己的数据库驱动。
JDBC全称为:Java Data Base Connectivity(java数据库连接)。
它主要由接口组成。组成JDBC的2个包:
java.sql
javax.sql
以上2个包已经包含在J2SE中,所以不用导入,开发这只需要导入JDBC的实现类即数据库驱动包。
开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实现(即数据库驱动)。
3.JDBC的历史
自从Java语言于1995年5月正式公布以来,Java风靡全球。出现大量的用java语言编写
的程序,其中也包括数据库应用程序。由于没有一个Java语言的API,编程人员不得不
在Java程序中加入C语言的ODBC函数调用。这就使很多Java的优秀特性无法充分发挥,
比如平台无关性、面向对象特性等。随着越来越多的编程人员对Java语言的日益喜
爱,越来越多的公司在Java程序开发上投入的精力日益增加,对java语言接口的访问
数据库的API的要求越来越强烈。也由于ODBC的有其不足之处,比如它并不容易使用,
没有面向对象的特性等等,SUN公司决定开发一Java语言为接口的数据库应用程序开发
接口。在JDK1.x版本中,JDBC只是一个可选部件,到了JDK1.1公布时,SQL类包(也就
是JDBCAPI)就成为Java语言的标准部件。
二、JDBC的发展历程
1.没有jdbc之前
没有JDBC之前,java app要连接数据库,需要程序员自己开发和维护数据库驱动程序,并且还要对不同数据库做适配。
如果java app需要连接mysql,则开发人员自己编写mysql驱动程序,连接数据库。
如果java app需要连接oracle,则开发人员自己编写oracle驱动程序,连接数据库。
如果数据库厂商改变了数据库的底层,则开发人员需要重新编写数据库驱动程序去相应的匹配。
问题:需要java程序员开发与维护不同数据库的驱动程序,如果数据库底层发生变化,驱动程序也随之改变。
2. jdbc出现
+++ JDBC出现的原因:
1.没有JDBC时,java app连接数据库需要开发者自己开发和维护数据库驱动程序,
并针对不同的数据做相应的适配。
2.早期,sun公司没有影响力,所以必须程序员自己开发数据库驱动程序。
随着sun公司的发展,在世界有一定的影响力。所以sun公司可以自己定义连接
数据库通用标准,由数据库厂商去实现。
===》 一流公司卖标准,二流公司卖服务,三流公司卖产品。
+++ JDBC出现:
sun公司定义了JDBC规范,它实质上是一套通用的用java语言连接不同数据库的接口
(接口中定义了许多抽象方法)。
数据库厂商遵守JDBC规范,提供java连接数据库的驱动程序。这些驱动程序实质上是
对JDBC的实现。
sun公司定义的JDBC是规范接口,数据库厂商提供的驱动程序是接口的实现。
所以开发者可以用一套API可以去连接不同的数据库。
三、java连接mysql数据库- - 代码实现
+++ mysql连接协议:
String url="jdbc:mysql://localhost:3306/day11";
数据库协议:数据库自协议://主机:端口/要连接的数据库
+++ java连接mysql数据库有三种方式:
1.普通连接
2.使用驱动管理器手动注册连接
3.使用驱动管理器自动注册连接。
+++ Driver 类:
每个驱动程序类必须实现的接口。
这个接口是JDBC规范中的一个核心接口。数据库厂商提供的数据库驱动必须要实现这个接口。
+++ DriverManager类:
1.驱动管理器类, 用于管理多个JDBC驱动程序的基本服务。
2.这个API的常用方法:
DriverManager.registerDriver(new Driver())
DriverManager.getConnection(url, user, password),
3.注意:在实际开发中并不推荐采用registerDriver方法注册驱动。原因有二:
一、查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象。
二、程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。
推荐方式:Class.forName(“com.mysql.jdbc.Driver”);
采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。
同样,在开发中也不建议采用具体的驱动类型指向getConnection方法返回的connection对象。
3.1 第一个JDBC链接的步骤
编写一个程序,这个程序从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.excuteQuery(sql);
五、从代表结果集的ResultSet中取出数据,打印到命令行窗口
六、断开与数据库的连接,并释放相关资源
3.2 方式一: 普通连接
/**
* 方式一
* @throws SQLException
*/
@Test
public void con() throws SQLException {
String url="jdbc:mysql://localhost:3306/day11";
//旧版本
//mysql组织的前身是gjt组织 ,后期又更名为mysql。所以包名gjt也改为了mysql
//Driver driver=new org.gjt.mm.mysql.Driver();
//新版本
Driver driver=new com.mysql.jdbc.Driver();
Properties p=new Properties();
p.put("user", "root");
p.put("password", "root");
Connection conm = driver.connect(url, p);
System.out.println(conm);
}
注意:
这种方式不推荐。
Driver driver=new org.gjt.mm.mysql.Driver();
Driver driver=new com.mysql.jdbc.Driver();
两种实例都是一样的,只不过一个是新版本,一个旧版本。
mysql组织前身是gjt组织。后来组织改名为mysql,所以包名也改为了mysql。
这种连接数据库的方式不推荐使用。
3.3 方式二:使用驱动管理器连接数据库(手动注册)
/**
* 方式二:驱动管理器:手动注册驱动
* @throws SQLException
*/
@Test
public void con2() throws SQLException {
String url="jdbc:mysql://localhost:3306/day11";
//DriverManager:驱动管理器类, 管理一组JDBC驱动程序的基本服务。
DriverManager.deregisterDriver(new com.mysql.jdbc.Driver());
Connection conn = DriverManager.getConnection(url, "root", "root");
System.out.println(conn);
}
注意:
手动注册驱动,这种方式不推荐。
原因:
mysql驱动核心包中 com.mysql.jdbc.Driver ,这个类中有一个静态代码块,静态代码
块的唯一作用就是注册驱动。所以我们在加载类时,静态代码块就已经执行了,即mysql驱动就已经被注册了。
如果我们在手动注册驱动,就相当于注册了两次。
3.4 方式三:使用驱动管理器连接数据库(自动注册) – 推荐使用
/**
* 方式三:驱动管理器:自动注册驱动-- 使用类加载方式
*
* @throws SQLException
* @throws ClassNotFoundException
*/
@Test
public void con3() throws SQLException, ClassNotFoundException {
//加载com.mysql.jdbc.Driver类到JVM。
//由于该类中有一个静态代码块,该代码块的作用就是注册mysql驱动程序。
//所以类加载时,就自动注册了。
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, "root", "root");
System.out.println(conn);
}
注意:
Class.forName("com.mysql.jdbc.Driver");
加载mysql驱动类到jvm。加载驱动类时就已经注册驱动了。
原因:该类中有一个静态代码块,静态代码块的主要作用就是注册mysql驱动。
所以当该类被加载时,静态代码块就自动执行,mysql驱动就自动注册。
mysql驱动自动注册的原理:
以下代码是mysql驱动包中 com.mysql.jdbc.Driver 类,即该类实现了Driver接口。
该类中有一个静态代码块,静态代码块的主要作用就是注册驱动。
所以当我们在JVM中加载该类时,静态代码块就会自动执行,mysql驱动就会自动被注册。