色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:18日期:2023-10-20 18:13:29

使用 $ 符

如在mapper.xml里面的使用:

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

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

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

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

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

一直在使用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語句已經不包含變量name了。

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

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

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

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

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

${}在預編譯之前已經被變量替換了,這會存在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 = ?;

--之后的語句將作為注釋不起作用,頓時我和我的小伙伴驚呆了!!!看到沒,本來的查詢語句,竟然偷偷的包含了一個刪除表數(shù)據的sql,是刪除,刪除,刪除!!!重要的事情說三遍,可想而知,這個風險是有多大。

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

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

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

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

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

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

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

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

String name = 'sprite';

name = '’' + name + '’';

mybatis動態(tài)調用表名和字段名,還可以應用于日志的收集上,如數(shù)據庫的日志表,每隔一個月動態(tài)建一個日志表,表名前綴相同(如log_201610,log_201611等),這樣實現(xiàn)日志的分月分表存儲,方便日志的分析。

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

相關文章:
主站蜘蛛池模板: 久操免费在线视频 | 国产精品二区页在线播放 | 九九视频在线看精品 | 美女福利视频国产片 | 欧美性猛片xxxxⅹ免费 | 色老头一级毛片 | 成人免费视频在线 | 美国免费高清一级毛片 | 黄网在线 | 亚洲成人xxx| 女人张开腿让男人桶个爽 | 国产呦精品系列在线 | 欧美一级乱理片免费观看 | 一级片www| 欧美一区二区不卡视频 | 国产成人精品一区二区三在线观看 | 国产欧美一区二区另类精品 | 美女视频黄.免费网址 | 日本aaa视频| 俄罗斯特级毛片 | 波多野结衣福利视频 | 99精品免费在线 | 99精品久久精品一区二区 | 亚州免费视频 | 美国一级片在线观看 | 精品国产一二三区 | 欧美成人全部视频 | theav视频在线观看 | 完全免费在线视频 | 国产精品成人观看视频网站 | 日本久久免费 | 国产一国产一级毛片视频在线 | 毛片亚洲毛片亚洲毛片 | 中文乱码字幕午夜无线观看 | 国产色视频一区二区三区 | 日本护士一级毛片在线播放 | www.久久| 免费成年人在线观看视频 | 国产毛片不卡 | 亚洲在线看| 九色porny真实丨国产18 |