mybatis 的sql語句及使用mybatis的動態sql mybatis防注入


由於看到寫的比較詳細的文檔這里將之前的刪掉了,只留下一些我認為能幫助理解的和關於動態sql及防注入的一些理解。文檔鏈接  :mybatis官方文檔介紹


 

 1 <!-- 根據條件查詢用戶 -->
 2 <select id="queryUserByWhere" parameterType="user" resultType="user">
 3     SELECT id, username, birthday, sex, address FROM `user`
 4     WHERE 1=1
 5     <if test="sex != null and sex != ''">
 6         AND sex = #{sex}
 7     </if>
 8     <if test="username != null and username != ''">
 9         AND username LIKE
10         '%${username}%'
11     </if>
12 </select>

注意字符串類型的數據需要要做不等於空字符串校驗。

上面的sql還有where 1=1 這樣的語句,很麻煩 可以使用mybatis的where標簽
 5 <!-- 根據條件查詢用戶 -->
 6 <select id="queryUserByWhere" parameterType="user" resultType="user">
 7     SELECT id, username, birthday, sex, address FROM `user`
 8 <!-- where標簽可以自動添加where,同時處理sql語句中第一個and關鍵字 -->
 9     <where>
10         <if test="sex != null">
11             AND sex = #{sex}
12         </if>
13         <if test="username != null and username != ''">
14             AND username LIKE
15             '%${username}%'
16         </if>
17     </where>
18 </select>

效果是一樣的

Sql中可將重復的sql提取出來,使用時用include引用即可,最終達到sql重用的目的。 

然而  然而 然而  引用結果resultMap巨tm詭異resultMap  和其中的參數重復的話會報錯 所以關於resultMap一定要慎重填寫 必要的時候把屬性都填上不要偷懶

 

 1 <!-- 根據條件查詢用戶 -->
 2 <select id="queryUserByWhere" parameterType="user" resultType="user">
 3     <!-- SELECT id, username, birthday, sex, address FROM `user` -->
 4     <!-- 使用include標簽加載sql片段;refid是sql片段id -->
 5     SELECT <include refid="userFields" /> FROM `user`
 6     <!-- where標簽可以自動添加where關鍵字,同時處理sql語句中第一個and關鍵字 -->
 7     <where>
 8         <if test="sex != null">
 9             AND sex = #{sex}
10         </if>
11         <if test="username != null and username != ''">
12             AND username LIKE
13             '%${username}%'
14         </if>
15     </where>
16 </select>
17 
18 <!-- 聲明sql片段 -->
19 <sql id="userFields">
20     id, username, birthday, sex, address
21 </sql>

再這個xml中你甚至可以使用別的xml中的sql  加上namespace即可:這樣

關於foreach  這個也很好用,方便:

這是接口   注意接口方法名和maper.xml的id一致 否則無法自動映射。這是mapper。xml的

需要了解一下foreach里面都是些什么東西  collection:你傳給xml參數的類型  也是需要遍歷前的對象 item給遍歷出來的結果一個名字,可以參照foreach方法

index 就是index的意思 open:開始遍歷前加上的字符 在這里是 緊跟着 in  后面的  close:遍歷結束后加上的字符  separator 每個遍歷結果之間的分隔符  那么總的就是  delete from mall_user where  user_id in  ( 1,2,3); mybatis會知道最后一個遍歷結果不要加,

 

 還一個mybatis放sql注入  總得來說就是別用${} 多用#{}詳解:mybatis實現防止sql注入總的來說是依靠其預編譯過程和存儲過程。存儲過程就是mybatis提供一組完成特定功能的SQL語句集,經編譯后存儲在數據庫中,用戶通過調用存儲過程並給定參數(如果該存儲過程帶有參數)就可以執行它,也可以避免SQL注入攻擊。預編譯:我們傳給mybatis的參數可以理解為占位符,在預編譯過程mybatis檢查語句的正確性然后將我i們給的占位符放到它預編譯的語句的占位符上

 

 

 

 

 

補充說一下關於sqlMapConfig。xml中setting配置  我不怎么用但還是補充介紹一下

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM