MyBatis總結五 和 的用法和區別

2021-09-08 07:14:12 字數 2930 閱讀 7139

如果只有乙個引數

<

select

id="getuserbyid"

parametertype

="int"

resulttype

="user"

>

select * from users where id=#

select

>

也就是說:#{}就是乙個預編譯的佔位符作用,執行的時候會編譯成 ? ;但這只適用於只有乙個引數的情況,而且這種情況#中的id可以寫成任何字串,比如#

但是如果我們有多個引數呢?

如果有多個引數

解決方案一:按照順序用 0 1 來標誌

<

select

id="getuserbynameandage"

resulttype

="user"

>

select * from users where username=# and age=#

select

>

解決方案二:按照順序用param1 param2 來標誌

<

select

id="getuserbynameandage"

resulttype

="user"

>

select * from users where username=# and age=#

select

>

解決方案三:利用引數

<

select

id="getuserbynameandage"

resulttype

="user"

>

select * from users where username=# and age=#

select

>

public

inte***ce

public user getuserbynameandage(@param("username123") string username, @param("age233") int

age);

}

這種方式是推薦方式,不過我們需要注意的是xml和inte***ce中的引數名稱需要對應。

${}的用法和#{}的用法不同在於: #{}會被編譯成?,而${}則會被原樣輸出(用在引數上,需要用param註解)

執行的時候 會直接原樣輸出,不能解決sql注入問題,但是這種情況如果引數是字串或者日期型別的話 需要手動加單引號 不然會報錯;

由於是直接輸出的,所以我們在配置mybatis-config.xml的時候 可以用${}來可以配置一些東西,比如:

<

properties

resource

="jdbc.properties"

/>

<

environments

default

="development"

>

<

environment

id="development"

>

<

transactionmanager

type

="jdbc"

/>

<

datasource

type

="pooled"

>

<

property

name

="driver"

value

="$"

/>

<

property

name

="url"

value

="$"

/>

<

property

name

="username"

value

="$"

/>

<

property

name

="password"

value

="$"

/>

datasource

>

environment

>

environments

>

總結:#是佔位符, 會對sql進行預編譯,相當於?; $是做sql拼接, 有sql注入的隱患 2. #不需要關注資料型別, mybatis自動實現資料型別轉換; ${} 必須自己判斷資料型別

​   兩者都支援@param註解, 指定引數名稱, 獲取引數值. 推薦這種方式

一般做引數傳遞,都會使用#{}

如果不是做預編譯,而是做拼接sql, 會使用${}, 例如表名稱的變化,或者用在其他配置檔案中

posted @

2017-04-07 19:14

青衫仗劍 閱讀(

...)

編輯收藏

Mybatis中的 和 區別與用法

我們經常使用的是 一般解說是因為這種方式可以防止sql注入,簡單的說 這種方式sql語句是經過預編譯的,它是把 中間的引數轉義成字串,舉個例子 select from student where student name 預編譯後,會動態解析成乙個引數標記符?select from student ...

mybatis中 Param的用法和作用

select select s id id,s name name,class id classid from student where s name and class id public student select param aaaa string name,param bbbb int ...

this和super的用法總結

class person public void setname string name public person string name class student extends person public void setscore int score 子類空參構造用this 呼叫本類中存在...