--------------------------------------------------------------------------------------------
数据持久化
把数据保存到可掉电式存储设备中一共之后使用,大多数情况下,特别是企业级应用中,
数据持久化意味着将内存中的数据保存到硬盘加以固话,而持久化的实现过程通过
各种关系型数据库来完成持久化的主要应用是将内存中的数据存储在关型数据库中
当然可以存储在磁盘文件,xml数据文件中
----------------------------------------------------------------------------------------------
java中的数据存储技术
在java中,数据库存取技术可分为以下几类:
1.JDBC之间访问数据库
2.JDO技术
3.第三方O/R工具,如Hibernate,ibatis等
---------------------------------------------------------------------------------------------
JCBC是java访问数据库的基石,JDO
Hibernate等只是更好的封装了JCBC
(如调用存储过程,函数必须使用JDBC)
------------------------------------------------------------------------------------------
JDBC基础:
JDBC(java Database Connectivity)是一个独立于特定数据库管理系统,
通用的SQL数据库存取和操作的公共接口(一组API)
定义了用来访问数据库的标准java类库
使用这个类库可以以一种标准的方法,方便的访问数据库资源
JDBC为了访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节技术
JDBC的目标是使java程序员使用JDBC可以连接任何提供了JDBC
驱动程序的数据库系统,这样可以是程序员无需对特定的数据库系统的特点有过多的了解
加快开发过程。
-------------------------------------------------------------------------------------------
JDBC体系结构
JDBC接口(API)包括两个层次:
1.面向 应用的API,JavaAPI,抽象接口,供应用程序开发人员使用
(连接数据库,执行SQL语句,获得结果)
2.面向数据库的API,java Driver API ,供开发商开发
数据库驱动程序
-----------------------------------------------------------------------------------------------
JDBC驱动程序的分类
JDBC驱动程序:各个数据库厂商根据JDBC的规范制作的JDBC实现的类库。
JDBC驱动程序总共有4种类型
1.JDBC-ODBC桥
2.部分本地API部分java的驱动程序
3.JDBC网络存java驱动程序
4.本地协议的纯java驱动程序
//3,4,两类都是纯java的驱动程序,因此,对于java开发者
来说,他们在性能,可移植性,功能等方面都有优势
--------------------------------------------------------------------------------------
本地协议的纯java驱动程序
1.多数数据库厂商已经指出允许客户程序通过网络直接与数据库通信的网络协议
2.这种类型的驱动程序完全使用java编写
通过与数据库建立的socket连接,采用具体厂商的网络协议吧JDBC调用
转化为直接连接的网络调用
---------------------------------------------------------------------------------------------
JDBC API是一系列的接口,它使用应用程序能够进行数据库连接,执行SQL语句,并且得到返回结果
---------------------------------------------------------------------------------------------------------------------
Driver接口
java.sql.Driver接口是所有的JDBC驱动程序需要实现的接口。
这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现
在程序中不需要直接去访问实现了Driver接口的的类,
而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现
---------------------------------------------------------------------------------------------------
/*
通过jdbc向指定的数据表中插入一条记录
*/
public void testStatement(){
/*
1.获取数据库连接
/*
Connection connection=null;
Statement statement=null;
*/
Connection Connection=getConnection();
2.准备插入的SQL语句
String sql="insert into customers (name,email,birth)"+" values (‘abcd‘,‘[email protected]‘,‘1992-10-15‘)";
3.执行插入
3.1获取操作SQL语句的Statement对象:调用Connection的createStatement()方法获取
3.2调用Statement对象的execureUpdate(SQL)执行SQL语句进行的插入
Statement statement=connection.createStatement();
statement.executeUpdate(sql);
4.关闭Statement对象
statement.close();
5.关闭连接
//注意Statement关闭是出异常时,保证Connection也要关闭
捕获异常,判断Statement对象和Connection不为空时才关闭
//关闭的顺序是:
先关闭后后获取的,即先关闭Statement然后关闭Connection对象
connection.close();
*/
(1)Statement:用于执行SQL语句的对象
(2)通过Connection的createStatement()方法获取
(3)通过executeUpdate(sql)执行SQL语句
(4)传入的SQL可以是insert,update,或者是delete但不能是select
(5)Connection,Statement都是应用程序和数据库服务器的连接资源,使用后一定要关闭
//需要在finally中关闭Connection和Statement对象
/*
try{
...
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(statement!=null){
statement.close();
}
}catch(Exception e){
e.printStackTrace();
}
if(connection!=null){
connection.close();
}
}
*/
/*sql语句
//删除语句:
String sql="delete from where id=1";
//修改语句:
String sql="update customers set name=‘tom‘ " + " where id=1 ";
*/
}
----------------------------------------------------------------------------------------------
一个通用的更新的方法:包括insert,update,delete
//版本1.0
public void static update(String sql){
Connection conn=null;
Statement statement=null;
this.sql=sql;
try{
conn=getConnection();
statement=conn.createStatement();
statement.executeUpdate(sql);
}catch(Exception e){
e.printStackTrace()
}finally{
if(statement!=null){
try{
conn.close();
}catch(Exception e2){
e2.printStackTrace()‘
}
}
if(conn!=null){
try{
conn.close();
}catch(Exception e2){
e2.printStackTrace();
}
}
}
//关闭方法:
public static void release(Statement statement,Connection conn){
if(statement!=null){
try{
conn.close();
}catch(Exception e2){
e2.printStackTrace();
}
if(conn!=null){
try{
conn.close();
}catch(Exception e2){
e2.printStackTrace();
}
}
}
---------------------------------------------------------------------------------------------------------------------------------
/*
*ResultSet对象:结果集,封装了使用JDBC进行查询的结果
*调用Statement对象的executeQuery(sql)可以得到结果集
*ResultSet返回的实际上就是一张数据表
*有一个指针指向数据表的地以后的前一列
*处理结果集:
* 初始状态:指向第一条记录的前面
* next():若返回true,就向下移动一行
*
*/
public void testResultSet(){
}
---------------------------------------------------------------------------------
mysql中,BLOB 是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据
mysql的四种BLOB类型类型(除了在存储的最大信息上不同外,他们是相同的)
-----类型-----------大小(单位,字节)
TinyBlob 最大255
Blob 最大65K
MediumBlob
最大16M
LongBlob
最大4G
-------------------------------------
实际使用中根据需要存入大小定义不同的Blob类型
需要注意的是:如果存入的文件过大,数据库性能会下降
public void testInsertBlob(){
/*插入Blob类型的数据必须使用PreparedStatement,因为Blob类型的数据时无法使用字符串拼接
*具体调用setBlob(int index,InputStream in);
*/ Connection conn=null;
PreparedStatement preparedStatement=null;
conn=JDBCTool.getConnection();
String sql="insert into customers(name,email,birth,picture) "+" values(?,?,?,?);
preparedStatement=conn.prepateStatement(sql);
preparedStatement.setString(1,"abcd");
preparedStatement.setString(2,"[email protected]");
preparedStatement.setString(3,new java.util.Date().getTime());
InputStream in=new FileInputStream("1.jpg");
preparedStatement.setBlob(4,in);
}
//读取操作
public void read(){
/*读取Blob数据:
*使用getBlob方法读取到Blob对象
*调用Blob的的getBinaryStream()得到输入流然后在使用IO操作
*/
}
------------------------------------------------------------------------------
数据库的事务处理:
在数据库中,所谓事务是指一组逻辑操作单元,是数据从一种状态变换到另种状态
为了确保数据库的一致性,数据操作应当是离散额成组的逻辑单元,当他们全部完成时,数据的一致性保持
而当成这个单元的一部分操作失败,整个事务应该视为错误,所有从起点以后的操作应去阿奴回退到开始状态
事务的ACID属性