要生成的sql:
作用是利用postgreGIS数据库函数计算两点(经纬度已知)的距离。

SELECT ST_Distance(
ST_Transform(ST_GeomFromText('POINT(-87.734087560562 43.770129071141)',4326),26986),
ST_Transform(ST_GeomFromText('POINT(-87.747382933006 43.759234252055)', 4326),26986)
);

最后成功的写法:

    <select id="selectDistance" resultType="java.lang.String" parameterType="java.util.Map">SELECT ST_Distance(<if test="lot_lat != null" >ST_Transform(ST_GeomFromText(<![CDATA['POINT(${lot_lat})']]> ,4326),26986),</if><if test="parkingPointStr != null">ST_Transform(ST_GeomFromText(<![CDATA['${parkingPointStr}']]>, 4326),26986))</if></select>

${lot_lat}是字符串:-87.734087560562 43.770129071141
${parkingPointStr}是字符串POINT(-87.747382933006 43.759234252055)

注意1:单引号的转义

方式a:如上使用<![CDATA[……]]>
方式b:使用xml的转义字符:

    <select id="selectDistance" resultType="java.lang.String" parameterType="java.util.Map">SELECT ST_Distance(<if test="lot_lat != null" >ST_Transform(ST_GeomFromText(&apos; POINT(${lot_lat}) &apos;,4326),26986),</if><if test="parkingPointStr != null">ST_Transform(ST_GeomFromText(&apos;${parkingPointStr} &apos;, 4326),26986))</if></select>

方式c:concat拼接的方式。
刚开始想拼接一对单引号出来,不行:

   <select id="selectDistance" resultType="java.lang.String" parameterType="java.util.Map">SELECT ST_Distance(<if test="lot_lat != null" >ST_Transform(ST_GeomFromText(concat(E'\'','POINT(${lot_lat})',E'\'','),4326),26986),</if><if test="parkingPointStr != null">ST_Transform(ST_GeomFromText(concat(E'\'','${parkingPointStr}',E'\'','), 4326),26986))</if></select>

后来坚持不懈,发现是这么写:

    <select id="selectDistance" resultType="java.lang.String" parameterType="java.util.Map">SELECT ST_Distance(<if test="lot_lat != null" >ST_Transform(ST_GeomFromText(concat('POINT(${lot_lat})'),4326),26986),</if><if test="parkingPointStr != null">ST_Transform(ST_GeomFromText(concat('${parkingPointStr}'), 4326),26986))</if></select>

这样也行:

    <select id="selectDistance" resultType="java.lang.String" parameterType="java.util.Map">SELECT ST_Distance(<if test="lot_lat != null" >ST_Transform(ST_GeomFromText(concat('POINT(',#{lot_lat},')'),4326),26986),</if><if test="parkingPointStr != null">ST_Transform(ST_GeomFromText(concat('${parkingPointStr}'), 4326),26986))</if></select>

这样也行:

    <select id="selectDistance" resultType="java.lang.String" parameterType="java.util.Map">SELECT ST_Distance(<if test="lot_lat != null" >ST_Transform(ST_GeomFromText(concat('POINT(',#{lot_lat},')'),4326),26986),</if><if test="parkingPointStr != null">ST_Transform(ST_GeomFromText(concat(#{parkingPointStr}), 4326),26986))</if></select>

concat函数解析后会自带单引号?我之前为了加上单引号还这么写呢:SELECT concat('''','POINT(116.289573 39.892352)','''')
SELECT concat('''','POINT(116.289573 39.892352)','''')
SELECT concat('POINT(-87.747382933006 43.759234252055)')
SELECT '''' || 'POINT(-87.747382933006 43.759234252055)' || ''''

这样不行:

    <select id="selectDistance" resultType="java.lang.String" parameterType="java.util.Map">SELECT ST_Distance(<if test="lot_lat != null" >ST_Transform(ST_GeomFromText('\''POINT(${lot_lat}) '\'',4326),26986),</if><if test="parkingPointStr != null">ST_Transform(ST_GeomFromText('\''${parkingPointStr} '\'', 4326),26986))</if></select>

sqlSELECT concat('\'','ddd','\'') from t_parking也有语法错误,应该写为SELECT concat(E'\'','ddd',E'\'') from t_parking,postgresql转义放在E'\要转义的内容'里。详见

注意2:单引号为什么不能用双引号取代

sql里单引号不能被双引号取代着用。

注意3:${} 与 #{}的区别

前者是直接把字面值加在sql里,完全是字符串替换,当作占位符。常常用来传递表名,字段名,如order by ${param}
mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值,有预编译的机制。另外,传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。

注意4:mybatis里写的一条sql里可以${} 与 #{}混着用吗?

比如这条语句:

SELECT ST_Distance(ST_Transform(ST_GeomFromText('POINT(117.343454 40.8978999)',4326),26986),ST_Transform(ST_GeomFromText('POINT(116.289573 39.892352)', 4326),26986))
FROM  t_parking
WHERE id='0652b36f115c42578d13ffa45c4589c8'

写成:

    <select id="selectDistance" resultType="java.lang.String" parameterType="java.util.Map">SELECT ST_Distance(<if test="lot_lat != null" >ST_Transform(ST_GeomFromText(<![CDATA['POINT(${lot_lat})']]> ,4326),26986),</if><if test="parkingPointStr != null">ST_Transform(ST_GeomFromText(<![CDATA['${parkingPointStr}']]>, 4326),26986))</if></select>FROM t_parking<where><if test="id != null and id != ''">and id = #{id,jdbcType=VARCHAR}</if></where>

可以吗?
当然是可以的,但${}里不能带,jdbcType=VARCHAR
写这样and id = ${id,jdbcType=VARCHAR}报错:org.postgresql.util.PSQLException: 错误: 语法错误 在输入的末尾\n 位置
写这样and id = '${id,jdbcType=VARCHAR}'报错:内部错误。
写这样and id = '${id}'当然是正确的。
写这样and id = ${id}当然是有语法错误的。

另附postgis相关资料:
https://blog.csdn.net/qq_36588972/article/details/78902195
https://blog.csdn.net/zcc0618/article/details/72972188
https://blog.csdn.net/qq_36017609/article/details/85730172
https://www.cnblogs.com/kaituorensheng/p/4647901.html

CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;

SELECT AddGeometryColumn ('t_parking', 'geom', 4326, 'POINT', 2)

update t_parking geom set geom = ST_GeomFromText('POINT(116.289573 39.892352)', 4326) where id='0652b36f115c42578d13ffa45c4589c8'
SELECT ST_ASTEXT(geom) geom FROM t_parking where id='0652b36f115c42578d13ffa45c4589c8'

select a1.attname as column_name,t.typname as data_type,d.description as column_comment
from (select a.attname,a.attrelid,a.atttypid,a.attnum from pg_attribute a,pg_class c where c.relname = 't_parking' and a.attnum>0 and a.attrelid=c.oid)a1 left join pg_type t on a1.atttypid=t.oid left join pg_description d on d.objoid=a1.attrelid and d.objsubid=a1.attnum;

转载于:https://www.cnblogs.com/cashew/p/11465448.html

mybatis的单引号相关推荐

  1. mybatis带引号_mybatis的单引号

    要生成的sql: 作用是利用postgreGIS数据库函数计算两点(经纬度已知)的距离. SELECT ST_Distance( ST_Transform(ST_GeomFromText('POINT ...

  2. mybatis 没有引号_mybatis的单引号

    要生成的sql: 作用是利用postgreGIS数据库函数计算两点(经纬度已知)的距离. SELECT ST_Distance( ST_Transform(ST_GeomFromText('POINT ...

  3. oracle引号的嵌套,3.4.2 在一个直接量字符串中嵌入单引号

    3.4.2  在一个直接量字符串中嵌入单引号 使用字符串直接量时不可避免的会遇到一个讨厌的任务,就是当字符串里面本身需要就带有分隔符.直到Oracle数据库10g为止,如果想让字符串中带有一个单引号, ...

  4. 定义变量时无引号,单引号,双引号区别与特点:

    a=192 a=192-$a b='192-$a' c="192-$a" echo "a=$a" echo "b=$b" echo &quo ...

  5. mysql concat 引号,在MySQL concat里面使用多个单引号,三引号的问题

    在动态拼接字符串时,我们常会用到字符拼接,我对拼接的引号不理解,如: 1.'''+ id +''' 为什么是3个引号,为什么左边一个加号右边一个加号(能不能着重帮我解释下这个,详细点) SQL cod ...

  6. python双引号和单引号区别_Python中单引号,双引号,3个单引号及3个双引号的区别...

    一.单引号和双引号 在Python中我们都知道单引号和双引号都可以用来表示一个字符串,比如 str1 = 'python' str2 = "python" str1和str2是没有 ...

  7. linux 单引号,双引号,反引号的小总结。

    还是老惯例说说事情的起因,由于最开始对linux下面的各种引号并不是特别敏感,导致有一天我在添加数据库字段的时候出现的错误,当时出现错误的原因是我在最外层使用了单引号进行包裹,然后一句话里面需要转意的 ...

  8. shell变量加单引号sql_关于shell:在Bash中的命令中扩展变量的单引号

    我想从bash shell脚本中运行一个命令,该脚本在单引号和变量中包含单引号和一些其他命令. 如repo forall -c '....$variable'. 在这种格式中,对$进行转义,不展开变量 ...

  9. 【Excel技巧】如何批量去掉×××号前的单引号

    在单位使用excel的人比较多,有的人碰到问题总喜欢来问我,不是我懂得多,虽然以前也我常用,而是他们来问我就算是我不会的,我也会帮他们在网上找答案,如果找不到就自己琢磨,想办法解决(呵呵~我喜欢想问题 ...

最新文章

  1. python max函数_Python max内置函数详细介绍
  2. Qt Creator开放项目
  3. POJ 2240 Arbitrage(判正环)
  4. oracle mysql 创建表,Oracle 创建表用户、空间
  5. react(91)--debugger
  6. Codeforces 659F Polycarp and Hay【BFS】
  7. 计算机无法连接此设备,[修复]目前,此硬件设备未连接到计算机(代码45) | MOS86...
  8. android的wifi开发,android开发教程之wifi开发示例
  9. css配色大全和色彩原理
  10. Android 自定义锁屏_开发自定义ROM提速:红米Note 6 Pro等Android Pie内核源代码上线...
  11. Cura参数设置-避免支撑拆除带来的困难
  12. 运行日志Log文件c++实现
  13. 第十三届蓝桥杯(Web 应用开发)线上模拟赛第一题
  14. 南邮 | Linux实验一:Linux 基本命令 权限管理
  15. 運命命运 (日剧《命运警察》插曲)歌手:片寄涼太日语罗马音注释
  16. Linux系统编程笔记
  17. EMS (www.ems.com.cn不能直接访问)查询解决方案
  18. 权限管理系统设计方案
  19. Flink Sql (一)
  20. 全栈开发工程师面试题二

热门文章

  1. java中userservice是什么,【图片】求助大神~~我在Reaml中注入userService对象启动tomcat就报错【java吧】_百度贴吧...
  2. 架构解密从分布式到微服务:微服务架构到底是什么?
  3. VMware vSphere Documentation(产品文档)
  4. 支持的vCenter Server High Availability选项(2096800)
  5. 用FRP,内网端口映射到外网,记录
  6. 项目管理学习总结(12)——世界上最好的十条研发管理经验
  7. Spring Boot学习总结(11)——SpringBoot的Starter依赖包及作用
  8. Git学习总结(19)——Git代码回滚总结
  9. Myeclipse学习总结(10)——MyEclipse2014导入项目时The project was not built since its build问题...
  10. Java基础学习总结(59)——30 个java编程技巧