Mybatis的動態SQL語句

Mybatis的動態SQL語句主要解決的問題是不同條件SQL語句的拼接
例如:根據用戶信息,查詢用戶列表,當不知道根據的是用戶的什麼信息時,寫出查詢的SQL語句是有一定困難的,而動態SQL語句主要解決的就是此類問題。

if標籤的使用

在持久層接口定義方法

    /**
     * 根據用戶信息,查詢用戶列表
     * @param user
     * @return
     */
    List<User> findByUser(User user);

編寫持久層接口對應的映射文件

 <!-- 根據用戶信息,查詢用戶列表 -->
    <select id="findByUser" resultType="User" parameterType="User">
        select *from user where 1 = 1
        <if test="id != 0">
            and id = #{id}
        </if>
        <if test="username != null and username != '' ">
            and username like #{username}
        </if>
        <if test="birthday != null">
            and birthday = #{birthday}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
        <if test="address != null">
            and address = #{address}
        </if>
    </select>

編寫測試方法

  /**
     * 根據用戶信息,查詢用戶列表
     */
    @Test
    public void testFindByUser()
    {
        User user = new User();
        user.setUsername("%王%");
        List<User> users = userDao.findByUser(user);
        for (User u : users)
        {
            System.out.println(u);
        }
    }

where標籤的使用

爲了簡化上面 where 1=1 的條件拼接,我們可以採用標籤來簡化開發,因此修改持久層映射文件

 <!-- 根據用戶信息,查詢用戶列表 -->
    <select id="findByUser" resultType="User" parameterType="User">
        select *from user
        <where>
            <if test="id != 0">
                and id = #{id}
            </if>
            <if test="username != null and username != '' ">
                and username like #{username}
            </if>
            <if test="birthday != null">
                and birthday = #{birthday}
            </if>
            <if test="sex != null">
                and sex = #{sex}
            </if>
            <if test="address != null">
                and address = #{address}
            </if>
        </where>
    </select>

foreach標籤的使用

froeach是對一個集合進行遍歷,通常在構建in條件語句的時候應用
例如:根據一個用戶id集合查詢用戶。
對id集合進行封裝,加入到List集合
在這裏插入圖片描述
編寫持久層接口方法

  /**
     * 根據id集合查詢用戶
     * @param queryUR
     * @return
     */
    List<User> findInIds(QueryUR queryUR);

編寫持久層接口映射文件

  <!--根據id集合查詢用戶 -->
    <select id="findInIds" resultType="user" parameterType="int">
       select *from user
       <where>
           <if test="ids != null and ids.size() > 0">
                <!-- foreach:用於遍歷集合
                    collection:代表要遍歷的集合
                    open:代表語句的開始部分
                    close:代表語句的結束部分
                    item:代表需要遍歷的集合的每個元素
                    sperator:代表分隔符
                 -->
               <foreach collection="ids" open="id in (" close=")" item="uid" separator=",">
                    #{uid}
               </foreach>
           </if>
       </where>
    </select>

編寫測試方法

  /**
     * 根據id集合查詢用戶
     */
    @Test
    public void testFindInIds()
    {
        QueryUR queryUR = new QueryUR();
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(41);
        ids.add(43);
        ids.add(45);
        queryUR.setIds(ids);
        List<User> users = userDao.findInIds(queryUR);
        for (User user : users)
        {
            System.out.println(user);
        }
    }

SQL語句的簡化編寫

在映射文件中,可以將重複的SQL語句通過sql標籤提取出來,使用include標籤引用即可,已達到sql重用的效果。如下所示:

    <!--抽取重複的語句代碼片段-->
    <sql id="querySql">
        select *from user
    </sql>

    <select id="findAll" resultType="USER" >
        <include refid="querySql"></include>
    </select>

    <!--根據id查詢用戶-->
    <select id="findById" resultType="User" parameterType="int">
        <include refid="querySql"></include> where id= #{userID};
    </select>
發佈了71 篇原創文章 · 獲贊 6 · 訪問量 5392
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章