-
Mybatis總結——容易混淆的概念
【1】resultMap與resultType:
<select>標簽有resultMap屬性和resultType屬性,都是為了表示結果集與java對象之間的一種映射關系,這樣Mybatis就可以把結果集放在java對象中。
resultMap:的值為<resultMap>標簽的id,它需要配置<resultMap>標簽進行映射,它不受名稱的影響(即實體類的屬性名可以和結果集的名不相同)。<resultMap>的子標簽提供了typeHandler可以用來類型轉換(一般出現這樣的問題可能是日期類型、布爾類型等,例如用數據庫中的0和1表示java中的true和false,都可以通過配置resultMap來解決)
resultType:的值為java的類型,resultType按結果集的名字與實體類的名字相同來映射的,并且resultType的映射關系不區分大小寫。它還可以是java.util.Map,這樣結果集就會放在Map集合中,key就是結果集中的列名,value就是結果集的值了,使用該方式大小寫是敏感的,sql語句返回的結果集是什么key就是什么。
【2】parameterMap與parameterType:
parameterType:指向一個java類型,它與OGNL表達式有聯系(#{})
parameterMap:它和resultMap相似,也需要指向一個<parameterMap>標簽配置的映射關系的id,只不過是resultMap表明結果集與java中屬性間的映射關系,而parameterMap表明參數中的屬性與數據庫中的列對應的關系(Mybatis官方不推薦使用的屬性)。
Mybatis曾經的名稱為iBatis,原來在apache發布,后來在GoogleCode發布,原來的resultClass和parameterClass對應現在的resultType和parameterType。
【3】#{}與${}
這兩種取值都是寫在配置文件的sql語句中,${}取值寫法和#{}是相同的。
#{}與${}的區別:#{command}會被Mybatis解析為預處理的?,然后再通過preparedStatement為該?賦值。而${command}會直接把command拼接在sql語句后,它是沒有預編譯效果的,類似于字符串拼接變量,但是當前是錯誤,兩側沒有'',所以需要'${command}'。
${}使用場景:排序,當前端傳入一個按照某列進行查詢時,使用order by并不希望預處理給參數兩邊加上''。
【4】#{}與OGNL表達式
#{}與OGNL表達式取值寫法是相同的,當parameterType的類型為String或者基本數據類型時,#{}里并不是一定要寫成_parameter才能取到值,變量名可以寫成任意名稱,而OGNL中取值必須寫成_parameter。
查看全部 -
常用標簽
<where>標簽:,一般在增刪改查標簽里使用,使用jdbc時,需要在sql語句后添加where1=1,Mybatis提供<where>標簽,就是這個作用,當<where>里的條件成立時,就會拼接where。另外一個作用會去掉拼接sql語句里的第一個and或者or,如果不這樣就會sql語法錯誤。
<sql>標簽:與增刪改查平級的,類似于java中的常量定義的概念,通過給該標簽起一個id名,這樣就可以在相應sql語句中通過<include refid="sql標簽id名"/>來引用,項目復雜時,會帶來便捷。
<set>標簽:與where標簽平級,用來代替set關鍵字。沒使用set標簽時如圖一,如果使用<if>標簽進行判斷,拼接sql時,逗號加在前,加在后,都會語法錯誤。<set>標簽就解決了該問題,如果<set>標簽里的<if>標簽條件滿足就會拼接set,并且把最后的逗號去掉。
<trim>標簽:它可以代替<where>標簽或者<set>標簽,提供很多靈活組合功能。
屬性prefix代表前綴,例如前綴為where時當標簽里的if條件成立時就會拼接where。
屬性suffix后綴,根據業務場景進行設定,例如后綴為test,當標簽里的if條件成立時,就會拼接后綴test。
屬性prefixOverrides,例如它的值為and時,如果標簽里的if條件成立,如果拼接的sql語句最前面有and,則會去掉。如下圖就可以代替where標簽了。
suffixOverrides屬性,如果拼接的sql語句最后面有該屬性值時,會被去掉。如下圖,就可以代替set標簽了
<choose>標簽:類似于if...elseif...else語句,該標簽里有<when><otherwise>,可以有多個<when>。
<collection>標簽:配置一對多關系時使用,我們案例中在主表中的<resultMap>映射標簽中進行使用的,代表每查詢出一條主表中的數據,可以查詢出它對應的子表的數據并映射到集合中。
<association>標簽:property屬性代表子表類中引用的主表對象,resultMap屬性指向主表的namespace.resultMap的id,主表查詢一條子表的數據,查詢它關聯的主表的數據,然后把主表的數據映射到子表的對象中。
Mybatis提供的標簽總結
查看全部 -
一對多關系的配置
步驟1:數據庫中的兩張表對應兩個實體類Command、CommandContent,其中Command類中應該存放一個集合用來存放CommandContent。
步驟2:為這兩個實體類配置sql配置文件。
CommandContent.xml
Command.xml
步驟3:sql配置文件中編寫關聯查詢,使用left join進行關聯查詢,當出現兩張表時,通過起別名方便引用,關聯條件是a作為主表時,a的id等于b的command-id。
步驟4:主表command.xml中配置,在映射關系中添加主表對應子表的集合,collection標簽中的property值為集合屬性名,resultMap值為command_content.xml的mapper的namespace+resultMap的id。
注意:
1、resultMap中的result標簽和id標簽的column屬性不是數據庫中表的列名,而是SELECT查詢出來的結果集的名稱,如果給查詢出來的字段起了別名,則column要改為相應的別名。
2、列名前表的別名,加載列名前的前綴不能算作結果集的一部分的(可以通過jdbc的結果集對象調用getMetaData().getColumnName()打印輸出,是沒有列名前的表的別名),Mybatis也一樣,如果查詢返回的結果的字段名不在以上的方法中,則不會映射到實體類中。
問題:查詢出來都有id字段,而表的別名又不能在映射中使用,所以這里只需要給其中一個id字段改一個別名。
步驟5:由于新添加了兩個sql配置文件,所以需要在Mybatis核心配置文件中引入。
查看全部 -
一對多關系的配置(一個指令對應多個回復內容)
使用場景:該案例中通過發出一個命令,回復多個內容中的一個內容,也就是配置一對多關系。
首先,要從表結構進行改寫,一般會拆成兩張表進行一對多關系配置(一張表也可以存,但相同指令的名稱會反復的出現,但是這樣會出現冗余數據,也不符合第三范式)。
查看全部 -
實現自動回復功能
$(function(){})該jQuery方法相當于js中onload事件的方法,該方法中會先調用render方法,渲染效果(否則顯示不出來效果),執行完操作后還需要調用render方法,重新計算滾動條的高度等等。
jQuery的ajax方法:取絕對路徑可以通過在jsp頁面中,添加一個隱藏的標簽,該隱藏標簽的值為絕對路徑,再通過取該標簽的值就可以取到絕對路徑,整個js文件取絕對路徑都是這樣取。
通過ajax請求到的Servlet,該Servlet和前面的Servlet有些區別,該Servlet不是為了跳轉頁面,而是通過PrintWriter把查詢內容輸出出去。
通過指令自動查詢內容的Service層
查看全部 -
實現自動回復功能(開發微信公眾號自動回復功能)
案例描述:輸入指令,點擊發送,讓指令和和賬號的圖片顯示在聊天記錄的框里面,然后向后臺發送ajax請求,以這個指令作為參數,讓后臺到數據庫中查找,然后回復內容,然后讓公眾號的圖片和回復內容顯示在框里面。
JS知識點:如果一個var聲明的變量,如下四種情況,則在if語句判斷時是false。
jQuery的ajax請求寫法:url為請求后臺的路徑,type:提交的方式為(POST或者是GET),dataType:期待服務端響應的數據類型,timeout:超時時間,success:成功回調函數(也可以加一個錯誤回調函數進行調試),data:像服務端發送請求帶上ajax的參數。
暫時不考慮后臺實現,加入通過發送指令,成功的話會拿到服務器相應內容,然后執行success的回調函數。該回調函數的任務就是顯示用戶發送的命令和頭像以及顯示公眾號的回復內容和頭像,再把文本框的內容清空(這里只不過是調用js內部自己封裝好的js方法),最后有一個render方法是為了達到樣式。
查看全部 -
jdbc的事物是自動提交的,每執行一次增、刪、改都會自動提交一次事物,而Mybatis對jdbc進行封裝之后,SqlSession需要手動提交事物。
查看全部 -
應用log4j日志調式動態SQL(JDBC使用斷點可以調試,然后輸出拼接的SQL語句。Mybatis使用log4j進行調試可以完成此功能)
Mybatis支持日志,最常用的日志輸出是log4j,Mybatis支持log4
j,只需要把Log4j的配置文件和Jar包導入即可,這樣Mybatis就可以通過Log4j把最終執行的sql語句打印出來,并且包括參數,Log4j配置文件直接放在src文件夾下,這樣就不用再編寫加載Log4j配置文件路徑的代碼了。
Log4j配置文件:Mybatis源碼包中也存在,它以.properties文件形式打開,其中的內容都是key和value進行存儲,可以通過key取到value。
【1】log4j.rootLogger=DEBUG,Console:配置使用log4j輸出日志的時候,輸出的級別,以及輸出的位置。
輸出日志的形式:如下輸出日志的級別是由低到高,當在log4j.properties中配置了DEBUG時,大于等于debug級別的日志輸出都會被輸出。
Logger對象調用debug("對象");
Logger對象調用info(對象);
Logger對象調用warn(對象);
Logger對象調用error(對象);
log4j.properties配置DEBUG的原因:可以從Mybatis源碼中查看,因為是Mybatis通過log4j輸出sql語句,源碼中使用到了debug()進行輸出,如果不配置它,Mybatis的日志信息不會被輸出。
導入Mybatis源碼:點擊項目Properties屬性,在Java Build Path的Libraries,找到Mybatis的jar包下的Source attachment...,然后edit,選中mybatis源碼包。
如下圖,Mybatis的org.apache.ibatis.logging.jdbc的這幾個類就是輸出日志用的。
Console代表日志信息的輸出位置,它的名任意的。配置了ConsoleAppender這個類才會輸出到控制臺,如果想要輸出到文件里,就需要把org.apache換成其他的類。
日志信息的布局配置(當前這個是自定義配置,所以還需要配置自定義格式)
當前自定義的日志信息布局格式。
%d:產生日志的時間。
%t:產生該日志所處的線程的名稱。
%-5p:輸出日志的級別(debug、info、warning、error)這里的5代表輸出的字符至少5位字符,不足5位將用空格補齊,-號代表補齊的空格在右邊,如果沒有-補齊的空格將在左邊。
%c:代表輸出日志時,所處于的那個類的全名,包括包名。
%m:輸出時附加的信息,也就是調用日志輸出方法的里的信息。
%n:代表換行,如果沒有它,所有的日志會連成一片。
前面的log4j.logger固定,后面是包名,rootLogger代表整個工程下所有輸出日志的地方都將按照這種方式進行輸出,也可以為某個包下的日志輸出配置不同的級別,如下就是把org.apache包下的日志不按照該方式進行輸出,也就是不會輸出該包下的debug信息,這樣就不會影響我們想要看的信息。
引入了log4j的jar包和配置文件,Mybatis自動就會輸出日志的原因:Mybatis的jar包的logging下的LogFactory.class里定義好了各種各樣的日志接口(log4j、log4j2、jdk?),使用哪一個日志,就會調用相應的日志接口完成日志輸出。
查看全部 -
動態SQL拼接
OGNL是一個功能強大的表達式語言:OGNL支持java的方法。
XML屬性的雙引號沖突解決辦法:使用轉義引號""
OGNL中&&的轉義:XML中不支持&&,需要使用轉義字符,&&也可以使用OGNL特有操作符and
SQL拼接:使用#{傳入的參數名},Mybatis處理這里時會把它處理為?,并對該?賦值。當Mybatis解析時會解析該參數并賦值,這里而且可以不需要考慮sql語句的空格等問題,只要寫在標簽中間,Mybatis會自動處理。
查看全部 -
動態SQL拼接
1、動態的給sql語句傳入參數
一般把屬性封裝成一個類,傳入這個類的對象,而sql配置文件中通過相應標簽的parameterType屬性指定該類的路徑,如果是java中提供的數據類型,例如String不用寫java.lang.String,直接寫String即可。
2、sql語句動態的獲取參數
在使用JDBC時進行判斷參數是否為null,或者為""時,使用的是if語句,如果不為null,或者不為"",則使用append追加字符串。
而Mybatis使用<if test=""></if>進行判斷,也就是OGNL表達式,Mybatis在sql配置文件中支持OGNL表達式。
Mybatis中的OGNL表達式
【1】取值范圍 ? ? ? ———————— ? ? ? 標簽的屬性中
取值的范圍可以是標簽屬性parameterType范圍,也可以從其他標簽屬性中取出,例如<foreach collection=""></foreach>,這時就會從collection屬性中取。
【2】取值寫法
如果是傳入的參數類型是String與基本數據類型,固定寫法:_parameter
如果是自定義類型(Message):直接寫屬性名(command)
如果是集合類型,固定寫法,大小寫敏感:數組:array,List:list,Map:_parameter
從集合中取出一條數據:
數組——array[索引](String[]),如果不是String或者基本類型,則是array[索引].屬性名(Message[])
List——list[索引](List<String>),如果不是String或者基本類型,則是
list[索引].屬性名(List<Message>)
Map——_parameter.key(Map<String,String>),_parameter可以省略,一般寫key.屬性名(Map<String,Message>),這個key就是java中存入的key名稱
利用foreach標簽可以從集合中取出數據:Mybatis的sql配置文件提供了<foreach collection="array" ?index="i" ?item="item">,可以循環數組、List、Map集合,collection屬性指向一個完整的集合,數組和List中index的i代表索引或者下標,在Map中i代表key,item代表循環某一個具體的數據,在Map中指的是value。
操作符:OGNL表達式目的,并不只是獲取值,也可能是對獲取到的值進行算數運算或者邏輯運算,OGNL操作符分為兩類,一類是java支持的操作符,OGNL都支持,另一類是OGNL特有的操作符(mod取模、in判斷某個值是否在一個集合中)如下圖
查看全部 -
SQL基本配置與執行
SQL基本配置:Mybatis通過XML標簽<insert>、<delete>、<update>、<select>執行SQL語句,Mapper標簽有一個namespace屬性(Mybatis規定所有的XML文件的id都不可以相同,所以可以通過給Mapper標簽的namespace起名解決該問題),SqlSession提供了增、刪、改、查的方法,通過在方法中傳入XML文件標簽的namespace.id可以查找到XML文件中相應的標簽并執行相應sql語句。
注意:Mapper標簽的namespace必須有,否則加載配置文件會出錯。
<resultMap>標簽:配置數據庫字段和實體類屬性之間的映射信息,type屬性——數據庫里的表對應java中哪一個類,所以它的值為類的全名稱,這樣字段值就會映射到該類屬性上。
id屬性——該映射關系的唯一標識(<resultMap>標簽的id和<select>等標簽id不沖突)。
<resultMap>子標簽——通過該標簽ID就可以映射到某個實體類
<id column="id" ?jdbcType="INTEGER" property="id"/>:如果數據庫這個字段是主鍵用該標簽。
<result column="username" jdbcType="VARCHAR" property="username":如果數據庫這個字段是普通字段用該標簽。
jdbcType:它的值應該是Types類中的常量名。在java.sql.Types包中,該類中存放著數據庫中數據類型與Types類中的常量名有著對應關系。
Sql語句引用映射關系:sql標簽中添加屬性resultMap="ResultMap的id",這樣查詢出來的列值就會映射到類的屬性中,如果查出來的字段值,在映射關系中沒有映射,那么就不放,如果配置了映射關系的屬性,在查詢時卻沒有返回該字段,那么實體類的該屬性值則為默認值。?
Mybatis核心配置文件中導入sql配置(Mapper.xml):sql的XML文件需要在Mybatis核心配置文件中配置才會生效,<mappers>可以有多個sql配置文件<mapper resource="Mapper文件的路徑/></mappers>,每個mapper對應一個sqlXML文件。
查看全部 -
本章主要介紹Mybatis 的下載、基本配置、基本應用以及Mybatis 的特征
【一】Mybatis官網下載:https://github.com/mybatis/mybatis-3/releases
mybatis-SNAPSHOT:mybatis快照版,臨時開發版本,這里下載開發版本。
這里需要下載Mybatis源碼包,該包中src——>test中有一些參考文件。
【二】Mybatis配置(Mybatis大部分工作在配置文件中)
步驟1:導Mybatis包(mybatis-3.3.0.jar)。
步驟2:Mybatis核心配置文件(可以參照Mybatis源碼包中演示代碼,只需要修改Configuration.xml中數據庫的信息(driver、username、password、url)路徑如下圖)
步驟3:讀取Mybatis核心配置文件(完成jdbc的操作,這里單獨創建一個類提供給Dao層SqlSession)
【1】:Mybatis提供了解析核心配置文件的方式:
Reader reader=Resources.getResourceAsReader(“Mybatis核心配置文件路徑”);
【2】:通過配置信息構建SqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader)
【3】:通過SqlSessionFactory打開數據庫會話(SqlSession)。
SqlSession sqlSession=sqlSessionFactory.openSession();
Mybatis相關知識點
SqlSession介紹:與數據庫交互。
SqlSession作用:
作用1:向SQL語句傳入參數(相當于預處理,設置sql語句中的?,并通過ps.setObject進行預處理)。
作用2:執行SQL語句
作用3:獲取執行SQL語句的結果
作用4:事物的控制?
Mybatis提供給Dao層的SqlSession獲取方式:
1、通過Mybatis核心配置文件獲取連接數據庫的相關信息。
2、通過Mybatis配置信息對象構建SqlSessionFactory。
3、通過SqlSessionFactory打開數據庫會話(SqlSession)。
查看全部 -
案例分析
基本功能:接收發送指令
? ? ? ? ? ? ? ? ?根據指令自動回復對應的內容
模塊劃分:
回復內容的維護——包括新增、修改等(維護的是發送的指令與回復內容的關系,也就是一種指令只能對應一段內容)
對話功能——用戶與公眾號對話的平臺,根據指令匹配回復內容
回復內容列表——把維護到數據庫的內容展示出來,具備搜索所有內容,還能進行二次維護(也可以從這里進行刪除)
回復內容刪除——
查看全部 -
OGNL表達式,里面大小寫敏感
查看全部 -
#{}會預編譯,用占位符 ? 代替,${}直接用查詢字符串替換,比如要查詢“消息”則會直接替換為 消息,注意是沒有 雙引號 的。
String 或 基本數據類型取值寫法不是非要寫成 #{_parameter} 而是可以寫成 #{任意,隨便寫什么} ,但是自定義的類型,就只能寫成 #{自定義類型}
查看全部
舉報