数据的持久化
持久化:把数据保存到可掉电式存储设备中以供以后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以“固化”,而持久化的实现过程大多通过各种关系库来完成
主要应用
持久化的主要应用是将内存中的数据库存储在关系型数据库中,当然也可以存储在磁盘中,XML数据文件中
在java中,数据库技术可分为如下几类:
JDBC
直接访问数据库JDO
(Java Data Object)技术- 第三方
O/R
工具,如Hibernate
,Mybatis
等
注意: JDBC
是java访问数据库的基石,JDO
,Hibernate
,MyBatis
等只是更好的封装了JDBC
导入mysql-connector-java-5.1.7-bin.jar包
-
打开项目,选择“file->project structure”,或者使用快捷键Ctrl +Alt +Shift +S
-
在打开的窗口中可以看到“Modules”及其依赖项
-
点击“dependencies”中的“+”选择合适的选项,比如“Jars or Directories”
-
这个选项会打开文件管理器,选择相应文件夹,其中存放着已下载好的JAR包
-
新加入的依赖包可以在Dependencies中查看,设置完成后选择“OK”即可
-
添加好项目的JAR包之后,可以在项目文件夹中查看,如图所示
注意:
我试过8.0.18里面的驱动器,然后全程报错,换成5.1.7的驱动器,就没问题了,建议版本不要太高
JDBC的介绍:
简介
JDBC
(Java Database Connectivity
)只是一个独立于特定数据库管理系统,通用的SQL
数据库存取和操作的公共接口(一组API),定义了用来访问数据的标准java类库,(java.sql
,javax.sql
)使用这些类库可以以一种标准的方法,方便地访问数据库资源
作用
JDBC
为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题
目标
JDBC
的目标是使用JDBC
可以连接任何提供了JDBC
驱动程序的数据库系统,这样就使得程序员无序对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程
对比说明
如果没有JDBC
,那么java程序访问数据库时是这样的:
Oracle
:(MySQL Oracle
) 微软:SQLsever
IBM: DB2
有了JDBC,java程序访问数据库时是这样的:
总结如下(真实情况):
JDBC接口(API)包括两个层次:
面向应用的API:
java API
,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)
面向数据库的API:
Java Driver API
,供开发商开发数据库驱动程序使用
JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可
注意:
不同的数据库厂商,需要针对这套接口,提供不同的实现,不同的实现的集合,即为不同数据库的驱动
--------------------面向接口编程
JDBC程序编写步骤:
CRUD编程
增加(Create)、读取(Retrieve)、更新(Update)和删除(Delete) 即CRUD编程
(返回结果集的情况(也就是查))
开始 ---------->导入java.sql包------------>附加相应厂商提供的驱动(即实现一堆抽象方法(这个抽象方法也就是所商量出来的一种标准))--------------->加载并注册驱动程序-------------->创建Connection对象-------------->创建Statement对象---------------->执行SQL语句(查询(返回结果集))----->使用ResultSet对象----------->关闭ResultSet对象---------->关闭Statement对象----------->关闭Connection对象-------->结束
(不返回结果集的情况(也就是增删改))
开始 ---------->导入java.sql包------------>附加相应厂商提供的驱动(即实现一堆抽象方法(这个抽象方法也就是所商量出来的一种标准))--------------->加载并注册驱动程序-------------->创建Connection对象-------------->创建Statement对象----------------->执行SQL语句(更新:即增删改(并不返回结果集))--------------->关闭Statement对象---------------->关闭Connection对象------------->结束
补充:
ODBC
(Open Database Connectivity,开放式数据库连接),是微软在Windows平台下推出的,使用者在程序中只需要调用ODBC API
,由ODBC
驱动程序将调用转换为成为对特定的数据库的调用要求
获取数据库的连接:
要素一:Driver接口实现类
Driver接口介绍
java.sql.Driver
接口是所有JDBC
驱动程序需要实现的接口。这个接口是提供给数据库 厂商使用的,不同数据库厂商提供不同的实现
在程序中不需要去直接访问Driver接口的类,而是 由驱动程序管理器类(java.sql.DriverManager
)去调用这些Driver
实现
Oracle的驱动:Oracle.jdbc.driver.OracleDriver
Mysql的驱动:com.mysql.jdbc.Driver
加载与注册JDBC驱动
加载驱动:加载JDBC
驱动需要调用Class类的静态方法forName()
,向其传递要加载的JDBC驱动的类名
Class.forName("com.mysql.jdbc.Driver")
注册驱动:DriverManager
类是驱动程序管理器类,负责管理驱动程序:
使用DriverManager.registerDriver(com.mysql.jdbc.Driver)
来注册驱动
通常不同显式调用DriverManger
类的registerDriver()
方法来注册驱动程序类的实例,因为Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用DriverManager.registerDriver()
方法来注册自身的一个实例。
下图是MYSQL
的Driver实现类的源码:
static{
try{
java.sql.DriverManager.registerDriver(new Driver());
}catch(SQLException E){
throw new RuntimeException("Can't register driver!");
}
} )
要素二:URL
JDBC URL
用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL
选择正确的驱动程序,从而建立到数据库的链接。
JDBC URL
的标准由三部分组成,
jdbc:子协议:子名称
- 协议:JDBC URL中的协议总是JDBC
- 子协议:子协议用于标识一个数据库驱动程序
- 子名称:一种标识数据库的方法,子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息,包含主机名(对应服务端的ip地址),端口号,数据库名
举例:
jdbc:mysql://localhost:3306/test
协议:jdbc
子协议:mysql
子名称:localhost:3306/test
几种常用数据库的JDBC URL
MYSQL的连接
连接方式1:
import java.sql.Connection;
import java.sql.Driver;
import java.util.Properties;
public class Test1 {
public static void main(String[] args)throws Exception {
Driver driver=new com.mysql.jdbc.Driver();
String url="jdbc:mysql://localhost:3306/test";
Properties info =new Properties();
info.setProperty("user","root0");
info.setProperty("password","abc123");
Connection conn=driver.connect(url,info);
System.out.println(conn);
}
}
实现截图
连接方式2
(对方式1的迭代,在如下的程序中不出现第三方的API,使得程序具有更好的可移植性):
java程序面向接口编程,希望具有可移植性,代码中不能出现第三方API
1.获取Driver实现类对象:使用反射
Class clazz=Class.forName("com.mysql.jdbc.Driver");
Driver driver=(Driver)clazz.newInstance();
2.提供要连接的数据库
String url="jdbc:mysql://localhost:3306/test";
3.提供连接需要的用户名和密码
Properties info =new Properties();
info.setProperty("user","root0");
info.setProperty("password","abc123");
4.获取连接
Conneciton connection=driver.connect(url,info);
System.out.println(conn);
实现截图
连接方式3:
使用DriverManager
(是一个类,并非接口)替换Driver
1.获取driver实现类的对象
Class clazz=Class.forName("com.mysql.jdbc.Driver");
Driver driver=(Driver)clazz.newInstance();
2.提供三个连接的基本信息
String url="jdbc:mysql://localhost:3306/test"
String user="root0"
String password="abc123"
3.注册驱动
DriverManager.registerDriver(driver);
4.获取连接:
Connection conn=DriverManager.getConnection(url,user,password);
System.out.println(conn);
实现截图
方式4
只是加载驱动,不用显示注册驱动
1.提供三个连接的基本信息
String url="jdbc:mysql://localhost:3306/test"
String user="root0"
String password="abc123"
2.加载驱动(加载驱动类时,静态代码块会执行)
Class.forName("com.mysql.jdbc.Driver");
3.获取连接:
Conneciton coon=DriverManager.getConnection(url,user,password);
System.out.println(conn);
//相较于方式三,可以省略如下操作:
//Driver driver=(Driver)clazz.newInstance();
//注册驱动
//DriverManager.registerDriver(driver);
//为什么可以省略上述操作呢?
在MySQL的Driver实现类中,声明了如下的操作:
实现截图
注意:
注册驱动过程在静态加载时已经完成(静态代码块的执行是在类加载的时候)
把加载Driver类省略后运行:
即把下面这行代码省略:
Class.forName("com.mysql.jdbc.Driver");
执行代码:
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Properties;
public class Test1 {
public static void main(String[] args)throws Exception {
String url="jdbc:mysql://localhost:3306/test";
String user="root0";
String password="abc123";
Connection conn=DriverManager.getConnection(url,user,password);
System.out.println(conn);
}
}
能正常运行,为什么?
正常运行原因
在java.sql.Driver
文件夹下面,存放着一个东西
mysql
中,它会给我们自动加在Driver类,但是其它数据库管理系统的不会自动加载,所以的话写上加载还是最好的做法
方式5:
将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接
1.读取配置文件中的4个基本信息
InputStream is=Test1.class.getClassLoader().getResourceAsStream("jdbc0.properties");
注意:这个Test1是当前所在类名
Properties pros=new Properties();
pros.load(is);
String url= pros.getProperty("url");
String user=pros.getProperty("user");
String password=pros.getProperty("password");
String driverclass=pros.getProperty("driverClass");
2.加载驱动
Class.forName(driverclass);
3.获取连接
Connection conn=DriverManager.getConnection(url,user,password);
System.out.println(conn);
注意:jdbc0.properties
最好部署在src下面,不要部署在整个项目下面
此种方式的好处?
- 实现了数据域代码的分离,实现了解耦
- 如果需要修改配置文件信息,就可以避免重新打包。