1、JDBC概述
1.1 数据持久化
持久化(persistence) :把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用数据持久化意味着将内存中的数据保存到硬盘上加以"固化",而持久化的实现过程大多通过各种关系数据库来"完成。
持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
1.2 Java中的数据库存储技术
在Java中,数据库存取技术可分为如下几类:
- JDBC直接访问数据库
- JDO (Java Data Object)技术
- 第三方O/R工具,如Hibernate, Mybatis等
JDBC是java访问数据库的基石,JDO, Hibernate,MyBatis等只是更好的封装了JDBC.
1.3 JDBC介绍 Java Datebase Connectivity
- JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API ) ,定义了用来访问数据库的标准]ava类库, (java.sql.javax.sql )使用这些类库可以以一种标准的方法、方便地访问数据库资源。
- JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
- JDBC的目标是使java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
1.4 JDBC体系结构
- JDBC接口(API )包括两个层次:。
① 面向应用的API : Java API ,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)
② 面向数据库的API : Java Driver API ,供开发商开发数据库驱动程序用。
面向接口编程概念:JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。
说明:面向接口编程,要求Java程序员编程的代码里面不要出现任何第三方的API,以确保代码的通用性和可移植性
1.5 JDBC程序编写步骤
2、获取数据库连接 (以下方法逐步完善,最后一个就完美了)
2.1 Driver接口实现类
(1)java.sql.Driver接口是所有JDBC驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
(2)在程序中不需要直接去访问实现了Driver接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。
Oracle的驱动: oracle.jdbc.driver.OracleDrivero
mysql的驱动: com.mysql.jdbc.Driver
使用Driver实现数据库连接步骤:
A: 创建一个 Driver 实现类的对象
B: 准备连接数据库的基本信息: url, user, password
C: 调用 Driver 接口的 connect(url, info) 获取数据库连接
说明:下载mysql驱动的jar包,驱动,mysql驱动,就是实现类(也可通过maven直接获取到mysql驱动)
2.2 URL
- JDBC URL用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库的连接。
- JDBC URL的标准由三部分组成,各部分间用号分隔
语法:
jdbc:子协议:子名称
说明:
① 协议: JDBC URL中的协议总是jdbc。
② 子协议:子协议用于标识一个数据库驱动程序。
③ 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
exp:
2.3、连接数据库(最终获取Connection对象)
2.3.1 获取连接Connection对象的方式一:使用Driver连接数据库
使用Driver实现数据库连接步骤:
A: 创建一个 Driver 实现类的对象
B: 准备连接数据库的基本信息: url, user, password
C: 调用 Driver 接口的 connect(url, info) 获取数据库连接
//JDBCjava本来就有,只需通过maven导入mysql驱动(实现类)
public class ConnectionTest{
public void testConnection1() throws SQLException{
Driver driver = new com.mysql.jdbc.Driver(); //用JDBC接口 获取 mysql驱动实例化对象
//协议:子协议:本机或别人的ip地址:端口号/数据库
String url ="jdbc:mysql://localhost:3306/test";
//用Map子类集合Propertis 来装账号和密码
Properties info = new Properties();
info.setProperty("user","root"); //向集合添加用户名
info.setProperty("password","abc");//向集合添加用户密码
Connection conn = driver.connect(url,info); //注册驱动连接好数据库并将对象coon返回
System.out.println(conn);
}
}
此方法有弊端,第一句代码直接用第三方厂家的实现类来获取了Driver对象,这样会影响可移植性(不方便切换其他数据库)。因此需要改进
2.3.2 获取连接Connection对象的方式二:对方式一进行改进 通过反射来动态获取Driver对象.差别就在第一步
方式二在如下过程中不出现第三方的api,使得程序具有更好的可移植性
public class ConnectionTest{
public void testConnection2() throws Exception{
//使用反射获取driver对象
Class clazz = Class.forName("com.mysql.jdbc.Driver");//此方法要求该对象必须给权限和提供了空参构造器
Driver driver = (Driver) clazz.newInstance(); //用JDBC接口 获取 mysql驱动实例化对象
//协议:子协议:本机或别人的ip地址:端口号/数据库
String url ="jdbc:mysql://localhost:3306/test";
//用Map子类集合Propertis 来装账号和密码
Properties info = new Properties();
info.setProperty("user","root"); //向集合添加用户名
info.setProperty("password","abc");//向集合添加用户密码
Connection conn = driver.connect(url,info); //注册驱动并连接好数据库并将对象coon返回
System.out.println(conn);
}
}
2.3.3 获取连接Connection对象的方式三:使用DriverManager类
说明:使用驱动管理获取需要注册驱动
public class ConnectionTest{
public void testConnection3() throws Exception{
//获取3个连接基本信息 url,用户名,密码
String url ="jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "abc123";
//使用反射获取Driver实现类对象
Class clazz = Class.forName("com.mysql.jdbc.Driver");//此方法要求该对象必须给权限和提供了空参构造器
Driver driver = (Driver) clazz.newInstance(); //用JDBC接口 获取 mysql驱动实例化对象
//协议:子协议&#