mybatis写postgis原生sql需要加强转类型 以及 配置geometry类型转换

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值