Mybatis中的動態sql——Mybatis中OGNL表示式的使用
阿新 • • 發佈:2020-12-29
Mybatis中的OGNL表示式
1.if
判斷語句
案例:查詢男性使用者,如果輸入了使用者名稱,按使用者名稱模糊查詢
- 定義介面
在UserMapper介面中定義方法:/** * 查詢男性使用者,如果輸入了使用者名稱,按使用者名稱模糊查詢 * @param userName * @return */ public List<User> queryUserListLikeUserName(@Param("userName")String userName);
- 編寫mapper.xml
在UserMapper對映檔案中,定義介面方法對應的Statement<
- 測試
在UserMapperTest測試類中,新增測試用例@Test
2.choose when otherwise
案例:查詢男性使用者,如果輸入了使用者名稱則按照使用者名稱模糊查詢,否則如果輸入了年齡則按照年齡查詢,否則查詢使用者名稱為“zhangsan”的使用者
- 定義介面
在UserMapper介面中定義方法:/** * 查詢男性使用者,如果輸入了使用者名稱則按照使用者名稱模糊查詢,否則如果輸入了年齡則按照年齡查詢,否則查詢使用者名稱為“zhangsan”的使用者。 * @param userName * @param age * @return */ public List<User> queryUserListLikeUserNameOrAge(@Param("userName")String userName, @Param("age")Integer age);
- 編寫mapper.xml
在UserMapper對映檔案中,定義介面方法對應的Statement<select id="queryUserListLikeUserNameOrAge" resultType="User"> select * from tb_user where sex=1 <!-- choose:條件選擇 when:test-判斷條件,一旦有一個when成立,後續的when都不再執行 otherwise:所有的when都不成立時,才會執行 --> <choose> <when test="userName!=null and userName.trim()!=''">and user_name like '%' #{userName} '%'</when> <when test="age != null">and age = #{age}</when> <otherwise>and user_name = 'zhangsan' </otherwise> </choose> </select>
- 測試
在UserMapperTest測試類中,新增測試用例@Test public void testQueryUserListLikeUserNameOrAge(){ List<User> users = this.userMapper.queryUserListLikeUserNameOrAge(null, null); for (User user : users) { System.out.println(user); } }
3.where
案例:查詢所有使用者,如果輸入了使用者名稱按照使用者名稱進行模糊查詢,如果輸入年齡,按照年齡進行查詢,如果兩者都輸入,兩個條件都要成立
- 定義介面
在UserMapper介面中定義方法:/** * 查詢男性使用者,如果輸入了使用者名稱則按照使用者名稱模糊查詢,否則如果輸入了年齡則按照年齡查詢,否則查詢使用者名稱為“zhangsan”的使用者。 * @param userName * @param age * @return */ public List<User> queryUserListLikeUserNameOrAge(@Param("userName")String userName, @Param("age")Integer age);
- 編寫mapper.xml
在UserMapper對映檔案中,定義介面方法對應的Statement<select id="queryUserListLikeUserNameOrAge" resultType="User"> select * from tb_user where sex=1 <!-- choose:條件選擇 when:test-判斷條件,一旦有一個when成立,後續的when都不再執行 otherwise:所有的when都不成立時,才會執行 --> <choose> <when test="userName!=null and userName.trim()!=''">and user_name like '%' #{userName} '%'</when> <when test="age != null">and age = #{age}</when> <otherwise>and user_name = 'zhangsan' </otherwise> </choose> </select>
- 測試
在UserMapperTest測試類中,新增測試用例@Test public void testQueryUserListLikeUserNameOrAge(){ List<User> users = this.userMapper.queryUserListLikeUserNameOrAge(null, null); for (User user : users) { System.out.println(user); } }
4.set
案例:修改使用者資訊,如果引數user中的某個屬性為null,則不修改
- 定義介面
在UserMapper介面中定義方法:/** * 修改使用者資訊,如果引數user中的某個屬性為null,則不修改。 * @param user */ public void updateUserSelective(User user);
- 編寫mapper.xml
在UserMapper對映檔案中,定義介面方法對應的Statement<update id="updateUserSelective" > UPDATE tb_user <!-- set自動新增set關鍵字 也有一定的糾錯功能:自動去掉sql語句塊之後多餘的一個逗號 --> <set> <if test="userName!=null and userName.trim()!=''">user_name = #{userName},</if> <if test="password!=null and password.trim()!=''">password = #{password},</if> <if test="name!=null and name.trim()!=''">name = #{name},</if> <if test="age!=null">age = #{age},</if> <if test="sex!=null">sex = #{sex},</if> updated = now(), </set> WHERE (id = #{id}); </update>
- 測試
在UserMapperTest測試類中,新增測試用例@Test public void testUpdateUserSelective(){ User user = new User(); user.setAge(18); user.setName("柳巖"); user.setPassword("123456"); user.setUserName("yanyan2"); //user.setSex(3); user.setBirthday(new Date()); user.setId(12l); this.userMapper.updateUserSelective(user); }
5.foreach
案例:按照多個id查詢使用者資訊
- 定義介面
在UserMapper介面中定義方法:/** * 根據多個id查詢使用者資訊 * @param ids * @return */ public List<User> queryUserListByIds(@Param("ids")Long[] ids);
- 編寫mapper.xml
在UserMapper對映檔案中,定義介面方法對應的Statement<select id="queryUserListByIds" resultType="User"> select * from tb_user where id in <!-- foreach:遍歷集合 collection:接收的集合引數 item:遍歷的集合中的一個元素 separator:分隔符 open:以什麼開始 close:以什麼結束 --> <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </select>
- 測試
在UserMapperTest測試類中,新增測試用例@Test public void testQueryUserListByIds(){ List<User> users = this.userMapper.queryUserListByIds(new Long[]{1l,2l,3l,4l}); for (User user : users) { System.out.println(user); } }