1. 程式人生 > >Mybatis對映檔案 if,where,foreach語句,動態sql配置

Mybatis對映檔案 if,where,foreach語句,動態sql配置

1.if  

注意要做不等於空字串校驗。

<!-- 傳遞pojo綜合查詢使用者資訊 -->
	<select id="findUserList" parameterType="user" resultType="user">
		select * from user 
		where 1=1 
		<if test="id!=null and id!=''">
		and id=#{id}
		</if>
		<if test="username!=null and username!=''">
		and username like '%${username}%'
		</if>
	</select>
2.where

上邊的sql也可以改為:

<select id="findUserList" parameterType="user" resultType="user">
		select * from user 
		<where>
		<if test="id!=null and id!=''">
		and id=#{id}
		</if>
		<if test="username!=null and username!=''">
		and username like '%${username}%'
		</if>
		</where>
	</select>

<where />可以自動處理第一個and。

3.foreach

向sql傳遞陣列或List,mybatis使用foreach解析,如下:

3.1 通過pojo傳遞list

傳入多個id查詢使用者資訊,用下邊兩個sql實現:

SELECT * FROM USERS WHERE username LIKE '%張%' AND (id=10 OR id =89 OR id=16)

SELECT * FROM USERS WHERE username LIKE '%張%'  id IN (10,89,16)

在pojo中定義list屬性ids儲存多個使用者id,並新增getter/setter方法

mapper.xml

<if test="ids!=null and ids.size>0">
	    	<foreach collection="ids" open=" and id in(" close=")" item="id" separator="," >
	    		#{id}
	    	</foreach>
</if>

測試程式碼:

List<Integer> ids = new ArrayList<Integer>();
		ids.add(1);//查詢id為1的使用者
		ids.add(10); //查詢id為10的使用者
		queryVo.setIds(ids);
		List<User> list = userMapper.findUserList(queryVo);

3.2 傳遞單個List

傳遞List型別在編寫mapper.xml沒有區別,唯一不同的是隻有一個List引數時它的引數名為list。

Mapper.xml

<select id="selectUserByList" parameterType="java.util.List" resultType="user">
		select * from user 
		<where>
		<!-- 傳遞List,List中是pojo -->
		<if test="list!=null">
		<foreach collection="list" item="item" open="and id in("separator=","close=")">
		    #{item.id} 
		</foreach>
		</if>
		</where>
	</select>

Mapper介面

public List<User> selectUserByList(List userlist) throws Exception;

測試:

Public void testselectUserByList()throws Exception{
		//獲取session
		SqlSession session = sqlSessionFactory.openSession();
		//獲限mapper介面例項
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//構造查詢條件List
		List<User> userlist = new ArrayList<User>();
		User user = new User();
		user.setId(1);
		userlist.add(user);
		user = new User();
		user.setId(2);
		userlist.add(user); 
		//傳遞userlist列表查詢使用者列表
		List<User>list = userMapper.selectUserByList(userlist);
		//關閉session
		session.close();
	}

3.3 傳遞單個數組,陣列中是pojo

Mapper.xml

<!-- 傳遞陣列綜合查詢使用者資訊 -->
	<select id="selectUserByArray" parameterType="Object[]" resultType="user">
		select * from user 
		<where>
		<!-- 傳遞陣列 -->
		<if test="array!=null">
		<foreach collection="array" index="index" item="item" open="and id in("separator=","close=")">
		    #{item.id} 
		</foreach>
		</if>
		</where>
	</select>

sql只接收一個數組引數,這時sql解析引數的名稱mybatis固定為array,如果陣列是通過一個pojo傳遞到sql則引數的名稱為pojo中的屬性名。

index:為陣列的下標。

item:為陣列每個元素的名稱,名稱隨意定義

open:迴圈開始

close:迴圈結束

separator:中間分隔輸出

Mapper介面:

public List<User> selectUserByArray(Object[] userlist) throws Exception;

測試:

Public void testselectUserByArray()throws Exception{
		//獲取session
		SqlSession session = sqlSessionFactory.openSession();
		//獲限mapper介面例項
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//構造查詢條件List
		Object[] userlist = new Object[2];
		User user = new User();
		user.setId(1);
		userlist[0]=user;
		user = new User();
		user.setId(2);
		userlist[1]=user;
		//傳遞user物件查詢使用者列表
		List<User>list = userMapper.selectUserByArray(userlist);
		//關閉session
		session.close();
	}
3.4 傳遞單個數組(陣列中是字串型別)

Mapper.xml

<!-- 傳遞陣列綜合查詢使用者資訊 -->
	<select id="selectUserByArray" parameterType="Object[]" resultType="user">
		select * from user 
		<where>
		<!-- 傳遞陣列 -->
		<if test="array!=null">
		<foreach collection="array"index="index"item="item"open="and id in("separator=","close=")">
		    #{item} 
		</foreach>
		</if>
		</where>
	</select>

如果陣列中是簡單型別則寫為#{item},不用再通過ognl獲取物件屬性值了。

Mapper介面:

public List<User> selectUserByArray(Object[] userlist) throws Exception;

測試:

Public void testselectUserByArray()throws Exception{
		//獲取session
		SqlSession session = sqlSessionFactory.openSession();
		//獲限mapper介面例項
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//構造查詢條件List
		Object[] userlist = new Object[2];
		userlist[0]=”1”;
		userlist[1]=”2”;
		//傳遞user物件查詢使用者列表
		List<User>list = userMapper.selectUserByArray(userlist);
		//關閉session
		session.close();
	}

4.sql片段

Sql中可將重複的sql提取出來,使用時用include引用即可,最終達到sql重用的目的,如下:

<!-- 傳遞pojo綜合查詢使用者資訊 -->
	<select id="findUserList" parameterType="user" resultType="user">
		select * from user 
		<where>
		<if test="id!=null and id!=''">
		and id=#{id}
		</if>
		<if test="username!=null and username!=''">
		and username like '%${username}%'
		</if>
		</where>
	</select>

將where條件抽取出來:

<sql id="query_user_where">
	<if test="id!=null and id!=''">
		and id=#{id}
	</if>
	<if test="username!=null and username!=''">
		and username like '%${username}%'
	</if>
</sql>
使用include引用:
<select id="findUserList" parameterType="user" resultType="user">
		select * from user 
		<where>
		<include refid="query_user_where"/>
		</where>
	</select>

注意:如果引用其它mapper.xml的sql片段,則在引用時需要加上namespace,如下:

<includerefid="namespace.sql片段”/>

5.關於 關聯查詢,其實和單表差不多,只是pojo裡面要加入查詢到的所有資訊;

6.延遲載入--------待續