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

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

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

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

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

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

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

  如以下sql語句

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語句:

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

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

select * from user where name = "sprite";

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

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

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

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

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

#{}能夠很大成都上防止sql注入,${}無法防止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 = ?;

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

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

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

  進(jìn)入正題,通過上面的分析,相信大家可能已經(jīng)對如何動(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ù)傳入前加上引號,如:

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

總結(jié)

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

本文轉(zhuǎn)自:http://www.yuanrengu.com/index.php/mybatis1021.html

相關(guān)文章

最新評論

获嘉县| 庆阳市| 尼玛县| 沙河市| 襄垣县| 宜城市| 伊宁市| 绥化市| 扶绥县| 泽州县| 乌兰浩特市| 蛟河市| 勐海县| 凤翔县| 会泽县| 溆浦县| 白山市| 理塘县| 南召县| 溧阳市| 镇巴县| 金平| 宜昌市| 汉寿县| 长子县| 阜新市| 花垣县| 南城县| 盐源县| 新蔡县| 贡觉县| 新田县| 麻城市| 昌图县| 武夷山市| 马关县| 萨迦县| 仙桃市| 灵川县| 伊春市| 邹平县|