resultMap & resultType、ParameterMap(不推薦) & parameterType、#{}和${}、mapper中幾種update的區別

1.什麼是mybatis?

mybatis

MyBatis-Plus

MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。

MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,爲簡化開發、提高效率而生。

mybatis代碼託管

Gitee | github

MyBatis-Plus 慕課入門視頻教程

2.幾個常見的問題:

resultMap & resultType

resultType:當使用resultType做SQL語句返回結果類型處理時,對於SQL語句查詢出的字段在相應的pojo中必須有和它相同的字段對應,而resultType中的內容就是pojo在本項目中的位置。

resultMap:當使用resultMap做SQL語句返回結果類型處理時,通常需要在mapper.xml中定義resultMap進行pojo和相應表字段的對應。
例如:

<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">  
        <id column="id" property="id"/>  
        <result column="user_id" property="userId"/>  
        <result column="number" property="number"/>  
        <result column="createtime" property="createtime"/>  
        <result column="note" property="note"/>         
</resultMap> 
ParameterMap(不推薦) & parameterType

ParameterMap: ParameterMap和resultMap類似,表示將查詢結果集中列值的類型一一映射到java對象屬性的類型上,在開發過程中不推薦這種方式。
parameterType: 一般使用parameterType直接將查詢結果列值類型自動對應到java對象屬性類型上,不再配置映射關係一一對應。

#{}和${}

resultMap和ParameterMap書寫拼寫要使用#{},resultType 和parameterType類型使用${},使用例子如下:

Select ID,COMMAND from Message where COMMAND=#{command}
Select ID,COMMAND from Message where COMMAND=‘${command}

前者解析爲:

Select ID,COMMAND from Message where COMMAND=?具有預編譯效果

後者解析爲:

Select ID,COMMAND from Message where COMMAND=段子 不具有預編譯效果

但是,例如當頁面向後臺傳遞一個列名(屬性名)的時候,是不希望被預編譯出一個?的,此時要用到orderby格式; 如:加上 order by{param} ,此時param是一個列名。

那麼,在使用過程中我們應該使用哪種方式呢?

答案是:優先使用 #{}。因爲 ${} 會導致 sql 注入的問題。

例如:

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

在這個例子中,如果表名爲

user; delete user; --

則動態解析之後 sql 如下:

select * from user; delete user; -- where name = ?;
“- -”之後的語句被註釋掉,而原本查詢用戶的語句變成了查詢所有用戶信息+刪除用戶表的語句,會對數據庫造成重大損傷,極大可能導致服務器宕機。

但是,例如當頁面向後臺傳遞一個列名(屬性名)的時候,是不希望被預編譯出一個?的,此時要用到$格式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章