欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis動態(tài)調(diào)用表名和字段名的解決方法

 更新時間:2016年10月12日 16:09:26   作者:猿人谷  
今天在項目開發(fā)中有個業(yè)務是需要限制各個用戶對某些表里的字段查詢以及某些字段是否顯示,這種情況下,就需要構建sql來動態(tài)傳入表名、字段名了,下面給大家介紹mybatis動態(tài)調(diào)用表名和字段名的解決方法,一起看看吧

 一直在使用Mybatis這個ORM框架,都是使用mybatis里的一些常用功能。今天在項目開發(fā)中有個業(yè)務是需要限制各個用戶對某些表里的字段查詢以及某些字段是否顯示,如某張表的某些字段不讓用戶查詢到。這種情況下,就需要構建sql來動態(tài)傳入表名、字段名了。現(xiàn)在對解決方法進行下總結,希望對遇到同樣問題的伙伴有些幫助。

  動態(tài)SQL是mybatis的強大特性之一,mybatis在對sql語句進行預編譯之前,會對sql進行動態(tài)解析,解析為一個BoundSql對象,也是在此處對動態(tài)sql進行處理。下面讓我們先來熟悉了mybatis里#{}與${}的用法:

  在動態(tài)sql解析過程,#{}與${}的效果是不一樣的:

#{ } 解析為一個 JDBC 預編譯語句(prepared statement)的參數(shù)標記符。

  如以下sql語句

select * from user where name = #{name};

  會被解析為:

select * from user where name = ?;

  可以看到#{}被解析為一個參數(shù)占位符?。

${ } 僅僅為一個純碎的 string 替換,在動態(tài) SQL 解析階段將會進行變量替換
  如一下sql語句:

select * from user where name = ${name};

  當我們傳遞參數(shù)“sprite”時,sql會解析為:

select * from user where name = "sprite";

  可以看到預編譯之前的sql語句已經(jīng)不包含變量name了。

綜上所得, ${ } 的變量的替換階段是在動態(tài) SQL 解析階段,而 #{ }的變量的替換是在 DBMS 中。

  #{}與${}的區(qū)別可以簡單總結如下:

#{}將傳入的參數(shù)當成一個字符串,會給傳入的參數(shù)加一個雙引號

${}將傳入的參數(shù)直接顯示生成在sql中,不會添加引號

#{}能夠很大成都上防止sql注入,${}無法防止sql注入

  ${}在預編譯之前已經(jīng)被變量替換了,這會存在sql注入的風險。如下sql

select * from ${tableName} where name = ${name}

  如果傳入的參數(shù)tableName為user; delete user; --,那么sql動態(tài)解析之后,預編譯之前的sql將變?yōu)椋?/p>

select * from user; delete user; -- where name = ?;

  --之后的語句將作為注釋不起作用,頓時我和我的小伙伴驚呆了!??!看到?jīng)],本來的查詢語句,竟然偷偷的包含了一個刪除表數(shù)據(jù)的sql,是刪除,刪除,刪除?。。≈匾氖虑檎f三遍,可想而知,這個風險是有多大。

${}一般用于傳輸數(shù)據(jù)庫的表名、字段名等

能用#{}的地方盡量別用${}

  進入正題,通過上面的分析,相信大家可能已經(jīng)對如何動態(tài)調(diào)用表名和字段名有些思路了。示例如下:

<select id="getUser" resultType="java.util.Map" parameterType="java.lang.String" statementType="STATEMENT">
select 
${columns}
from ${tableName}
where COMPANY_REMARK = ${company}
</select>

  要實現(xiàn)動態(tài)調(diào)用表名和字段名,就不能使用預編譯了,需添加statementType="STATEMENT"" 。

statementType:STATEMENT(非預編譯),PREPARED(預編譯)或CALLABLE中的任意一個,這就告訴 MyBatis 分別使用Statement,PreparedStatement或者CallableStatement。默認:PREPARED。這里顯然不能使用預編譯,要改成非預編譯。

  其次,sql里的變量取值是${xxx},不是#{xxx}。

  因為${}是將傳入的參數(shù)直接顯示生成sql,如${xxx}傳入的參數(shù)為字符串數(shù)據(jù),需在參數(shù)傳入前加上引號,如:

String name = "sprite";
name = "'" + name + "'";

總結

以上所述是小編給大家介紹的Mybatis動態(tài)調(diào)用表名和字段名的解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

本文轉自:http://www.yuanrengu.com/index.php/mybatis1021.html

相關文章

  • Java設計模式之訪問模式(Visitor者模式)介紹

    Java設計模式之訪問模式(Visitor者模式)介紹

    這篇文章主要介紹了Java設計模式之訪問模式(Visitor者模式)介紹,本文講解了為何使用Visitor模式、如何使用Visitor模式、使用Visitor模式的前提等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • springboot的LogbackLoggingSystem配置加載流程解析

    springboot的LogbackLoggingSystem配置加載流程解析

    這篇文章主要介紹了springboot的LogbackLoggingSystem配置加載流程源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • SpringBoot分頁查詢功能的實現(xiàn)方法

    SpringBoot分頁查詢功能的實現(xiàn)方法

    在實際的項目開發(fā)過程中,分頁顯示是很常見的頁面布局,所以學習如何實現(xiàn)分頁也是必要的,下面這篇文章主要給大家介紹了關于SpringBoot分頁查詢功能的實現(xiàn)方法,需要的朋友可以參考下
    2022-06-06
  • JAVA+Hibernate 無限級分類

    JAVA+Hibernate 無限級分類

    主要看menu_id和parent_id這兩個字段。 Eclipse生成的表持久映射:(說明:自己加level屬性,作用:為了記錄種類所在深度)
    2008-07-07
  • 深入理解Java設計模式之職責鏈模式

    深入理解Java設計模式之職責鏈模式

    這篇文章主要介紹了JAVA設計模式之職責鏈模式的的相關資料,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解
    2021-11-11
  • Spring Cloud Gateway 默認的filter功能和執(zhí)行順序介紹

    Spring Cloud Gateway 默認的filter功能和執(zhí)行順序介紹

    這篇文章主要介紹了Spring Cloud Gateway 默認的filter功能和執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java數(shù)字簽名算法DSA實例詳解

    Java數(shù)字簽名算法DSA實例詳解

    這篇文章主要介紹了Java數(shù)字簽名算法DSA,結合實例形式分析了Java數(shù)字簽名算法DSA具體定義與使用技巧,需要的朋友可以參考下
    2018-05-05
  • Kafka多節(jié)點分布式集群搭建實現(xiàn)過程詳解

    Kafka多節(jié)點分布式集群搭建實現(xiàn)過程詳解

    這篇文章主要介紹了Kafka多節(jié)點分布式集群搭建實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Java進階之FileUpload完成上傳的實例

    Java進階之FileUpload完成上傳的實例

    這篇文章主要介紹了 Java進階之FileUpload完成上傳的實例的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java整數(shù)和字符串相互轉化實例詳解

    Java整數(shù)和字符串相互轉化實例詳解

    這篇文章主要介紹了Java整數(shù)和字符串相互轉化實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02

最新評論