mybatis类型转换器处理PostGis数据库geometry类型转换_SomeOtherTime的博客-CSDN博客_java mybatis postgis
在navicate写insert into "district" (name,code,position) VALUES('cesh2i3','ac1v3','SRID=4326;MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)))'
不会报错。
在mybatis代码中写insert into "district" (name,code,position) VALUES('cesh2i3','ac1v3','SRID=4326;MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)))'会报错
相当于写了insert into "district" (name,code,position) VALUES('cesh2i3','ac1v3','SRID=4326;MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)))'::VARCHAR)
正确写法:
insert into "district" (name,code,position) VALUES('cesh2i113','ac1v113','SRID=4326;MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)))'::geometry)
因为
同样一句sql,PG的JDBC发出的sql格式与navicate发出的不一样,这就是PG的JDBC严格检查类型的原因。他用了postgresql的 PREPARED语句高效率
PostgreSQL prepare的使用 - 走看看
抓包分析
PG的JDBC:
navicate:
新增数据时在使用自动类型转换时要添加包
mybatis类型转换器处理PostGis数据库geometry类型转换_SomeOtherTime的博客-CSDN博客_java mybatis postgis
<!-- 这里会补充mybatis缺少的JDBC-Type如postGis中的geometry类型 -->
<dependency>
<groupId>net.postgis</groupId>
<artifactId>postgis-jdbc</artifactId>
<version>2.5.0</version>
</dependency>
否则会报错
设置PG驱动自定义类型:
org.postgresql.jdbc.TypeInfoCache#getPGType(java.lang.String)
通过上面oidStatement这句sql查出类型oid
SELECT pg_type.oid, typname FROM pg_catalog.pg_type LEFT JOIN (select ns.oid as nspoid, ns.nspname, r.r from pg_namespace as ns join ( select s.r, (current_schemas(false))[s.r] as nspname from generate_series(1, array_upper(current_schemas(false), 1)) as s(r) ) as r using ( nspname ) ) as sp ON sp.nspoid = typnamespace WHERE typname = 'geometry' ORDER BY sp.r, pg_type.oid DESC LIMIT 1
除了public和用户创建的模式之外,每个数据库都包含一个pg_catalog模式,它包含系统表和所有内置数据类型、函数、操作符
调用链,Hikari连接池是包装类维护了PgprepareStatement,再调用setObject