1. 程式人生 > >mybatis配置詳解---XXXMapper.xml

mybatis配置詳解---XXXMapper.xml

一:功能

Mapper.xml對映檔案中定義了操作資料庫的sql,每個sql是一個statement,對映檔案是mybatis的核心。

二:主要的屬性

1、parameterType:指定輸入對映引數的型別,可以是基本型別、也可是是定義的實體類。

#{}與${}:

#{}實現的是向prepareStatement中的預處理語句中設定引數值,sql語句中#{}表示一個佔位符即?。如:

<select id="findUserById" parameterType="int" resultType="user">
		select * from user where id=#{id}
	</select><span style="font-family: 宋體; background-color: rgb(255, 255, 255);">	</span>

使用佔位符#{}可以有效防止sql注入,在使用時不需要關心引數值的型別,mybatis會自動進行java型別和jdbc型別的轉換。#{}可以接收簡單型別值或pojo屬性值,

如果parameterType傳輸單個簡單型別值,#{}括號中可以是value或其它名稱

${}和#{}不同,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc型別轉換, ${}可以接收簡單型別值或pojo屬性值,如果parameterType傳輸單個簡單

型別值,${}括號中只能是value。使用${}不能防止sql注入,但是有時用${}會非常方便,如下的例子:

<select id="findUserByName" parameterType="string" resultType="cn.itcast.mybatis.po.User">
		select * from user where username like '%${value}%'
	</select>
如果本例子使用#{}則傳入的字串中必須有%號,而%是人為拼接在引數中,顯然有點麻煩,如果採用${}在sql中拼接為%的方式則在呼叫mapper介面傳遞引數就方便很

多。再比如order by排序,如果將列名通過引數傳入sql,根據傳的列名進行排序,應該寫為:ORDER BY ${columnName},如果使用#{}將無法實現此功能

這時候你就會發現一個問題,無論使用selectOne()還是使用selectList()方法,只能穿進去一個引數,那麼多條件查詢、分頁的又怎麼去處理呢?因為mybatis的輸

入對映引數主持pojo,那麼我們就可以自定義一個有關引數的pojo,然後把需要的屬性封裝到pojo物件中當做引數寫入方法中,就能夠查詢了。例子如下:

mapper.xml

<select id="findUserList" parameterType="queryUserVo" resultType="user">
		select id,username,birthday from user  where #{user.username} and sex={user.sex}
	</select>
自定義的pojo
public class QueryUserVo {	
	//可能要包括很多pojo型別作為它的屬性	
	//使用者資訊
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
}
在dao實現類的方法寫入方法中即可

2、resultType:指定輸出結果對映型別,確切的理解是指定單條記錄所對映的型別,可以是pojo、基本型別、hashmap..

(1):輸出pojo物件和輸出pojo列表在sql中定義的resultType是一樣的。

(2):返回單個pojo物件要保證sql查詢出來的結果集為單條,內部使用session.selectOne方法呼叫,mapper介面使用pojo物件作為方法返回值。 

(3):返回pojo列表表示查詢出來的結果集可能為多條,內部使用session.selectList方法,mapper介面使用List<pojo>物件作為方法返回值。

(4):輸出pojo物件可以改用hashmap輸出型別,將輸出的欄位名稱作為map的key,value為欄位值。

resultMap:

resultType可以指定pojo將查詢結果對映為pojo,但需要pojo的屬性名和sql查詢的列名一致方可對映成功。

如果sql查詢欄位名和pojo的屬性名不一致,可以通過resultMap將欄位名和屬性名作一個對應關係 ,resultMap實質上還需要將查詢結果對映到pojo物件中。

resultMap可以實現將查詢結果對映為複雜型別的pojo,比如在查詢結果對映物件中包括pojo和list實現一對一查詢和一對多查詢。

由於resultMap中內容比較重要,而且表之間一對多、多對多、一對一都是在這裡面設定的,因此後面會有一個專題,這裡先說這些

三:總結

主要寫了輸入輸出的對映型別,後面會有一個動態sql、resultMap(一對一,多對一,多對多,一對多)的專題。詳細介紹這兩個