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 将被转换为 StringTIMESTAMP 将成为一种 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