9.14. JDBC转换器¶
JDBC转换器允许您使用标准的JDBC库,直接从SQL SELECT语句针对现有数据库创建SimpleFeature。要使用JDBC转换器,请指定 type = "jdbc"
在您的转换器定义中。
警告
JDBC转换器不清理查询。注意输入,因为恶意参与者可能会执行SQL注入攻击。
9.14.1. 配置¶
用于连接到数据库的JDBC连接字符串必须使用 connection
元素,例如 jdbc:mysql://localhost/test?user=foo&password=bar
。
JDBC转换器依赖于标准的JDBC库,并且需要用于所使用的数据库的正确的JDBC驱动程序。确保类路径上有正确的驱动程序;对于GeoMesa二进制发行版,它可以放在 lib
文件夹。
JDBC转换器接受SQL SELECT语句作为输入。由于SELECT语句可以返回任意列,因此需要确保返回的字段与转换器定义匹配。
9.14.2. 变换函数¶
这个 transform
元素支持通过引用SQL结果集的列 $
记数法。与标准中一样,字段由索引标识 ResultSet
(即第一个字段是索引1,第二个字段是索引2,依此类推)。这个 0
索引是所有其他字段的串联字符串-这与基于文件的转换器的行为相匹配,对于生成唯一ID非常有用。字段值将具有数据库列的本机类型绑定。例如, VARCHAR
将被转换为 String
, TIMESTAMP
将成为一种 java.sql.Date
等
JDBC转换器还支持标准转换函数;请参见 变换函数概述 了解更多详细信息。
9.14.3. 命令行接收¶
标准命令行摄取需要对数据文件进行操作。您可以将SELECT语句放在一个文件中(每行一个),也可以使用 stdin 要将SELECT语句通过管道传递到摄取命令:
$ echo "select * from example limit 5" | geomesa ingest ... -c example_jdbc -C example-jdbc -s example-jdbc
INFO Creating schema example-jdbc
INFO Running ingestion in local mode
INFO Ingesting from stdin with 1 thread
[============================================================] 100% complete 5 ingested 0 failed in 00:00:01
INFO Local ingestion complete in 00:00:01
INFO Ingested 5 features with no failures.
9.14.4. 用法示例¶
假设MySQL中有以下表格:
mysql> describe example;
+-------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+-------------------+-----------------------------+
| id | bigint(20) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| dtg | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| lat | double | YES | | NULL | |
| lon | double | YES | | NULL | |
+-------+-------------+------+-----+-------------------+-----------------------------+
5 rows in set (0.00 sec)
目标简单要素类型定义为:
"example-jdbc" = {
attributes = [
{ name = "name", type = "String" }
{ name = "dtg", type = "Date" }
{ name = "geom", type = "Point", srid = 4326, default = true }
]
}
该转换器定义为::
"example-jdbc" = {
type = "jdbc"
connection = "jdbc:mysql://localhost/test?user=foo&password=bar"
id-field = "toString($1)",
fields = [
{ name = "name", transform = "$2" }
{ name = "dtg", transform = "$3" }
{ name = "lon", transform = "$4" }
{ name = "lat", transform = "$5" }
{ name = "geom", transform = "point($lon, $lat)" }
]
}
而转换器的输入将是:
"select * from example"
所需的驱动程序JAR将为::
mysql-connector-java-5.1.44.jar