Mybatis的動態SQL語句主要解決的問題是不同條件SQL語句的拼接。
例如:根據用戶信息,查詢用戶列表,當不知道根據的是用戶的什麼信息時,寫出查詢的SQL語句是有一定困難的,而動態SQL語句主要解決的就是此類問題。
if標籤的使用
在持久層接口定義方法
/**
* 根據用戶信息,查詢用戶列表
* @param user
* @return
*/
List<User> findByUser(User user);
編寫持久層接口對應的映射文件
<!-- 根據用戶信息,查詢用戶列表 -->
<select id="findByUser" resultType="User" parameterType="User">
select *from user where 1 = 1
<if test="id != 0">
and id = #{id}
</if>
<if test="username != null and username != '' ">
and username like #{username}
</if>
<if test="birthday != null">
and birthday = #{birthday}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
<if test="address != null">
and address = #{address}
</if>
</select>
編寫測試方法
/**
* 根據用戶信息,查詢用戶列表
*/
@Test
public void testFindByUser()
{
User user = new User();
user.setUsername("%王%");
List<User> users = userDao.findByUser(user);
for (User u : users)
{
System.out.println(u);
}
}
where標籤的使用
爲了簡化上面 where 1=1 的條件拼接,我們可以採用標籤來簡化開發,因此修改持久層映射文件
<!-- 根據用戶信息,查詢用戶列表 -->
<select id="findByUser" resultType="User" parameterType="User">
select *from user
<where>
<if test="id != 0">
and id = #{id}
</if>
<if test="username != null and username != '' ">
and username like #{username}
</if>
<if test="birthday != null">
and birthday = #{birthday}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
<if test="address != null">
and address = #{address}
</if>
</where>
</select>
foreach標籤的使用
froeach是對一個集合進行遍歷,通常在構建in條件語句的時候應用
例如:根據一個用戶id集合查詢用戶。
對id集合進行封裝,加入到List集合
編寫持久層接口方法
/**
* 根據id集合查詢用戶
* @param queryUR
* @return
*/
List<User> findInIds(QueryUR queryUR);
編寫持久層接口映射文件
<!--根據id集合查詢用戶 -->
<select id="findInIds" resultType="user" parameterType="int">
select *from user
<where>
<if test="ids != null and ids.size() > 0">
<!-- foreach:用於遍歷集合
collection:代表要遍歷的集合
open:代表語句的開始部分
close:代表語句的結束部分
item:代表需要遍歷的集合的每個元素
sperator:代表分隔符
-->
<foreach collection="ids" open="id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
編寫測試方法
/**
* 根據id集合查詢用戶
*/
@Test
public void testFindInIds()
{
QueryUR queryUR = new QueryUR();
List<Integer> ids = new ArrayList<Integer>();
ids.add(41);
ids.add(43);
ids.add(45);
queryUR.setIds(ids);
List<User> users = userDao.findInIds(queryUR);
for (User user : users)
{
System.out.println(user);
}
}
SQL語句的簡化編寫
在映射文件中,可以將重複的SQL語句通過sql標籤提取出來,使用include標籤引用即可,已達到sql重用的效果。如下所示:
<!--抽取重複的語句代碼片段-->
<sql id="querySql">
select *from user
</sql>
<select id="findAll" resultType="USER" >
<include refid="querySql"></include>
</select>
<!--根據id查詢用戶-->
<select id="findById" resultType="User" parameterType="int">
<include refid="querySql"></include> where id= #{userID};
</select>