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

Mybatis 將table表名作為參數(shù)傳入操作

 更新時間:2020年12月02日 11:25:09   作者:小目標青年  
這篇文章主要介紹了Mybatis 將table表名作為參數(shù)傳入操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

使用 $ 符

如在mapper.xml里面的使用:

在mapper層就把這個表名當做普通的參數(shù)傳入即可:

同理,其實如果真的使用了$ ,在不考慮安全的范疇里面,也可以把一些手動拼接的sql語句作為參數(shù)傳入。

補充知識:MyBatis動態(tài)傳入表名,字段名參數(shù)的解決辦法--用于分表--表名是動態(tài)的

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

動態(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 中?!?/p>

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

#{}將傳入的參數(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,是刪除,刪除,刪除?。?!重要的事情說三遍,可想而知,這個風險是有多大。

${}一般用于傳輸數(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)用表名和字段名,還可以應(yīng)用于日志的收集上,如數(shù)據(jù)庫的日志表,每隔一個月動態(tài)建一個日志表,表名前綴相同(如log_201610,log_201611等),這樣實現(xiàn)日志的分月分表存儲,方便日志的分析。

以上這篇Mybatis 將table表名作為參數(shù)傳入操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot使用@WebListener?作為web監(jiān)聽器的過程解析

    Springboot使用@WebListener?作為web監(jiān)聽器的過程解析

    這篇文章主要介紹了Springboot使用@WebListener作為web監(jiān)聽器的過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • springboot redis分布式鎖代碼實例

    springboot redis分布式鎖代碼實例

    這篇文章主要介紹了springboot redis分布式鎖代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • IntelliJ IDEA修改內(nèi)存大小,使得idea運行更流暢

    IntelliJ IDEA修改內(nèi)存大小,使得idea運行更流暢

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA修改內(nèi)存大小,使得idea運行更流暢的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • springboot2如何禁用自帶tomcat的session功能

    springboot2如何禁用自帶tomcat的session功能

    這篇文章主要介紹了springboot2如何禁用自帶tomcat的session功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 使用Swing繪制動態(tài)時鐘

    使用Swing繪制動態(tài)時鐘

    這篇文章主要為大家詳細介紹了使用Swing繪制動態(tài)時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • MyBatis-Plus模糊查詢特殊字符串轉(zhuǎn)義的實現(xiàn)

    MyBatis-Plus模糊查詢特殊字符串轉(zhuǎn)義的實現(xiàn)

    使用MyBatis中的模糊查詢時,當查詢關(guān)鍵字中包括有_、\、%時,查詢關(guān)鍵字失效,本文主要介紹了MyBatis-Plus模糊查詢特殊字符串轉(zhuǎn)義的實現(xiàn),感興趣的可以了解一下
    2024-06-06
  • spring boot 加載web容器tomcat流程源碼分析

    spring boot 加載web容器tomcat流程源碼分析

    本文章主要描述spring boot加載web容器 tomcat的部分,為了避免文章知識點過于分散,其他相關(guān)的如bean的加載,tomcat內(nèi)部流程等不做深入討論,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-06-06
  • MyBatis多表連接查詢的實例教程

    MyBatis多表連接查詢的實例教程

    這篇文章主要給大家介紹了關(guān)于MyBatis多表連接查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Sentinel流控規(guī)則實現(xiàn)限流保護詳解

    Sentinel流控規(guī)則實現(xiàn)限流保護詳解

    這篇文章主要介紹了Sentinel流控規(guī)則實現(xiàn)限流保護,Sentinel是一個分布式系統(tǒng)的流量控制組件,它可以實現(xiàn)限流,流控,降級等功能,提高系統(tǒng)的穩(wěn)定性和可靠性,感興趣想要詳細了解可以參考下文
    2023-05-05
  • Jrebel License Server 激活 IDEA-Jrebel-在線-離線-均適用(推薦)

    Jrebel License Server 激活 IDEA-Jrebel-在線-

    這篇文章主要介紹了Jrebel License Server 激活 IDEA-Jrebel-在線-離線-均適用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論