MyBatis筆記(二)
阿新 • • 發佈:2021-08-11
動態SQL語句
1.<if>
標籤
<if>
標籤用來有條件地執行標籤內的SQL語句,例如當username不為空時將使用者名稱作為匹配條件。
UserDao.java
/**
* 根據QueryVo中的條件查詢使用者
* @param vo
* @return
*/
List<User> findByVo(QueryVo vo);
UserDao.xml
<select id="findByUser" resultType="User" parameterType="User"> select * from user where 1=1 <if test="username != null and username != '' "> and username like #{username} </if> <if test="address != null"> and address like #{address} </if> </select>
MyBatisTests.java
@Test
public void testFindByUser() {
User user = new User();
user.setUsername("%g%");
user.setAddress("%黃%");
List<User> users = userDao.findByUser(user);
for (User u : users) {
System.out.println(u);
}
}
2.<where>
標籤
為了簡化上面 where 1=1 的條件拼裝,我們可以採用<where>
UserDao.xml
<select id="findByUser" resultType="User" parameterType="User"> select * from user <where> <if test="username != null and username != '' "> and username like #{username} </if> <if test="address != null"> and address like #{address} </if> </where> </select>
3.<foreach>
標籤
當需要用多個id查詢使用者時,SQL是這樣的:select * from user where id in (1, 2, 3);
這樣我們在進行範圍查詢時,就要將一個集合中的值,作為引數動態新增進來。
在QueryVo.java
中加入一個List集合用於封裝引數
private List<Integer> ids;
UserDao.java
/**
* 根據id集合查詢使用者列表
* @param vo
* @return
*/
List<User> findInIds(QueryVo vo);
UserDao.xml
<select id="findInIds" resultType="User" parameterType="QueryVo">
select * from user
<where>
<if test="ids != null and ids.size() > 0">
<foreach collection="ids" open="id in ( " close=")" item="id" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
MyBatisTests.java
@Test
public void testFindInIds() {
QueryVo vo = new QueryVo();
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
ids.add(3);
vo.setIds(ids);
List<User> users = userDao.findInIds(vo);
for (User user : users) {
System.out.println(user);
}
}
<foreach>
標籤用於遍歷集合,它的屬性:
- collection: 代表要遍歷的集合元素,注意編寫時不要寫#{}
- open: 代表SQL的開始部分
- close: 代表SQL的結束部分
- item: 代表遍歷集合的每個元素,生成的變數名
- sperator: 代表分隔符
4.<sql>
標籤和<include>
標籤
Mapper中可將重複的SQL提取出來,使用<include>
引用即可,最終達到SQL重複使用的目的。
UserDao.xml
<sql id="defaultSql">
select * from user
</sql>
<select id="findById" resultType="User" parameterType="int">
<include refid="defaultSql"></include>
<where>
<if test="username != null and username != '' ">
and username like #{username}
</if>
<if test="address != null">
and address like #{address}
</if>
</where>
</select>