3、Windows下安装postgresql
Windows下安装postgresql
使用 EnterpriseDB 来下载安装,EnterpriseDB 是全球唯一一家提供基于 PostgreSQL 企业级产品与服务的厂商。下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads。选择12.8版本,之后timescale也是选择12版本,两个版本保存一致。
设置超级用户密码
5432默认端口号
一直next,直到完成安装。其它组件暂时先不安装。
配置环境变量,在Path里
打开pgAdmin
设置密码,两个密码可设置成一样
设置中文显示:File->Preference->UserLanguage 选择简体中文并刷新页面
完成
打开Navicat,连接postgresql
连接成功。
安装TimescaleDB
选择与postgresql对应的版本
关闭postgresql服务
解压timescaledb,以管理员身份运行setup.exe
,输入D:\PostgreSQL\12\data\postgresql.conf
除了上面那个路径外其他的选择yes就行。
安装完成后,启动postgresql服务,打开命令行窗口
输入create extension if not exists timescaledb cascade;
出现上图证明TimescaleDB安装成功!
第一个JDBC程序
打开命令行窗口,输入
postgres=# create database jdbcstudy; //创建数据库
postgres=# \l //查看数据库
postgres=# \c jdbcstudy //使用数据库
jdbcstudy=# create table users(
jdbcstudy(# id int primary key,
jdbcstudy(# name varchar(40),
jdbcstudy(# password varchar(40),
jdbcstudy(# email varchar(60),
jdbcstudy(# birthday DATE); //创建常规表
CREATE TABLE
jdbcstudy=# insert into users values
(1,'zhansan','123456','zhangsan@sina.com','1980-12-04'),(2,'lisi','123456','lisi@sina.com','1981-12-04'),(3,'wangwu','123456','wangwu@sina.com','1979-12-04'); //插入数据
jdbcstudy=# select * from users; //查看表
使用IDEA,新建普通java项目,连接postgresql
可以在这里看到刚才建的users表
导入postgreSQL的JDBC驱动程序jar包(https://jdbc.postgresql.org/download.html)
新建第一个JDBC程序,JdbcDemo01
package com.wang.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcDemo01 {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/jdbcstudy";
String user = "postgres";
String pwd = "201314";
Connection conn = null;
try {
Class.forName("org.postgresql.Driver");
conn = DriverManager.getConnection(url, user, pwd);
Statement st = conn.createStatement();
/* Statement:适合只执行一次或极少执行的sql文。
PreparedStatement:适合执行需要传参并且会多次执行的sql文,并且一定程度上防止了sql注入。
CallableStatement:适合执行存储过程。*/
ResultSet rs = st.executeQuery("select id,name from users");
while (rs.next()) {
System.out.println("id="+rs.getString(1)+",name is "+rs.getString(2));
}
rs.close();
st.close();
conn.close();
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
}
运行成功。
创建超表
参考官方文档,CREATE | Timescale Docs
进入jdbcstudy
数据库,输入create extension if not exists timescaledb cascade;
,将PostgreSQL数据库转换为TimescaleDB
创建标准表
CREATE TABLE conditions (
time TIMESTAMPTZ NOT NULL,
location TEXT NOT NULL,
temperature DOUBLE PRECISION NULL
);
使用create_hypertable
创建超表。(创建分布式超表使用create_distributed_hypertable
)
SELECT create_hypertable('conditions', 'time');
TimescaleDB基本操作_woai243779594的博客-CSDN博客
添加了一个新的列humidity
(需要将任何新增列默认值设置为 NULL,否则将需要填写属于此超表的所有行的此值)
ALTER TABLE conditions ADD COLUMN humidity DOUBLE PRECISION NULL;
数据可以使用标准 SQL 命令插入到超表中
INSERT INTO conditions(time, location, temperature, humidity)
VALUES (NOW(), 'office', 70.0, 50.0);
可进行多行插入(推荐)
INSERT INTO conditions
VALUES
(NOW(), 'school', 73.0, 48.0),
(NOW(), 'basement', 66.5, 60.0),
(NOW(), 'garage', 77.0, 65.2);
可以看到,多条插入时时间都是相同的,单批次插入的数据属于同一时间分区。
数据可以使用标准 SQL 命令从超表查询,包括任意子句、命令、连接、子查询、窗口功能、用户定义的功能 (UDF)、子句等。
创建测试表
pgsql常用操作
\l //列举数据库
\dt //列举表
\d Person //查看表结构
\di //查看索引
创建Person表
CREATE TABLE Person(
time TIMESTAMPTZ NOT NULL,
num INT NULL,
birthday INT NULL,
name CHAR NULL,
age INT NULL,
city CHAR NULL,
tel CHAR NULL,
PRIMARY KEY(time,num)
);
SELECT create_hypertable('Person', 'time');
\d Person //查看表结构
编写java代码,插入10000条数据
package com.wang.jdbc;
import java.io.UnsupportedEncodingException;
import java.sql.*;
import java.util.Calendar;
import java.util.Random;
public class RandomPerson {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/jdbcstudy";
String user = "postgres";
String pwd = "201314";
Connection conn = null;
PreparedStatement st = null;
try {
Class.forName("org.postgresql.Driver");
conn = DriverManager.getConnection(url, user, pwd);
for (int i = 0; i < 10000; i++) {
int birthday = Birthday();
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int age = year - birthday / 10000;
String sql = "INSERT INTO Person(time,num,birthday,name,age,city,tel) VALUES (NOW(),?,?,?,?,?,?)";
st = conn.prepareStatement(sql); //预编译
st.setInt(1, i);
st.setInt(2, birthday);
st.setString(3, getName());
st.setInt(4, age);
st.setString(5, getCity());
st.setString(6, getTel());
st.executeUpdate();
}
System.out.println("完成");
st.close();
conn.close();
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
//随机出生日期
private static int Birthday() {
int start = 1961;
int end = 2001;
Calendar birthday = Calendar.getInstance();
birthday.set(Calendar.YEAR, (int) (Math.random() *(end-start+1))+start);
birthday.set(Calendar.MONTH, (int) (Math.random() * 12));
birthday.set(Calendar.DATE, (int) (Math.random() * 31));
StringBuilder builder = new StringBuilder();
builder.append(birthday.get(Calendar.YEAR));
long month = birthday.get(Calendar.MONTH) + 1;
if (month < 10) {
builder.append("0");
}
builder.append(month);
long date = birthday.get(Calendar.DATE);
if (date < 10) {
builder.append("0");
}
builder.append(date);
return Integer.parseInt(builder.toString());
}
//随机城市
private static String getCity(){
String[] address = {"北京","上海","广州","西安","重庆","南京","拉萨","大理","成都","深圳",
"天津","烟台","呼和浩特","武汉","长沙","杭州","苏州","香港","郑州","大连"};
int a = (int) (Math.random()*10);
return address[a];
}
//随机电话
private static String getTel() {
String[] telFirst="134,135,136,137,138,139,150,151,152,157,158,159,130,131,132,155,156,133,153".split(",");
int index=getNum(0,telFirst.length-1);
String first=telFirst[index];
String second=String.valueOf(getNum(1,888)+10000).substring(1);
String third=String.valueOf(getNum(1,9100)+10000).substring(1);
return first+second+third;
}
public static int getNum(int start,int end)
{
return (int)(Math.random()*(end-start+1)+start);
}
//随机姓名
public static String getName() {
Random random = new Random();
String[] Surname = { "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许",
"何","吕","施","张","孔","曹","严","华","金","魏","陶","姜","戚","谢","邹","喻","柏","水","窦","章"};
int index = random.nextInt(Surname.length - 1);
String name = Surname[index]; // 获得一个随机的姓氏
/* 从常用字中选取一个或两个字作为名 */
if (random.nextBoolean()) {
name += RandomPerson.getChinese() + RandomPerson.getChinese();
} else {
name += RandomPerson.getChinese();
}
return name;
}
public static String getChinese() {
String str = null;
int highPos, lowPos;
Random random = new Random();
highPos = (176 + Math.abs(random.nextInt(71)));// 区码,0xA0打头,从第16区开始,即0xB0=11*16=176,16~55一级汉字,56~87二级汉字
random = new Random();
lowPos = 161 + Math.abs(random.nextInt(94));// 位码,0xA0打头,范围第1~94列
byte[] bArr = new byte[2];
bArr[0] = (new Integer(highPos)).byteValue();
bArr[1] = (new Integer(lowPos)).byteValue();
try {
str = new String(bArr, "GB2312"); // 区位码组合成汉字
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return str;
}
插入数据时,可变换这方式插入,例如增加延时,编写多条插入的sql语句
Thread.sleep(100); //延时