数据的持久化
在计算机科学中,数据的持久化是指将数据从临时存储(如内存)保存到持久存储介质中(如硬盘、数据库等),在程序关闭或系统重启后仍然可以访问和使用这些数据。
在软件开发中,数据的持久化是非常重要的,因为它确保了数据的长期保存和可靠性。通常情况下,数据的持久化可以通过文件系统、数据库、网络存储等方式来实现。例如,将数据保存在文件中、将数据存储在关系型数据库或非关系型数据库中,或者通过网络将数据传输到其他系统进行存储等方式都可以实现数据的持久化。
持久化的数据可以用于数据分析、报告生成、历史记录、数据恢复等各种用途,对于软件系统的稳定性和可靠性具有重要意义。
在Java中,有多种数据存储技术可供选择,包括以下几种主要的方式:
文件存储:Java可以使用文件系统来进行数据存储,可以通过File类和相关的输入输出流来读写文件。这种方式适用于小型数据集,但对于大量数据的管理和查询可能不够高效。
关系型数据库:Java可以通过JDBC或ORM框架(如Hibernate、MyBatis等)来连接和操作关系型数据库,如MySQL、Oracle、SQL Server等。通过使用SQL语言,可以进行数据的增删改查等操作。
非关系型数据库:Java也支持多种非关系型数据库(NoSQL),如MongoDB、Redis、Cassandra等。这些数据库通常适用于大规模数据存储和分布式系统,可以存储半结构化和非结构化数据。
对象数据库:Java还支持对象数据库,这种数据库将对象直接持久化到数据库中,如db4o、ObjectDB等。这种方式适用于需要将对象直接存储到数据库中的场景。
内存数据库:Java中也有一些内存数据库,如H2、HSQLDB等,它们将数据存储在内存中,适用于对性能要求较高的场景。
JDBC
概述
JDBC(Java Database Connectivity)是Java语言访问数据库的一种标准接口(java.sql包下),为Java应用程序提供一种统一的方式来访问各种不同的关系型数据库,而不需要依赖特定数据库的API或驱动程序。
JDBC的目标包括:
数据库无关性:JDBC提供了一种数据库无关的编程接口,使得Java应用程序可以通过统一的方式访问不同数据库管理系统(DBMS)的数据,而不需要修改应用程序的代码。
简化数据库访问:JDBC封装了与数据库的交互细节,简化了数据库连接、SQL语句执行、结果集处理等操作,使得开发人员可以更加专注于业务逻辑的实现,而不需要处理繁琐的数据库访问细节。
提供标准化的API:JDBC定义了一组标准的接口和类,使得开发人员可以使用统一的API来访问数据库,而不需要依赖特定数据库的API或驱动程序。
JDBC的使用包括以下几个步骤:
加载数据库驱动程序:首先需要加载特定数据库的驱动程序,这可以通过Class.forName()方法来实现。
建立数据库连接:使用DriverManager.getConnection()方法来建立与数据库的连接,需要提供数据库的URL、用户名和密码。
创建Statement对象:通过连接对象创建Statement对象,用来执行SQL语句并返回结果。
执行SQL语句:使用Statement对象执行SQL语句,可以是查询、更新或删除操作。
处理结果集:如果执行的是查询操作,需要通过ResultSet对象来处理返回的结果集。
关闭连接:在使用完数据库之后,需要关闭连接和相关资源,以释放数据库资源和避免内存泄漏。
JDO、Hibernate、MyBatis等只是更好的封装了JDBC。
简单使用示例
// 使用Statement实现对数据表的查询操作
public <T> T get(String sql, Class<T> clazz) {
T t = null;
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
// 1.加载配置文件
InputStream is = StatementTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
// 2.读取配置信息
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
// 3.加载驱动
Class.forName(driverClass);
// 4.获取连接
conn = DriverManager.getConnection(url, user, password);
// 5.创建Statement对象
st = conn.createStatement();
// 6.执行SQL语句
rs = st.executeQuery(sql);
// 7.处理结果集
ResultSetMetaData rsmd = rs.getMetaData();
// 获取结果集的列数
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
t = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {
// 1. 获取列的别名
String columnName = rsmd.getColumnLabel(i + 1);
// 2. 根据列名获取对应数据表中的数据
Object columnVal = rs.getObject(columnName);
// 3. 将数据表中得到的数据,封装进对象
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t, columnVal);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 8.关闭资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return null;
}
JDBC事务
public class JDBCTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
// 开启事务
conn.setAutoCommit(false);
ps = conn.prepareStatement("select ename,job,sal from emp where job = ? for update ");
ps.setString(1,"MANAGER");
rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("ename") + "," + rs.getString("job") + "," + rs.getString("sal"));
}
// 提交事务(事务结束)
conn.commit();
} catch (SQLException throwables) {
// 回滚事务(事务结束)
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
} finally {
DBUtil.close(conn,ps,rs);
}
}
}
评论区