【MyBatis框架】mapper配置文件-關於動態sql

動態sql

1.什麼是動態sql
mybatis核心 對sql語句進行靈活操做,經過表達式進行判斷,對sql進行靈活拼接、組裝。

2.需求

用戶信息綜合查詢列表和用戶信息查詢列表總數這兩個statement的定義使用動態sql。
對查詢條件進行判斷,若是輸入參數不爲空才進行查詢條件拼接。

3.mapper.xml
原查詢語句配置:java

<mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">
    
    <!-- 用戶信息綜合查詢 
    #{UserCustom.sex}取出包裝對象中性別值
    ${UserCustom.username}取得pojo包裝對象中用戶名稱
    -->
    <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" 
                                resultType="cn.edu.hpu.mybatis.PO.UserCustom">
        select * from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
    </select>
    
    <!-- 用戶信息綜合查詢總數 -->
    <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">
        select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
    </select>
    ......
</mapper>

修改後的查詢語句配置:程序員

<!-- 用戶信息綜合查詢 
    #{UserCustom.sex}取出包裝對象中性別值
    ${UserCustom.username}取得pojo包裝對象中用戶名稱
    -->
    <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" 
                                resultType="cn.edu.hpu.mybatis.PO.UserCustom">
        select * 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 like '%${userCustom.username}%'
            </if>
        </if>
        </where>
    </select>
    
    <!-- 用戶信息綜合查詢總數 -->
    <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">
        select count(*) 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 like '%${userCustom.username}%'
            </if>
        </if>
        </where>
    </select>

4.測試代碼sql

//用戶信息綜合查詢
    @Test
    public void testFindUserList() throws Exception{
        
        SqlSession sqlSession=sqlSessionFactory.openSession();
        
        //建立UserMapper代理對象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        
        //建立包裝對象,設置查詢條件
        UserQueryVo userQueryVo=new UserQueryVo();
        UserCustom userCustom=new UserCustom();
        //因爲這裏使用動態sql,若是這裏不設置某個值,條件不會拼接在sql中
        //userCustom.setSex("男");
        userCustom.setUsername("張三");
        userQueryVo.setUserCustom(userCustom);
        
        //調用userMapper的方法
        List<UserCustom> users=userMapper.findUserList(userQueryVo);
        
        for (int i = 0; i < users.size(); i++) {
            UserCustom user=(UserCustom)users.get(i);
            System.out.println(user.getId()+":"+user.getUsername());
        }
    }

測試結果:
1:張三
4:張三丰mybatis

發現sql語句爲select * from user WHERE user.username like '%張三%' ,並無將sex拼接進去,說明咱們的動態sql設置成功app


5.sql片斷測試


5.1需求
將上邊實現的動態sql判斷代碼塊抽取出來,組成一個sql片斷。其它的statement中就能夠引用sql片斷。
方便程序員進行開發。

5.2定義sql片斷spa

<mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">

    <!-- 定義sql片斷 
    id:sql片斷的惟一標識 
    在sql片斷中不要加入where
    經驗:通常咱們定義sql片斷是爲了可重用性,是基於單表來定義sql片斷,
    這樣的話這個sql片斷可重用性才高-->
    <sql id="query_user_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 like '%${userCustom.username}%'
            </if>
        </if>
    </sql>
    ......
</mapper>

5.3引用sql片斷
在mapper.xml中定義的statement中引用sql片斷:代理

<!-- 用戶信息綜合查詢 
    #{UserCustom.sex}取出包裝對象中性別值
    ${UserCustom.username}取得pojo包裝對象中用戶名稱
    -->
    <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" 
                                resultType="cn.edu.hpu.mybatis.PO.UserCustom">
        select * from user 
        
        <!-- where標籤能夠自動去掉第一個and -->  
        <where>
            <!-- 應用sql片斷的id,若是refid指定的id再也不本mapper文件中,須要前邊加namespace -->
            <include refid="query_user_where"></include>
            <!-- 在這裏還可能要引用其餘的sql片斷 -->
        </where>
    </select>
    
    <!-- 用戶信息綜合查詢總數 -->
    <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">
        select count(*) from user 


        <!-- where標籤能夠自動去掉第一個and -->  
        <where>
            <!-- 應用sql片斷的id,若是refid指定的id再也不本mapper文件中,須要前邊加namespace -->
            <include refid="query_user_where"></include>
            <!-- 在這裏還可能要引用其餘的sql片斷 -->
        </where>
    </select>

測試:code

//用戶信息綜合查詢
@Test
public void testFindUserList() throws Exception{
    
    SqlSession sqlSession=sqlSessionFactory.openSession();
    
    //建立UserMapper代理對象
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    
    //建立包裝對象,設置查詢條件
    UserQueryVo userQueryVo=new UserQueryVo();
    UserCustom userCustom=new UserCustom();
    //因爲這裏使用動態sql,若是這裏不設置某個值,條件不會拼接在sql中
    userCustom.setSex("男");
    userCustom.setUsername("張三");
    userQueryVo.setUserCustom(userCustom);
    
    //調用userMapper的方法
    List<UserCustom> users=userMapper.findUserList(userQueryVo);
    
    for (int i = 0; i < users.size(); i++) {
        UserCustom user=(UserCustom)users.get(i);
        System.out.println(user.getId()+":"+user.getUsername());
    }
}

測試結果:
1:張三
4:張三丰xml


小結:

sql片斷方便程序員進行開發

相關文章
相關標籤/搜索