文章出處

mybatis核心:對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活拼接、組裝。

mybatis提供各種標簽方法實現動態拼接sql。

1. if&where

1.2 需求

用戶信息綜合查詢列表和用戶信息查詢列表總數這兩個statement的定義使用動態sql。

對查詢條件進行判斷,如果輸入參數不為空才進行查詢條件拼接。

1.3 mapper.xml

<select id="findUserList" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="joanna.yan.mybatis.entity.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="joanna.yan.mybatis.entity.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>

1.4測試代碼

 @Test
    public void findUserListTest() throws Exception{
        SqlSession sqlSession=sqlSessionFactory.openSession();
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        //創建包裝對象,設置查詢條件
        UserQueryVo userQueryVo=new UserQueryVo();
        UserCustom userCustom=new UserCustom();
        //由于這里使用動態sql,如果不設置某個值,條件不會拼接在sql中
//        userCustom.setSex("1");
        userCustom.setUsername("張三豐");
        userQueryVo.setUserCustom(userCustom);
        List<UserCustom> list=userMapper.findUserList(userQueryVo);
        System.out.println(list);
    }

打印的sql:如果不設置sex的值,條件不會拼接在sql中

2.sql片段

2.1 需求

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

2.2 定義sql片段

<!--定義sql片段
        id:sql片段的唯一標識
        
        經驗:1.是基于單表來定義sql片段的,這樣的話這個sql片段可重用性才高
            2.在sql片段中不要包括where
      -->
    <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>

2.3 引用sql片段

在mapper.xml中定義statement中引用sql片段:

 <select id="findUserList" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="joanna.yan.mybatis.entity.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="joanna.yan.mybatis.entity.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>

3. foreach

向sql傳遞數組或List,mybatis使用foreach解析。

3.1 需求

在用戶查詢列表和查詢總數的statement中增加多個id輸入查詢。

sql語句如下,兩種方法:

SELECT * FROM USER WHERE id=1 OR id=10 OR id=16

SELECT * FROM USER WHERE id IN(1,10,16)

3.2 在輸入參數類型中添加List<Integer> ids傳入多個id

3.3 修改mapper.xml

WHERE id=1 OR id=10 OR id=16

在前面的查詢條件中,查詢條件定義成了一個sql片段,現在我們需要修改sql片段。

 <!--定義sql片段
        id:sql片段的唯一標識
        
        經驗:1.是基于單表來定義sql片段的,這樣的話這個sql片段可重用性才高
            2.在sql片段中不要包括where
      -->
    <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 test="ids!=null">
                <!--使用foreach遍歷傳入的ids
                    collection:指定輸入對象中集合屬性
                    item:每個遍歷生成的對象名
                    open:開始遍歷時拼接的串
                    close:結束遍歷時拼接的串
                    separator:遍歷的兩個對象中需要拼接的串
                 -->
                 <!--是要實現下邊的sql拼接:
                     AND (id=1 OR id=10 OR id=16)
                   -->
                <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
                    <!--每個遍歷需要拼接的串  -->
                    id=#{user_id}
                </foreach>
            </if>
        </if>
    </sql>

3.4 測試代碼

 @Test
    public void findUserListTest() throws Exception{
        SqlSession sqlSession=sqlSessionFactory.openSession();
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        //創建包裝對象,設置查詢條件
        UserQueryVo userQueryVo=new UserQueryVo();
        UserCustom userCustom=new UserCustom();
        //由于這里使用動態sql,如果不設置某個值,條件不會拼接在sql中
//        userCustom.setSex("1");
        userCustom.setUsername("小明");
        //傳入多個id
        List<Integer> ids=new ArrayList<>();
        ids.add(1);
        ids.add(10);
        ids.add(16);
        userQueryVo.setIds(ids);
        userQueryVo.setUserCustom(userCustom);
        List<UserCustom> list=userMapper.findUserList(userQueryVo);
        System.out.println(list);
    }

 

轉載自 http://www.cnblogs.com/Joanna-Yan/p/6908763.html


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()