1. 程式人生 > >Mybatis動態SQL語句使用

Mybatis動態SQL語句使用

第一個 from 在外 字符串 each nbsp mea pack ger

在實際開發中,有時候查詢條件可能是不確定的,查詢條件可能有多條也可能沒有,這時候就需要用到動態的sql語句拼接功能。

一、ifwheresql標簽的使用

需求:在一些高級查詢中,查詢條件存在的個數不確定。如,SELECT * FROM user WHERE username LIKE ‘%明%‘ AND sex = ‘1‘;

為了能夠動態拼接sql語句可以采用以下方式:

UserMapper.xml

<select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User"
>\
   SELECT * FROM user <!-- where標簽作用: 會自動向sql語句中添加where關鍵字 會去掉第一個條件的and語句 --> <where> <if test="username != null and username != ‘‘">    AND username LIKE ‘%${username}%‘   </if> <
if test="sex != null and sex != ‘‘">   AND sex=#{sex} </if> </where> </select>

where標簽下的查詢條件放在findUserByUserNameAndSex中,只能在該範圍內使用。為了實現代碼的重用性,通常將查詢條件放在外面,由不同的查詢共同調用。

  <sql id="user_where">
       <where>
           <if test="username != null and username != ‘‘"
>   AND username LIKE ‘%${username}%‘   </if> <if test="sex != null and sex != ‘‘"> AND sex=#{sex} </if> </where> </sql>
<select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User"> SELECT * FROM user <!-- 調用sql條件 --> <include refid="user_where"></include> </select>    

UserMapper.java中編寫接口

List<User> findUserByUserNameAndSex(User user);

測試

    @Test
    public void testFindUserByUserNameAndSex() throws Exception {
        SqlSession session = sqlSessionFactory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        User user = new User();
        user.setUsername("明");
        user.setSex("1");
        List<User> userList = userMapper.findUserByUserNameAndSex(user);
        System.out.println(userList);
    }

 

二、foreach標簽的使用

需求:SQL語句中,SELECT * FROM user WHERE id IN (1,15,22,28);為了從service層接收多個id值,然後使用foreach標簽動態拼接多個id值組成完整的SQL語句。

UserMapper.xml

    <select id="findUserByIds" parameterType="cn.itheima.pojo.QueryVO" resultType="cn.itheima.pojo.User">
        SELECT * FROM user
        <where>
            <if test="ids != null">
                <!--
                foreach:循環傳入的集合參數
                collection:傳入的集合的變量名稱
                item:每次循環將循環出的數據放入這個變量
                open:循環開始拼接的字符串
                close:循環結束拼接的字符串
                separator:循環中拼接的分隔符
                 -->
                <foreach collection="ids" item="id" open=" id IN (" close=")" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>

QueryVO.java

package cn.itheima.pojo;

import java.util.List;

public class QueryVO {
    private List<Integer> ids;
    public List<Integer> getIds() {
        return ids;
    }
    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }
}

多個id值可以通過QueryVO類傳遞給DAO層。

UserMapper.java接口中編寫接口

List<User> findUserByIds(QueryVO vo);

測試

    @Test
    public void testFindUserByIds() throws Exception {
        SqlSession session = sqlSessionFactory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        QueryVO vo = new QueryVO();
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(15);
        ids.add(22);
        ids.add(28);
        vo.setIds(ids);
        List<User> userList = userMapper.findUserByIds(vo);
        System.out.println(userList);
    }

Mybatis動態SQL語句使用