Java-024-数据库和jdbc

数据库和JDBC

关于数据库的What和Why

之前我们在计算机程序模型中提到过, 在计算机世界中需要处理的几个核心问题:

  • 存储
  • 计算
  • 交互

具体到存储这一块, 之前我们了解过

  • 存储设备 – 内存和硬盘, 以及对具体硬盘磁片的存储单元, 块和内存的存储单元
  • 文件系统 – 在操作系统层面上对存储的抽象, 比如说目录和文件.
  • 应用程序 – 针对不同的应用场景, 可能数据内容的形式和模型会有不同的需求. 比如说, Web程序可能很多文本形式的数据, 多媒体数据等等

数据库则是提供针对不同类型的应用程序 (Web前端程序, Web后端程序, 终端应用等等)的通用数据存储需求的存储需求的高级抽象

本质上, 我们谈存储和数据, 就是在谈状态. 比如:

  • 账号信息
  • 产品信息
  • 订单信息等等

存储, 不管哪个层面上, 都是为了在特定的时限内保存这些实体的状态.

然后很重要的一类计算就是对这些实体的状态的转换和维护, 以及比如:

  • 更新账号密码
  • 更新产品的库存
  • 创建订单

从各种各样的应用程序的实例中, 提炼抽象出的一些通用的数据存储需求, 一起实现到一套系统中, 就产生了数据库:

  • 数据存储
  • 数据结构和组织
  • 数据索引 (如何找到数据)
  • 数据的更新和查询
  • 数据的备份和冗余 (防止丢失和保持可用)
  • 数据一致性, 事务
  • 数据管理
  • 等等

市面上各种不同的数据库, 就是针对不同的场景和不同的需求, 对以上的问题提出针对性的解决方案, 并且有不同的侧重点

数据库类型

按照上面的逻辑, 数据库的特性和应用需求是多维度的. 所以我们在考虑数据库的分类的时候, 也得从不同维度来考虑!

从数据结构和组织

关系数据库 / SQL

MySQL, Oracle, DB2, PostgreSQL, SQLite

对象 / Document / 列-Based (NoSQL)

MongoDB, DynamoDB 等等

Key-Value
leveldb

时间序列
比如金融量化交易系统的金融数据, 时间维度是很重要的!

从数据存储

终端应用数据库

在应用本地存储数据的数据库, 比如说Web前端, Android/ios应用的本地数据库.

  • SQLite

内存数据库

在后端系统中, 可能需要一些访问更快但是不需要持久性的数据, 就可能需要在内存中的数据库. 但是可以获得更快的读取更新速度

  • Redis
  • Memcached

比如:

  • Web程序中的用户登录状态, 就可以存储在内存里, 如果Web后端程序重启之后, 内存的数据库会丢失, 但是只需要用户重新登录就好了, 但是可以获得更快的读取和更新速度
  • 爬虫中的已经访问过的URLs

持久化数据库

MySQL, Oracle, MongoDB可能会更关注持久性存储, 冗余和备份, 保证数据的安全(Security和Safety)等等.

分布式数据库

数据规模扩大之后, 可能需要在多台机器 (分布式) 上存储, 同时提供保证大量数据的存储能力, 数据冗余, 高吞吐的能力

  • HBase
  • Cassandra

云数据库

云上的完整解决方案, 按需付费, 可伸缩性, 更专业稳定的运维能力

  • DynamoDB
  • 腾讯云数据库
  • 阿里云数据库

区块链

区块链本质上是一个可以完全分布到整个互联网的数据库!

关系数据库

关系型数据库是对一类数据库设计经验的总结和设计方法的抽象,以期得到一个通用的数据库的解决方法

关系数据组织数据的基本结构:

  • 数据库
  • 数据库表
  • 数据库字段
  • 数据库记录

SQL是一个对SQL数据库的查询和操作的通用语言

JDBC

Java程序连接SQL数据库,操作SQL数据库和执行SQL语句的库.

  • 程序接口
  • 数据库驱动程序

sqlite-jdbc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcSample {
public static void main(String[] args)
{
Connection connection = null;
try {
// 创建数据库连接
connection = DriverManager.getConnection("jdbc:sqlite:resources/sample.db");
Statement statement = connection.createStatement();
statement.setQueryTimeout(30); // set timeout to 30 sec.

statement.executeUpdate("drop table if exists person");
statement.executeUpdate("create table person (id integer, name string)");
statement.executeUpdate("insert into person values(1, 'leo')");
statement.executeUpdate("insert into person values(2, 'yui')");
ResultSet rs = statement.executeQuery("select * from person");
while(rs.next()) {
// read the result set
System.out.println("name = " + rs.getString("name"));
System.out.println("id = " + rs.getInt("id"));
}
} catch(SQLException e) {
// if the error message is "out of memory",
// it probably means no database file is found
System.err.println(e.getMessage());
} finally {
try {
if(connection != null)
connection.close();
} catch(SQLException e) {
// connection close failed.
System.err.println(e);
}
}
}
}

参考资料

数据库学习

数据库选择

项目

代码链接