1. 程式人生 > >mybatis----#{}和${}

mybatis----#{}和${}

工作中有個點選排序的功能除錯了許久,終尋因,總結之。 
需求是這樣的,頁面有個table,有一列的上下箭頭可點選並排序。對於這種需求,我的mybatis.xml的sql配置寫成了如下:
<if test="map.ColumnNameSort!=null and map.ColumnNameSort!=''"> 
  ORDER BY columnName #{map.ColumnNameSort} 
</if>
  ColumnNameSort即前端傳的排序方式,asc或者desc。
  然後,預計它的輸出應該是類似於下面這樣的
ORDER BY columnName desc
  但是,真正跑起來時,排序的效果一直沒出現,經常一番查詢,發現是mybatis 的’#{}’傳值的問題,它將sql語句編譯成了如下
ORDER BY columnName 'desc'
或者 ORDER BY columnName 'asc'
  這樣,desc或者asc就成了字串而不是關鍵字,sql語句的意思是columnName的別名是desc或者asc,沒加排序關鍵字時預設是正序排序,成了如下
ORDER BY columnName "desc" asc 或者 ORDER BY columnName "asc" asc
排序沒效果的問題找到原因了,解決之,mybatis提供了另一種繫結引數的方式–${param},將sql配置改為
ORDER BY columnName ${map.ColumnNameSort}
  這樣一來,mybatis會直接將ColumnNameSort的值加入sql中,不會轉義。正確結果:
ORDER BY columnName desc



最後,對於mybatis中#和$繫結引數的區別做個總結,避免以後類似的問題發生。
#{}將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號。如:order by #{id},如果傳入的值是111,那麼解析成sql時的值為order by “111”, 如果傳入的值是id,則解析成的sql為order by “id”。


${}將傳入的資料直接顯示生成在sql中。如:order by ${id},如果傳入的值是111,那麼解析成sql時的值為order by 111, 如果傳入的值是id,則解析成的sql為order by id。
#方式能夠很大程度防止sql注入。
$方式無法防止Sql注入。
$方式一般用於傳入資料庫物件,例如傳入表名.
一般能用#的就別用$.

相關推薦

mybatis ${} #{}

                mybatis#{}和¥{}區別 ${} :是做字串拼接不能防止sql注入。並且單個引數時${這裡面必須是value},   如果引數時字串時需要在${}前後加上單引號。               假設通過名稱查詢user 表         注入漏洞sq

mybatis----#{}${}

工作中有個點選排序的功能除錯了許久,終尋因,總結之。  需求是這樣的,頁面有個table,有一列的上下箭頭可點選並排序。對於這種需求,我的mybatis.xml的sql配置寫成了如下: <if test="map.ColumnNameSort!=null and m

Mybatis之mapper.xml配置文件中的#{}${}

ali per ont 占位符 註入 stat 配置文件 style statement #{}表示一個占位符號,通過#{}可以實現preparedStatement向占位符中設置值,自動進行java類型和jdbc類型轉換。#{}可以有效防止sql註入。 #{}可以接收簡單

【Java】Mybatis的#{}${}

背景: 曾經一個朋友跟我說面試的時候問:Mybatis的#{}和${}的區別? 備忘: #{} #{}表示一個佔位符號,通過#{}可以實現preparedStatement向佔位符中設定值,自動

mybatis中sql語句中的#$

一直寫mybatis的sql語句,當時想只要實現它的功能就行了,也沒過多的去理解; 首先我們大家都知道#和$都是用來傳值的,但他們之間是怎麼區分的呢?什麼時候用哪個好呢? 1、#將傳入的資料都當成字串

Mybatis學習筆記6 - #{}${}

spa throw sql語句 註入 tor pac oracle demo nfa #{}:可以獲取map中的值或者pojo對象屬性的值。${}:可以獲取map中的值或者pojo對象屬性的值。 區別:   #{}:是以預編譯的形式,將參數設置到sql語句中;Prepare

iBatis myBatis中 的“$”符號“#”

一、iBatis中的$和# 在iBatis中使用sqlmap查詢時引用引數往往會使用 一對$或者#寫在引數前後,以此來區別原生sql和引數的區別;那麼#和$有什麼區別呢?什麼時候用#什麼時候又用$呢?這裡就這點和大家分享下: 簡單來說: #可以進行與編譯,進行型別匹配,而$

Mybatis中的#$

避免 ron 系統安全 固定 答案 dst 系統 用戶輸入 結構 #{}和${}的區別是什麽? 正確的答案是:#{}是預編譯處理,${}是字符串替換。 (1)mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法

mybatis mapper.xml文件 $#

註解 獲取 方式 ring total bsp ava 程序 res 1、#在很大程度上可以避免字符串拼接的SQL註入。 2、$在SQL中是取String類型的字符串,直接顯示在SQL中;#以字符串的顯示出現在SQL中; eg: select *from stu

mybatis強化(二)ParametersResult

pan har java onf 關系 throws efault type throw 本文通過一個簡單例子簡單記錄下參數的映射。轉載註明出處:http://www.cnblogs.com/wdfwolf3/p/6804243.html,謝謝。文件目錄如下, 1.配置文

Mybatis Collection查詢集合只出現一條數據

img int ron src per rda entity 級聯 如果 1、原因 如果兩表聯查,主表和明細表的主鍵都是id的話,明細表的多條只能查詢出來第一條。 2、解決辦法 級聯查詢的時候,主表和從表有一樣的字段名的時候,在mysql上命令查詢是沒問

mybatis 基礎理解

mybatis1、主要的類1.1 SqlSessionFactoryBuilder 用於創建SqlSessionFactory,要通過配置文件也可以是代碼。 主要的方法SqlSessionFactory build(InputStream inputStream) SqlSessionFactor

java-mybaits-00102-mybatis框架原理

需求變化 java hiberna 麻煩 開發 rep ati 如果能 遍歷 1、mybatis是什麽?   mybatis是一個持久層的框架,是apache下的頂級項目。是一個不完全的ORM框架。   mybatis托管到goolecode下,再後來托管到github

Spring+SpringMVc+Mybatis實現數據庫查詢

java代碼 格式 jdb web.xml配置 set ransac load idle name 大家好,本篇博客小Y將會給大家帶來一篇SSM框架實現數據查詢的Demo,使用的數據庫是Mysql,Server是TomCat.現在的SSM整合非常流行,因為springm

MYBATIS 簡單整理與回顧

生成 ssi 包含 一對一 收集 soc 讀取配置 close 排序 這兩天簡單整理了一下MyBatis 相關api和jar包這裏提供一個下載地址,免得找了 鏈接:http://pan.baidu.com/s/1jIl1KaE 密碼:d2yl A.簡單搭建跑項目 2.進行

最大數的

using 我們 margin fine 所有 res log 每次 ont 題意:有N個數,每次從中任意選取K個數,取其中的最大值,求所有組合能取得的最大值的和.N≤100,000,K≤50,輸出結果對1000000007取模的結果.0≤每個數≤10^?9?? 樣例輸入

51Nod - 1013 3的冪的

保存 算法 tip http 一個 pre 公式 ios put 51Nod - 1013 3的冪的和 求:3^0 + 3^1 +...+ 3^(N) mod 1000000007 Input 輸入一個數N(0 <= N <= 10^9) Ou

Spring整合Mybatis

man ati log ans nfa use oca utf-8 ann 1、DAO層: Mybatis的配置文件:sqlMapConfig.xml,不需要配置任何內容,但需要有文件頭,文件必須存在。 spring的配置文件:applicationContext-dao.

MyBatis攔截器:給參數對象屬性賦值

是否 tle dsta ref 截器 throws dev ndt pri 1 package com.development; 2 3 import java.lang.reflect.InvocationTargetException; 4 impo

字符串操作符++=

表達式 ati strong 類型 如果 int clas 所有 think //如果表達式以一個字符串起頭,那麽後續所有操作數必須是字符串類型 //thinking in java 書中p53 3.13 字符串操作符+和+= import static net.mind