目录
前言
前文提到了用statement的方式,操作ProcessDB时序数据库,我们实际工作中可能更常使用的是 PreparedStatement方式,优点如下:1、可以防止SQL注入攻击。 2、进行动态查询。3、执行更快。4、简化拼接过程。所以,我在这里着重讲解下如何用PreparedStatement方式,操作ProcessDB实时/时序数据库的数据点对象
一、数据表字段介绍
CREATE TABLE P_TABLE (
NAME_F STRING;//数据点名,
ARCHIVED_F BYTE;//是否保存历史数据(默认不填写,则不保存)0是未存档,1是存档,
ALARM_HIGH_F FLOAT;//告警高限,
PERIOD_F SHORT;//计算周期 计算点专属属性,
ALARM_GROUP_ID_F INT;//告警分组ID,
INIT_VALUE_F FLOAT;//初始值,
COMPRESS_F BYTE;//时间维度 0是deadband死区压缩, 1是linuar线性压缩,
//2是None无压缩,
PRIORITY_F BYTE;//优先级 低是2 中是1 高是0,
ALARM_TYPE_F BYTE;//告警类别 NO ALARM无告警 DEAD ZONE ALARM死区告警
// TIMEOUT ALARM超时告警 ON ALARM 开启告警 OFF ALARM关闭告警
// CHANGE ALARM 变化 LOW HIGH 低高限 LL HH 低低高高限,
TIME_UNIT_F BYTE;//分辨率 0是秒 1是毫秒 2是微秒,
ALARM_SWITCH_F BYTE;//是否告警(必填) 0是告警 1是告警,
FORMAT_F BYTE;//小数精度 例如数据类型为int,则没有小数精度,
TIMEOUT_INTERVAL SHORT;//存历史超时时间,
IS_REFFER BOOLEAN;//是否引用点ID TRUE或者FALSE,
DEVIATION_F FLOAT;//量程数值,默认是百分之0.05,
EXPRESSION_F STRING;//计算公式 计算点专属属性,
DEV_TYPE_F BYTE;//按量程百分比是PERCENT或者0,按量程物理值是PHYSIC或者1,
ALARM_LOW_F FLOAT;//告警低限,
DESC_F STRING;//数据点描述,
POINT_TYPE_F BYTE;//数据点类型 0是采样点 1是统计点 2是计算点,
IO_TYPE_F BYTE;//IO类型 0为输入 1为输出 2为中间变量 3为网关 (采样点专属属性),
REFFER_ID INT;//引用数据点ID,
DATA_TYPE_F BYTE;//数据类型,
BOTTOM_SCALE_F FLOAT;//量程低限,
ALARM_LEVEL_F BYTE;//告警级别 none是ZERO 一级是ONE 二级是TWO
//三级是THREE 四级是FOUR,
FORCE_SAVE_INTERVAL SHORT;//强制存历史数据时间,
ALARM_LL_F FLOAT;//告警低低限,
UNIT_F STRING;//单位,
ALARM_HH_F FLOAT;//告警高高限,
SPACE_COMPRESS_F BYTE;//空间维度 1是差值压缩,2是数据块压缩,3是两者全选,
TOP_SCALE_F FLOAT;//量程高限
)
二、创建数据点
具有联级创建功能,新建数据点时若上级数据表或者数据库不存在,则默认创建一个与填写信息同名的数据库与数据表
由于创建数据点,需要分三个模块的信息,由于本文章主要介绍PreparedStatement的使用。所以每个模块的详细信息,请参考:ProcessDB实时/时序数据库——JDBC之数据点的增删改查
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) {
try {
/**
* 点的设置比较复杂,分成三块进行示例
* 分别是基础信息,历史存储信息,告警信息
* 该示例是创建数据点的基础信息
*/
Class.forName("com.processdb.jdbc.JDBC");
Connection connection = null;
Statement statement = null;
try {
// 对数据库进行连接
connection = DriverManager.getConnection("jdbc:processdb://localhost:8301/instance01", "root", "root");
statement = connection.createStatement();
// 设置超时时间
statement.setQueryTimeout(30); // set timeout to 30 sec.
/**创建新数据点 P_TABLE
* 所需字段
* ALARM_SWITCH_F 是否报警(必填) 0是报警 1是报警
* NAME_F 数据点名称
* IS_REFFER 是否引用其他数据点 TRUE或者FALSE
* REFFER_ID 引用数据点ID
* POINT_TYPE_F 数据点类型 Sample是 采样点 Cacl是 计算点
* INIT_VALUE_F 初始值
* IO_TYPE_F IO类型 0为输入 1为输出 2为中间变量 3为网关 采样点专属属性
* TOP_SCALE_F 量程高限
* BOTTOM_SCALE_F 量程低限
* DATA_TYPE_F 数据类型
* UNIT_F 单位
* TIME_UNIT_F 分辨率 0是秒 1是毫秒 2是微秒
* PRIORITY_F 优先级 低是2 中是1 高是0
* EXPRESSION_F 计算公式 计算点专属属性
* PERIOD_F 计算周期 计算点专属属性
* FORMAT_F 小数精度 例如数据类型为int,则没有小数精度
* DESC_F 数据点描述
*
*
*/
// sql
String sql = "INSERT INTO P_TABLE (ALARM_SWITCH_F,NAME_F,IS_REFFER,POINT_TYPE_F,INIT_VALUE_F,IO_TYPE_F,TOP_SCALE_F,BOTTOM_SCALE_F,DATA_TYPE_F,UNIT_F,TIME_UNIT_F,PRIORITY_F,OFFSET_F,DESC_F) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
// 运行sql发起请求
String param1 = "0";
String param2 = "D7.T7.P7";
String param3 = "false";
String param4 = "Sample";
String param5 = "70";
String param6 = "0";
String param7 = "500";
String param8 = "66";
String param9 = "FLOAT32";
String param10 = "t";
String param11 = "1";
String param12 = "1";
String param13 = "4";
String param14 = "Description";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, param1);
ps.setString(2, param2);
ps.setString(3, param3);
ps.setString(4, param4);
ps.setString(5, param5);
ps.setString(6, param6);
ps.setString(7, param7);
ps.setString(8, param8);
ps.setString(9, param9);
ps.setString(10, param10);
ps.setString(11, param11);
ps.setString(12, param12);
ps.setString(13, param13);
ps.setString(14, param14);
// 运行sql发起请求
ps.executeUpdate();
System.out.println("Create Point Success");
} catch (SQLException e) {
System.err.println(e.getMessage());
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
System.err.println(e);
}
}
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
return;
}
return;
}
}
三、删除数据点
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) {
try {
Class.forName("com.processdb.jdbc.JDBC");
Connection connection = null;
Statement statement = null;
try {
// 对数据库进行连接
connection = DriverManager.getConnection("jdbc:processdb://localhost:8301/instance01", "root", "root");
statement = connection.createStatement();
// 设置超时时间
statement.setQueryTimeout(30); // set timeout to 30 sec.
// sql
/**删除数据点 P_TABLE
* 所需字段
* name_f 数据库名称加数据表名称加点的名称(例如:TEST01.TEST002.STAT)
*/
String sql = "delete from P_TABLE where name_f = ?";
String param1 = "D7.T7.P7";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, param1);
// 运行sql发起请求
ps.executeUpdate();
System.out.println("Delete POINT Success");
} catch (SQLException e) {
System.err.println(e.getMessage());
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
System.err.println(e);
}
}
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
return;
}
return;
}
}
四、修改数据点
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) {
try {
Class.forName("com.processdb.jdbc.JDBC");
Connection connection = null;
Statement statement = null;
try {
// 对数据库进行连接
connection = DriverManager.getConnection("jdbc:processdb://localhost:8301/instance01", "root", "root");
statement = connection.createStatement();
// 设置超时时间
statement.setQueryTimeout(30); // set timeout to 30 sec.
// sql
/**修改数据点信息 P_TABLE
* 所需字段
* name_f 数据库名称加数据表名称加点的名称(例如:TEST01.TEST002.STAT)
*
* 可修改字段
* ***基础信息***
* INIT_VALUE_F 初始值
* UNIT_F 单位
* TOP_SCALE_F 量程高限
* BOTTOM_SCALE_F 量程低限
* DESC_F 描述
* FORMAT_F 小数精度
* PRIORITY_F 优先级 低是2 中是1 高是0
*
* ***基础信息(计算点专属)***
* PERIOD_F 计算周期
* EXPRESSION_F 计算公式
*
* ***历史存储信息***
* ARCHIVED_F 是否保存历史数据(默认不填写,则不保存)0是未存档,1是存档
* FORCE_SAVE_INTERVAL 强制存历史数据时间
* TIMEOUT_INTERVAL 超时时间
* SPACE_COMPRESS_F 空间维度 1是差值压缩,2是数据块压缩,3是两者全选
* DEV_TYPE_F 按量程百分比是PERCENT,按量程物理值是PHYSIC
* DEVIATION_F 默认是百分之0.05
* COMPRESS_F 时间维度 0是deadband死区压缩, 1是linuar线性压缩, 2是None无压缩
*
* ***告警信息***
* ALARM_SWITCH_F 是否告警(必填) 0是告警 1是告警
* ALARM_ACK_TYPE_F 响应方式 MANUAL 还有 AUTO
* ALARM_TYPE_F 告警类别 NO ALARM无告警 DEAD ZONE ALARM死区告警 TIMEOUT ALARM超时告警 ON ALARM 开启告警 OFF ALARM关闭告警 CHANGE ALARM 变化 LOW HIGH 低高限 LL HH 低低高高限
* ALARM_LEVEL_F 告警级别 none是ZERO 一级是ONE 二级是TWO 三级是THREE 四级是FOUR
* ALARM_HIGH_F 告警高限
* ALARM_LOW_F 告警低限
* ALARM_HH_F 告警高高限
* ALARM_LL_F 告警低低限
* ALARM_GROUP_ID_F 告警分组id
*/
String sql = "Update P_TABLE set INIT_VALUE_F = ? , UNIT_F =? ,TOP_SCALE_F = ? , BOTTOM_SCALE_F = ?, DESC_F =?, FORMAT_F = ? ,PRIORITY_F = ?,PERIOD_F= ?,"
+"ARCHIVED_F=?,FORCE_SAVE_INTERVAL =?,TIMEOUT_INTERVAL=?, SPACE_COMPRESS_F = ?,COMPRESS_F=?,DEV_TYPE_F=?,DEVIATION_F=?,"
+"ALARM_SWITCH_F =?,ALARM_ACK_TYPE_F=?,ALARM_TYPE_F=?,ALARM_LEVEL_F=?,ALARM_HIGH_F=?,ALARM_LOW_F=?,ALARM_HH_F=?,ALARM_LL_F=?,ALARM_GROUP_ID_F=? where name_f= ?";
// 运行sql发起请求
String param1 = "78";
String param2 = "N/A";
String param3 = "360";
String param4 = "3";
String param5 = "hhhh";
String param6 = "5";
String param7 = "0";
String param8 = "3";
String param9 = "1";
String param10 = "998";
String param11 = "98";
String param12 = "3";
String param13 = "1";
String param14 = "PERCENT";
String param15 = "3";
String param16 = "1";
String param17 = "AUTO";
String param18 = "TIMEOUT ALARM";
String param19 = "FOUR";
String param20 = "340";
String param21 = "5";
String param22 = "350";
String param23 = "4";
String param24 = "78";
String param25 = "D7.T7.P7";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, param1);
ps.setString(2, param2);
ps.setString(3, param3);
ps.setString(4, param4);
ps.setString(5, param5);
ps.setString(6, param6);
ps.setString(7, param7);
ps.setString(8, param8);
ps.setString(9, param9);
ps.setString(10, param10);
ps.setString(11, param11);
ps.setString(12, param12);
ps.setString(13, param13);
ps.setString(14, param14);
ps.setString(15, param15);
ps.setString(16, param16);
ps.setString(17, param17);
ps.setString(18, param18);
ps.setString(19, param19);
ps.setString(20, param20);
ps.setString(21, param21);
ps.setString(22, param22);
ps.setString(23, param23);
ps.setString(24, param24);
ps.setString(25, param25);
// 运行sql发起请求
ps.executeUpdate();
System.out.println("Update Point Success");
} catch (SQLException e) {
System.err.println(e.getMessage());
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
System.err.println(e);
}
}
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
return;
}
return;
}
}
五、查询数据点
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) {
try {
Class.forName("com.processdb.jdbc.JDBC");
Connection connection = null;
Statement statement = null;
try {
// 对数据库进行连接
connection = DriverManager.getConnection("jdbc:processdb://localhost:8301/instance01", "root", "root");
statement = connection.createStatement();
// 设置超时时间
statement.setQueryTimeout(30); // set timeout to 30 sec.
ResultSet rs = null;
// sql
/**查询数据点信息 P_TABLE
* 所需字段
* name_f 数据库名称加数据表名称加点的名称(例如:TEST01.TEST002.SAMPLE002) 必填
* 若要查询一张表下的所有点信息,则输入库名加表名即可,库下所有点信息同理,若要查询该连接下所有点信息,则传空字符串即可
* 或者 id_f 数据点id ,根据数据点id进行精确查询
* 可查询字段
* ***基础信息***
* desc_f 数据库描述
* INIT_VALUE_F 初始值
* UNIT_F 单位
* TOP_SCALE_F 量程高限
* BOTTOM_SCALE_F 量程低限
* REFFER_ID 引用数据点ID
* POINT_TYPE_F 数据点类型 Sample是 采样点 Cacl是 计算点
* IO_TYPE_F IO类型 0为输入 1为输出 2为中间变量 3为网关 采样点专属属性
* DATA_TYPE_F 数据类型
* TIME_UNIT_F 分辨率 0是秒 1是毫秒 2是微秒
* PRIORITY_F 优先级 低是2 中是1 高是0
* EXPRESSION_F 计算公式 计算点专属属性
* PERIOD_F 计算周期 计算点专属属性
* FORMAT_F 小数精度 例如数据类型为int,则没有小数精度
*
* ***历史存储信息***
* ARCHIVED_F 是否保存历史数据(默认不填写,则不保存)0是未存档,1是存档
* FORCE_SAVE_INTERVAL 强制存历史数据时间
* TIMEOUT_INTERVAL 超时时间
* DEV_TYPE_F 按量程百分比是PERCENT,按量程物理值是PHYSIC
* DEVIATION_F 默认是百分之0.05
* COMPRESS_F 时间维度 0是deadband死区压缩, 1是linuar线性压缩, 2是None无压缩
* SPACE_COMPRESS_F 空间维度 1是差值压缩,2是数据块压缩,3是两者全选
*
* ***告警信息***
* ALARM_SWITCH_F 是否告警(必填) 0是告警 1是告警
* ALARM_ACK_TYPE_F 响应方式 MANUAL 还有 AUTO
* ALARM_TYPE_F 告警类别 NO ALARM无告警 DEAD ZONE ALARM死区告警 TIMEOUT ALARM超时告警 ON ALARM 开启告警 OFF ALARM关闭告警 CHANGE ALARM 变化 LOW HIGH 低高限 LL HH 低低高高限
* ALARM_LEVEL_F 告警级别 none是ZERO 一级是ONE 二级是TWO 三级是THREE 四级是FOUR
* ALARM_HIGH_F 告警高限
* ALARM_LOW_F 告警低限
* ALARM_HH_F 告警高高限
* ALARM_LL_F 告警低低限
* ALARM_GROUP_ID_F 告警分组id
*/
// String sql = "select ARCHIVED_F,ALARM_GROUP_ID_F,desc_f from P_TABLE where name_f ='TEST01.TEST002.TTTT'";
String sql = "select * from P_TABLE where id_f = ?";
String sql2 = "select * from P_TABLE where name_f = ?";
String param1 = "1009000004";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, param1);
// 运行sql发起请求
rs = ps.executeQuery();
System.out.println("Query P_TABLE Success");
while (rs.next()) {
System.out.println("ID:" + rs.getString("ID_F")+",desc_f:"+rs.getString("desc_f")
+",量程高限:"+rs.getString("TOP_SCALE_F")+",告警级别:"+rs.getString("ALARM_LEVEL_F")+",单位:"+rs.getString("unit_f"));}
System.out.println("Count: " + rs.getRow());
} catch (SQLException e) {
System.err.println(e.getMessage());
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
System.err.println(e);
}
}
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
return;
}
return;
}
}
示例运行结果:
Query P_TABLE Success
ID:1009000004,desc_f:hhhh,量程高限:360.0,告警级别:Four,单位:N/A
Count: 1
六、查询数据表列表
支持上级查询,只输入数据库名,则是该数据库下所有点信息,输入数据库加表名,这是该数据表下的所有点信息,若要查询该连接下的所有点信息,则输入空字符串
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) {
try {
Class.forName("com.processdb.jdbc.JDBC");
Connection connection = null;
Statement statement = null;
try {
// 对数据库进行连接
connection = DriverManager.getConnection("jdbc:processdb://localhost:8301/instance01", "root", "root");
statement = connection.createStatement();
// 设置超时时间
statement.setQueryTimeout(30); // set timeout to 30 sec.
ResultSet rs = null;
// sql
/**查询数据点信息 P_TABLE
* 所需字段
* name_f 数据库名称加数据表名称加点的名称(例如:TEST01.TEST002.SAMPLE002) 必填
* 若要查询一张表下的所有点信息,则输入库名加表名即可,库下所有点信息同理,若要查询该连接下所有点信息,则传空字符串即可
* 或者 id_f 数据点id ,根据数据点id进行精确查询
* 可查询字段
* ***基础信息***
* desc_f 数据库描述
* INIT_VALUE_F 初始值
* UNIT_F 单位
* TOP_SCALE_F 量程高限
* BOTTOM_SCALE_F 量程低限
* REFFER_ID 引用数据点ID
* POINT_TYPE_F 数据点类型 Sample是 采样点 Cacl是 计算点
* IO_TYPE_F IO类型 0为输入 1为输出 2为中间变量 3为网关 采样点专属属性
* DATA_TYPE_F 数据类型
* TIME_UNIT_F 分辨率 0是秒 1是毫秒 2是微秒
* PRIORITY_F 优先级 低是2 中是1 高是0
* EXPRESSION_F 计算公式 计算点专属属性
* PERIOD_F 计算周期 计算点专属属性
* FORMAT_F 小数精度 例如数据类型为int,则没有小数精度
*
* ***历史存储信息***
* ARCHIVED_F 是否保存历史数据(默认不填写,则不保存)0是未存档,1是存档
* FORCE_SAVE_INTERVAL 强制存历史数据时间
* TIMEOUT_INTERVAL 超时时间
* DEV_TYPE_F 按量程百分比是PERCENT,按量程物理值是PHYSIC
* DEVIATION_F 默认是百分之0.05
* COMPRESS_F 时间维度 0是deadband死区压缩, 1是linuar线性压缩, 2是None无压缩
* SPACE_COMPRESS_F 空间维度 1是差值压缩,2是数据块压缩,3是两者全选
*
* ***告警信息***
* ALARM_SWITCH_F 是否告警(必填) 0是告警 1是告警
* ALARM_ACK_TYPE_F 响应方式 MANUAL 还有 AUTO
* ALARM_TYPE_F 告警类别 NO ALARM无告警 DEAD ZONE ALARM死区告警 TIMEOUT ALARM超时告警 ON ALARM 开启告警 OFF ALARM关闭告警 CHANGE ALARM 变化 LOW HIGH 低高限 LL HH 低低高高限
* ALARM_LEVEL_F 告警级别 none是ZERO 一级是ONE 二级是TWO 三级是THREE 四级是FOUR
* ALARM_HIGH_F 告警高限
* ALARM_LOW_F 告警低限
* ALARM_HH_F 告警高高限
* ALARM_LL_F 告警低低限
* ALARM_GROUP_ID_F 告警分组id
*/
// String sql = "select ARCHIVED_F,ALARM_GROUP_ID_F,desc_f from P_TABLE where name_f ='TEST01.TEST002.TTTT'";
String sql = "select * from P_TABLE where name_f = ?";
String param1 = "PUBLIC.sys";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, param1);
// 运行sql发起请求
rs = ps.executeQuery();
System.out.println("Query P_TABLE Success");
while (rs.next()) {
System.out.println("ID:" + rs.getString("ID_F")+",desc_f:"+rs.getString("desc_f")
+",量程高限:"+rs.getString("TOP_SCALE_F")+",告警级别:"+rs.getString("ALARM_LEVEL_F")+",单位:"+rs.getString("unit_f"));}
System.out.println("Count: " + rs.getRow());
} catch (SQLException e) {
System.err.println(e.getMessage());
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
System.err.println(e);
}
}
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
return;
}
return;
}
}
示例运行结果:
Query P_TABLE Success
ID:1001000001,desc_f:System total cpu load rate,量程高限:100.0,告警级别:None,单位:%
ID:1001000002,desc_f:System physical memory usage rate,量程高限:100.0,告警级别:None,单位:%
ID:1001000003,desc_f:System disk read speed,量程高限:100.0,告警级别:None,单位:m/s
ID:1001000004,desc_f:System disk write speed,量程高限:100.0,告警级别:None,单位:m/s
ID:1001000005,desc_f:System net read speed,量程高限:100.0,告警级别:None,单位:m/s
ID:1001000006,desc_f:System net write speed,量程高限:100.0,告警级别:None,单位:m/s
ID:1001000007,desc_f:ProcessDB cpu load rate,量程高限:100.0,告警级别:None,单位:%
ID:1001000008,desc_f:ProcessDB physical memory used,量程高限:100.0,告警级别:None,单位:M
ID:1001000009,desc_f:System disk free space,量程高限:100.0,告警级别:None,单位:M
ID:1001000010,desc_f:Used handle count,量程高限:100.0,告警级别:None,单位:M
ID:1001000011,desc_f:OS running time,量程高限:100.0,告警级别:None,单位:H
ID:1001000012,desc_f:ProcessDB running time,量程高限:100.0,告警级别:None,单位:M
ID:1001000013,desc_f:ProcessDB thread count,量程高限:100.0,告警级别:None,单位:M
ID:1001000014,desc_f:System disk available space,量程高限:100.0,告警级别:None,单位:M
ID:1001000015,desc_f:System disk available space,量程高限:1.0,告警级别:None,单位:N/A
Count: 15