PostgreSQL
PostgreSQL
1.PostgreSQL的简介
PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。
POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。
PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型、函数、操作符、聚集函数、索引方法、过程语言等。
另外,因为许可证的灵活,任何人都可以以任何目的免费使用、修改和分发PostgreSQL。
2.主要特点
2.1 PostgreSQL 的 主要优点如下:
1)维护者是PostgreSQL Global Development Group,首次发布于1989年6月。
2)操作系统支持WINDOWS、Linux、UNIX、MAC OS X、BSD。
3)从基本功能上来看,支持ACID、关联完整性、数据库事务、Unicode多国语言。
4)表和视图方面,PostgreSQL支持临时表,而物化视图,可以使用PL/pgSQL、PL/Perl、PL/Python或其他过程语言的存储过程和触发器模拟。
5)索引方面,全面支持R-/R+tree索引、哈希索引、反向索引、部分索引、Expression 索引、GiST、GIN(用来加速全文检索),从8.3版本开始支持位图索引。
6)其他对象上,支持数据域,支持存储过程、触发器、函数、外部调用、游标7)数据表分区方面,支持4种分区,即范围、哈希、混合、列表。
8)从事务的支持度上看,对事务的支持与MySQL相比,经历了更为彻底的测试。
9)My ISAM表处理方式方面,MySQL对于无事务的MyISAM表,采用表锁定,1个长时间运行的查询很可能会阻碍对表的更新,而PostgreSQL不存在这样的问题。
10)从存储过程上看,PostgreSQL支持存储过程。因为存储过程的存在也避免了在网络上大量原始的SQL语句的传输,这样的优势是显而易见的。
11)用户定义函数的扩展方面,PostgreSQL可以更方便地使用UDF(用户定义函数)进行扩展。
2.2 PostgreSQL 的 应用劣势如下:
1)最新版本和历史版本不分离存储,导致清理老旧版本时需要做更多的扫描,代价比较大但一般的数据库都有高峰期,如果合理安排VACUUM,这也不是很大的问题,而且在PostgreSQL9.0中VACUUM进一步被加强了。
2)在PostgreSQL中,由于索引完全没有版本信息,不能实现Coverage index scan,即查询只扫描索引,不能直接从索引中返回所需的属性,还需要访问表,而Oracle与Innodb则可以。
3 存储系统
存储系统是PostgreSQL的最底层模块,它向下通过操作系统接口访问物理数据,向上为上层模块提供存储操作的接口和函数。PostgreSQL对物理数据的访问和操作都是通过其存储系统模块来进行的。
3.1 PostgreSQL存储系统是由以下几个子模块所构成的:
1)页面管理子模块:对PostgreSQL缓冲区页面的组织结构进行定义以及提供页面操作的方法。
2)缓冲区管理子模块:管理PostgreSQL的缓冲区,包括本地缓冲区和共享缓冲区。
3)存储设备管理子模块:数据库记录是存储在存储介质上的,存储设备管理子模块将屏蔽不同物理存储设备(块设备,流设备)接口函数的差异,向上层缓冲区管理子模块提供统一的访问接口函数。
4)文件管理子模块:一般的操作系统对一个进程允许打开的文件数是有限制的,而PostgreSQL服务器有些时候需要打开的文件数是很多的,因此PostgreSQL文件管理子模块自身为了突破这个瓶颈,封装了文件的读写操作,在这里建立了一个LRU链表,通过一定的替换算法来对打开的文件进行管理,使得可以打开的文件数目不受操作系统平台的限制。
4 PGSQL的数据类型有哪些?
PGSQL主要有三种类型的数据:数值类型、字符串类型、时间\日期
5 安装说明
6 PostgreSQL与java的交互
6.1 准备工作
通过eclipse工具,新建Maven项目:
添加:postgresql的jar包
修改pom.xml文件:
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.2</version>
</dependency>
6.2 PostgreSQL与java的第一个例子
package com.rj.bd;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* @desc Java通过JDBC连接到PostgreSQL数据库
*
* @author TianShuo
*
* @version 2021年4月18日 下午6:17:19
*/
public class PostgreSqlJdbcConn {
public static void main(String[] args) {
Connection c = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/school",
"postgres", "root");
}
catch (Exception e)
{
e.printStackTrace();
System.err.println(e.getClass().getName()+": "+e.getMessage());
System.exit(0);
}
System.out.println("已经打开的连接");
}
}
6.2 PostgreSQL与java的查询
package com.rj.bd;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* @desc Java通过JDBC连接到PostgreSQL数据库【查询】
*
* @author TianShuo
*
* @version 2021年4月18日 下午6:30:11
*/
public class PostgreSqlJdbcConnSelectDatas {
public static void main(String[] args) {
Connection c = null;
Statement stmt = null;
try {
//1.创建连接
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/school",
"postgres", "root");
c.setAutoCommit(false);
System.out.println("连接数据库成功!");
//2.获取连接
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery("select * from student");//3.执行sql语句
//4.打印结果
while(rs.next())
{
String s_id = rs.getString("s_id");
String s_name = rs.getString("s_name");
System.out.println(s_id + "\t" + s_name );
}
//5.关闭连接
rs.close();
stmt.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
}
}
6.3 postgreSQL与java的添加
package com.rj.bd;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
* @desc Java通过JDBC连接到PostgreSQL数据库【 插入数据】
*
* @author TianShuo
*
* @version 2021年4月18日 下午6:24:24
*/
public class PostgreSqlJdbcConnAddDatas {
public static void main(String[] args) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/school",
"postgres", "root");
c.setAutoCommit(false);
System.out.println("连接数据库成功!");
stmt = c.createStatement();
String sql = "INSERT INTO student (s_id,s_name,c_id) "
+ "VALUES ('s006', '杰克', 'c001' );";
stmt.executeUpdate(sql);
sql = "INSERT INTO student (s_id,s_name,c_id) "
+ "VALUES ('s007', '詹姆斯', 'c003' );";
stmt.executeUpdate(sql);
sql = "INSERT INTO classes (c_id,c_name) "
+ "VALUES ('c004','4号教室');";
stmt.executeUpdate(sql);
stmt.close();
c.commit();
c.close();
} catch (Exception e) {
e.printStackTrace();
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
System.out.println("新增数据成功!");
}
}
6.4 PostgreSQL与java的删除
package com.rj.bd;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* @desc Java通过JDBC连接到PostgreSQL数据库【删除数据】
*
* @author TianShuo
*
* @version 2021年4月18日 下午6:40:35
*/
public class PostgreSqlJdbcConnDeleteData {
public static void main(String args[]) {
Connection c = null;
Statement stmt = null;
try {
//1.创建一个连接
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/school",
"postgres", "root");
c.setAutoCommit(false);
//2.获取一个连接
System.out.println("连接数据库成功!");
stmt = c.createStatement();
//3.执行sql 语句
String sql = "Delete from student where s_id = 's005' ";
stmt.executeUpdate(sql);
c.commit();
//4.打印结果
ResultSet rs = stmt.executeQuery("select * from student");
while(rs.next())
{
String s_id = rs.getString("s_id");
String s_name = rs.getString("s_name");
System.out.println(s_id + "\t" + s_name );
}
//5.关闭连接
rs.close();
stmt.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
System.out.println("删除数据成功!");
}
}
6.4 PostgreSQL与java的修改
package com.rj.bd;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* @desc Java通过JDBC连接到PostgreSQL数据库 【更新数据】
*
* @author TianShuo
*
* @version 2021年4月18日 下午6:33:51
*/
public class PostgreSqlJdbcConnUpdateData {
public static void main(String[] args) {
Connection c = null;
Statement stmt = null;
try {
//1.创建连接
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/school",
"postgres", "root");
c.setAutoCommit(false);
System.out.println("连接数据库成功!");
//2.获取连接
stmt = c.createStatement();
//3.提交sql 语句
String sql = "UPDATE student set s_name = '测试修改功能' where s_id = 's005' ";
stmt.