mybatis帶引號 mybatis的單引號

2021-10-12 14:35:48 字數 4319 閱讀 7077

要生成的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 st_distance(

st_transform(st_geomfromtext( ,4326),26986),

st_transform(st_geomfromtext(, 4326),26986))

$是字串:-87.734087560562 43.770129071141

$是字串point(-87.747382933006 43.759234252055)

注意1:單引號的轉義

方式a:如上使用

方式b:使用xml的轉義字元:

select st_distance(

st_transform(st_geomfromtext(' point($) ',4326),26986),

st_transform(st_geomfromtext('$ ', 4326),26986))

方式c:concat拼接的方式。

剛開始想拼接一對單引號出來,不行:

select st_distance(

st_transform(st_geomfromtext(concat(e'\'','point($)',e'\'','),4326),26986),

st_transform(st_geomfromtext(concat(e'\'','$',e'\'','), 4326),26986))

後來堅持不懈,發現是這麼寫:

select st_distance(

st_transform(st_geomfromtext(concat('point($)'),4326),26986),

st_transform(st_geomfromtext(concat('$'), 4326),26986))

這樣也行:

select st_distance(

st_transform(st_geomfromtext(concat('point(',#,')'),4326),26986),

st_transform(st_geomfromtext(concat('$'), 4326),26986))

這樣也行:

select st_distance(

st_transform(st_geomfromtext(concat('point(',#,')'),4326),26986),

st_transform(st_geomfromtext(concat(#), 4326),26986))

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 st_distance(

st_transform(st_geomfromtext('\''point($) '\'',4326),26986),

st_transform(st_geomfromtext('\''$ '\'', 4326),26986))

sqlselect concat('\'','ddd','\'') from t_parking也有語法錯誤,應該寫為select concat(e'\'','ddd',e'\'') from t_parking,postgresql轉義放在e'\要轉義的內容'裡。詳見

折騰半天,發現這樣寫,最簡單

string param = "point(" + longitude + " " + latitude + ")";

st_geomfromtext(#,4326)

注意2:單引號為什麼不能用雙引號取代

sql裡單引號不能被雙引號取代著用。

注意3:${} 與 #{}的區別

前者是直接把字面值加在sql裡,完全是字串替換,當作佔位符。常常用來傳遞表名,欄位名,如order by $

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 st_distance(

st_transform(st_geomfromtext( ,4326),26986),

st_transform(st_geomfromtext(, 4326),26986))

from t_parking

and id = #

可以嗎?

當然是可以的,但${}裡不能帶,jdbctype=varchar

寫這樣and id = $報錯:org.postgresql.util.psqlexception: 錯誤: 語法錯誤 在輸入的末尾\n 位置。

寫這樣and id = '$'報錯:內部錯誤。

寫這樣and id = '$'當然是正確的。

寫這樣and id = $當然是有語法錯誤的。

create database testgis;--新建乙個庫

create extension postgis;--給該庫啟用postgis(包括柵格),出現表spatial_ref_sys

create extension postgis_topology;--啟用拓撲topology庫

select st_geomfromtext('point(116.289573 39.892352)', 4326); --試用

st_astext(inf_comp_components_point.geom) --得到point(116.289573 39.892352)字串

給表t_parking新增乙個地理屬性欄位geom,座標系是4326(epsg4326,經緯度),2維

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;

qDebug輸出QString資料帶引號的問題

在使用qdebug輸出qstring,直接輸出會有問題 qstring str1 welcome qdebug 注意不是qdebug 輸出 welcome 如果想輸出不帶引號的 正確的方法如下 使用如下函式轉換一下 const char qprintable const qstring str qs...

excel中單元格帶引號問題

現象 excel中某個單元格拷出結果 單元格 select from dual where 1 1 拷出到文字結果 select from dual where 1 1 原因 excel中乙個單元格的內容帶著換行符,複製出來的時候預設在前後加了引號.去掉引號思路 因為存在換行,所以excel帶了引號...

Linux find命令和ls命令帶 引號的問題

linux中find命令的使用網上有很多資料 實際使用中遇到了如下問題 請看如下幾組命令 a find name abc b find name abc c find name abc d find name abc print 除了第一組,其他三組得到的結果都是一樣的,因為 name後面的字串直接...