最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

使用 $ 符

如在mapper.xml里面的使用:

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

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

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

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

動(dòng)態(tài)SQL是mybatis的強(qiáng)大特性之一,mybatis在對(duì)sql語(yǔ)句進(jìn)行預(yù)編譯之前,會(huì)對(duì)sql進(jìn)行動(dòng)態(tài)解析,解析為一個(gè)BoundSql對(duì)象,也是在此處對(duì)動(dòng)態(tài)sql進(jìn)行處理。下面讓我們先來(lái)熟悉下mybatis里#{}與${}的用法:

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

#{ } 解析為一個(gè) JDBC 預(yù)編譯語(yǔ)句(prepared statement)的參數(shù)標(biāo)記符。

如以下sql語(yǔ)句

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

會(huì)被解析為:

select * from user where name = ?;

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

${ } 僅僅為一個(gè)純碎的 string 替換,在動(dòng)態(tài) SQL 解析階段將會(huì)進(jìn)行變量替換

如以下sql語(yǔ)句:

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

當(dāng)我們傳遞參數(shù)“sprite”時(shí),sql會(huì)解析為:

select * from user where name = "sprite";

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

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

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

#{}將傳入的參數(shù)當(dāng)成一個(gè)字符串,會(huì)給傳入的參數(shù)加一個(gè)雙引號(hào)

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

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

${}在預(yù)編譯之前已經(jīng)被變量替換了,這會(huì)存在sql注入的風(fēng)險(xiǎn)。如下sql

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

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

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

--之后的語(yǔ)句將作為注釋不起作用,頓時(shí)我和我的小伙伴驚呆了?。?!看到?jīng)],本來(lái)的查詢語(yǔ)句,竟然偷偷的包含了一個(gè)刪除表數(shù)據(jù)的sql,是刪除,刪除,刪除!??!重要的事情說(shuō)三遍,可想而知,這個(gè)風(fēng)險(xiǎn)是有多大。

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

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

進(jìn)入正題,通過(guò)上面的分析,相信大家可能已經(jīng)對(duì)如何動(dò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>

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

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

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

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

String name = "sprite";

name = "'" + name + "'";   

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

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

相關(guān)文章

  • Springboot為什么加載不上application.yml的配置文件

    Springboot為什么加載不上application.yml的配置文件

    這篇文章主要介紹了Springboot為什么加載不上application.yml的配置文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • request如何獲取完整url(包括域名、端口、參數(shù))

    request如何獲取完整url(包括域名、端口、參數(shù))

    這篇文章主要介紹了request如何獲取完整url(包括域名、端口、參數(shù))問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • struts2的國(guó)際化實(shí)現(xiàn)網(wǎng)站整體中英文切換實(shí)例代碼

    struts2的國(guó)際化實(shí)現(xiàn)網(wǎng)站整體中英文切換實(shí)例代碼

    本篇文章主要介紹了struts2的國(guó)際化實(shí)現(xiàn)網(wǎng)站整體中英文切換實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Mybatis中updateBatch實(shí)現(xiàn)批量更新

    Mybatis中updateBatch實(shí)現(xiàn)批量更新

    本文主要介紹了Mybatis中updateBatch實(shí)現(xiàn)批量更新,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • JavaWeb文件上傳下載功能深入分析(二)

    JavaWeb文件上傳下載功能深入分析(二)

    這篇文章主要為大家詳細(xì)解析了JavaWeb文件上傳與下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • MyBatisPlus條件構(gòu)造器圖文實(shí)例詳解

    MyBatisPlus條件構(gòu)造器圖文實(shí)例詳解

    這篇文章主要介紹了MyBatisPlus條件構(gòu)造器,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的
    2023-01-01
  • spring?cloud?使用oauth2?問(wèn)題匯總

    spring?cloud?使用oauth2?問(wèn)題匯總

    這篇文章主要介紹了spring?cloud?使用oauth2?問(wèn)題匯總,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • java獲取網(wǎng)絡(luò)圖片上傳到OSS的方法

    java獲取網(wǎng)絡(luò)圖片上傳到OSS的方法

    這篇文章主要為大家詳細(xì)介紹了java獲取網(wǎng)絡(luò)圖片上傳到OSS,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Java使用Log4j記錄日志的方法詳解

    Java使用Log4j記錄日志的方法詳解

    log4j是一個(gè)常用的日志框架,用于記錄應(yīng)用程序的執(zhí)行過(guò)程或異常等記錄在日志文件中。本文將利用Log4j記錄日志,感興趣的可以了解一下
    2022-03-03
  • SpringBoot實(shí)現(xiàn)接口防刷的兩種方法

    SpringBoot實(shí)現(xiàn)接口防刷的兩種方法

    接口被刷指的是同一接口被頻繁調(diào)用,可能是由于以下原因?qū)е拢簮阂夤艉驼`操作或程序錯(cuò)誤,本文給大家介紹了SpringBoot實(shí)現(xiàn)接口防刷的兩種方法,并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06

最新評(píng)論

茂名市| 藁城市| 专栏| 永德县| 枣阳市| 哈巴河县| 祁门县| 丽江市| 桐乡市| 尚志市| 漳州市| 蓬安县| 望城县| 东阿县| 进贤县| 光泽县| 阳新县| 博兴县| 黑龙江省| 黄浦区| 肥城市| 海盐县| 永济市| 广灵县| 灵武市| 西平县| 林甸县| 武安市| 温宿县| 平阴县| 日照市| 永和县| 陆河县| 武清区| 昌都县| 枝江市| 昭苏县| 无为县| 彝良县| 漾濞| 镇赉县|