大家好蒙兰,我是IT修真院,一枚正直純潔善良的如剛?cè)腴T的Java程序員捏雌,今天試著給大家分享一下關(guān)于mybaits動態(tài)標簽的內(nèi)容
背景介紹
mybatis是什么?說起用JDBC訪問數(shù)據(jù)庫闻丑,除了需要自己寫SQL之外叭披,還要操作Connection, Statment, ResultSet 這些手輔助性質(zhì)的代碼;
訪問不同的表诞吱,還會寫很多雷同的代碼寻定,繁瑣和枯燥辖源。而用Mybatis蔚携,只需要提供關(guān)鍵性的SQL語句,其他的工作克饶,像加載驅(qū)動,建立連接酝蜒,Statement,
JDBC相關(guān)的一些動作交給Mybatis彤路,減少重復性的工作秕硝,更多的關(guān)注在增刪改查等操作層面上,把技術(shù)細節(jié)封裝在底層
知識剖析
傳統(tǒng)的使用JDBC的方法洲尊,有時候需要組合復雜的的SQL語句远豺,還需要去拼接,稍不注意什么空格坞嘀,引號;都會導致錯誤躯护。Mybatis的動態(tài)SQL功能正是為了解決這種問題,
其通過 if, choose, when, otherwise, trim, where, set, foreach標簽丽涩,可組合成非常靈活的SQL語句棺滞,從而提高開發(fā)人員的效率。
編碼實戰(zhàn)
最大的問題就是不會用,直接看代碼吧,小demo
更多討論
1;mybatis中sql語句的#{}占位符和${}占位符有什么區(qū)別?
${}是Properties文件中的變量占位符矢渊,它可以用于標簽屬性值和sql內(nèi)部继准,屬于靜態(tài)文本替換,比如${driver}會被靜態(tài)替換為com.mysql.jdbc.Driver矮男。#{}是sql的參數(shù)占位符移必,Mybatis會將sql中的#{}替換為?號,在sql執(zhí)行前會使用PreparedStatement的參數(shù)設置方法毡鉴,按序給sql的?號占位符設置參數(shù)值崔泵,
2;MyBatis中的標簽和where子句的區(qū)別?
一個是標簽,一個是sql語句,二者可以達到同樣的效果,但是前者更靈活
3;set和if?兩個都可以判斷兩個條件是不是空,這兩個有啥區(qū)別 ?
一個用于update;另一個if更準確的說是where,適用于select
4;Mybatis是如何將sql執(zhí)行結(jié)果封裝為目標對象并返回的猪瞬?
通過設置返回值類型,resulttype/resultmap
5;當實體類中的屬性名和表中的字段名不一樣 憎瘸,怎么辦 ?
會查詢出null;這個時候可以再開頭設置號map;對應字段;類似于起別名
6;數(shù)據(jù)庫字段有下劃線?
同上;
7;動態(tài)標簽和動態(tài)sql???
不一個概念;一個是標簽;一個是注解的sql語句
8;set的時候我傳一個Student進去陈瘦,都不為null幌甘,但是我只想改他的體重字段能不能辦到,按照if !=null的話含潘,三個字段都會update吧?
你傳進去三個,但是只接受倆.......
9;type和map???
MyBatis中在查詢進行select映射的時候饲做,返回類型可以用resultType,也可以用resultMap遏弱,resultType是
直接表示返回類型的盆均,而resultMap則是對外部ResultMap的引用,但是resultType跟resultMap不能同時存在漱逸。
在MyBatis進行查詢映射時泪姨,其實查詢出來的每一個屬性都是放在一個對應的Map里面的,其中鍵是屬性名饰抒,值則是其對應的值肮砾。①當提供的返回類型屬性是resultType時,MyBatis會將Map里面的鍵值對取出賦給resultType所指定的對象對應的屬性袋坑。
所以其實MyBatis的每一個查詢映射的返回類型都是ResultMap仗处,只是當提供的返回類型屬性是resultType的時候,MyBatis對自動的給把對應的值賦給resultType所指定對象的屬性枣宫。②當提供的返回類型是resultMap時婆誓,
因為Map不能很好表示領(lǐng)域模型,就需要自己再進一步的把它轉(zhuǎn)化為對應的對象也颤,這常常在復雜查詢中很有作用洋幻。
參考文獻
http://blog.csdn.net/jpzhu16/article/details/52810747
https://www.cnblogs.com/dongying/p/4092662.html
https://www.cnblogs.com/zkongbai/p/5336015.html
http://how2j.cn/k/mybatis/mybatis-tutorial/1087.html?p=13495
多多指教,錯誤之處!!!