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=段子 不具有預編譯效果
但是,例如當頁面向後臺傳遞一個列名(屬性名)的時候,是不希望被預編譯出一個?的,此時要用到{param} ,此時param是一個列名。
那麼,在使用過程中我們應該使用哪種方式呢?
答案是:優先使用 #{}。因爲 ${} 會導致 sql 注入的問題。
例如:
select * from ${tableName} where name = #{name}
在這個例子中,如果表名爲
user; delete user; --
則動態解析之後 sql 如下:
select * from user; delete user; -- where name = ?;
“- -”之後的語句被註釋掉,而原本查詢用戶的語句變成了查詢所有用戶信息+刪除用戶表的語句,會對數據庫造成重大損傷,極大可能導致服務器宕機。
但是,例如當頁面向後臺傳遞一個列名(屬性名)的時候,是不希望被預編譯出一個?的,此時要用到$格式。