16Mybatis_動態sql_if判斷


mybatis的核心就是動態sql.

什么是動態sql:對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活拼接、組裝。

 

這篇文章講解sql中的if語句。它可以對查詢條件進行判斷,如果輸入參數不為空才進行查詢條件的拼接。這篇文章的核心就是下面的這段代碼。

<!-- 
<where></where>相當於sql語句中的where關鍵字。
這個標簽還有一個功能就是自動會去掉第一個and.,比如下面兩句sql代碼,如果第一個滿足的那么就會去掉and這個關鍵字。





-->

<
where> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex= #{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''" > and user.username=#{userCustom.username} </if> </if> </where>

下面給出u具體案例:

案例代碼結構如下:

除了userMapper.xml和Mybatis_mappertest.java要修改外,其他的代碼都不用變。

userMapper.xml代碼如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- nanmespace:命名空間。 作用就是對sql進行分類話管理,理解Sal分離

注意:使用mapper代理方式,namespace有特殊重要的作用
-->

<mapper namespace="cn.itcast.mybatis.mapper.userMapper">
   
 <!-- 
 這里的id要和Mapp接口里面的函數名字一模一樣。parameterType表示輸入的類型,
 resultType表示輸出的類型
 
  -->
    <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom">
        SELECT id ,username FROM USER WHERE user.sex= #{userCustom.sex} AND user.username=#{userCustom.username} 
    </select>
    
    <!-- 
    定義resultMap
    將SELECT id id_,username username_ FROM USER 和User類中的屬性做一個映射關系
    
    type:resultMap最終映射的java對象類型,可以使用別名
    id:對resultMap的唯一標識。
     -->
    <resultMap type="user" id="userResultMap">
        <!-- 
        id:表示查詢結果集中唯一的標識。
        column:查詢出來的列名
        property:type指定的pojo類型中的屬性名
        最終resultMap對column和property作一個映射關系(對應關系)
        
        
         -->
        <id column="id_" property="id"/>
        <result column="username_" property="username"/>
    </resultMap>
    
        <select id="findUserByResultMap" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultMap="userResultMap">
        SELECT id id_,username username_ FROM USER 
    <!-- 
    
    where可以自動去掉條件中的第一個and
     -->
    <where>
        <if test="userCustom!=null">
            <if test="userCustom.sex!=null and userCustom.sex!=''">
                and  user.sex= #{userCustom.sex}
            </if>
            <if  test="userCustom.username!=null and userCustom.username!=''" >
                
                and user.username=#{userCustom.username} 
            </if>
            
            
        </if>
        
        
    </where>
    
    </select>
    
   
</mapper>

測試代碼Mybatis_mappertest.java代碼如下:

package cn.itcast.mybatis.first;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;


import cn.itcast.mybatis.mapper.userMapper;
import cn.itcast.mybatis.po.User;
import cn.itcast.mybatis.po.UserCustom;
import cn.itcast.mybatis.po.UserQueryVo;

public class Mybatis_mappertest {
    
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setup() throws IOException
    {   String resource="SqlMapConfig.xml";
        InputStream inputStream= Resources.getResourceAsStream(resource);
        //主要是生成SqlsessionFactory。
        this.sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void testMaper()
    {
        SqlSession sqlSession=null;
        
        sqlSession=sqlSessionFactory.openSession();
        //生成代理類
        userMapper userMapper=sqlSession.getMapper(userMapper.class);
    //創建包裝對象,設置查詢條件
        UserQueryVo userQueryVo=new UserQueryVo();
        UserCustom userCustom=new UserCustom();
     
        // 注意我把這里的sex注銷掉了,也就是說sex沒有值,那么我們用的是動態的sql語句,就是說sex不會被拼接進去吧
       // userCustom.setSex("1");
        userCustom.setUsername("王王");
        userQueryVo.setUserCustom(userCustom);
        
        userMapper.findUserByResultMap(userQueryVo);
        
        
    }

}

運行如下:

DEBUG [main] - ==>  Preparing: SELECT id id_,username username_ FROM USER WHERE user.username=?

看到沒,這里得sql語句中沒有 and user.sex= #{userCustom.sex}這條語句。也就是說沒有拼接上去。

 

我們再改一下:干脆把整個userCustom都不輸入進去。

結果如下:

DEBUG [main] - ==>  Preparing: SELECT id id_,username username_ FROM USER

看到沒,這里的sql語句中什么where后面的語句都沒有拼接上去了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM