1. 程式人生 > 其它 >Mybatis中的動態sql——Mybatis中OGNL表示式的使用

Mybatis中的動態sql——Mybatis中OGNL表示式的使用

技術標籤:mybatismysqljavassmsql

Mybatis中的OGNL表示式


在這裡插入圖片描述

1.if

判斷語句

案例:查詢男性使用者,如果輸入了使用者名稱,按使用者名稱模糊查詢

  • 定義介面
    在UserMapper介面中定義方法:
    /**
     * 查詢男性使用者,如果輸入了使用者名稱,按使用者名稱模糊查詢
     * @param userName
     * @return
     */
    public List<User> queryUserListLikeUserName(@Param("userName")String userName);
    
  • 編寫mapper.xml
    在UserMapper對映檔案中,定義介面方法對應的Statement
    <
    select
    id="queryUserListLikeUserName" resultType="User">
    select * from tb_user where sex=1 <!-- if:判斷 test:OGNL表示式 --> <if test="userName!=null and userName.trim()!=''"> and user_name like '%' #{userName} '%' </if> </select>
  • 測試
    在UserMapperTest測試類中,新增測試用例
    @Test
    public void testQueryUserListLikeUserName(){ List<User> users = this.userMapper.queryUserListLikeUserName("zhang"); for (User user : users) { System.out.println(user); } }

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);
    	}
    }