Mybatis對映檔案 if,where,foreach語句,動態sql配置
1.if
注意要做不等於空字串校驗。
2.where<!-- 傳遞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>
上邊的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.延遲載入--------待續