1. 程式人生 > 其它 >MyBatis筆記(二)

MyBatis筆記(二)

動態SQL語句

1.<if>標籤

<if>標籤用來有條件地執行標籤內的SQL語句,例如當username不為空時將使用者名稱作為匹配條件。
UserDao.java

/**
 * 根據QueryVo中的條件查詢使用者
 * @param vo
 * @return
 */
List<User> findByVo(QueryVo vo);

UserDao.xml

<select id="findByUser" resultType="User" parameterType="User">
    select * from user where 1=1
    <if test="username != null and username != '' ">
        and username like #{username}
    </if>
    <if test="address != null">
        and address like #{address}
    </if>
</select>

MyBatisTests.java

@Test
public void testFindByUser() {
    User user = new User();
    user.setUsername("%g%");
    user.setAddress("%黃%");
    List<User> users = userDao.findByUser(user);
    for (User u : users) {
        System.out.println(u);
    }
}

2.<where>標籤

為了簡化上面 where 1=1 的條件拼裝,我們可以採用<where>

標籤來簡化開發。
UserDao.xml

<select id="findByUser" resultType="User" parameterType="User">
    select * from user
    <where>
        <if test="username != null and username != '' ">
            and username like #{username}
        </if>
        <if test="address != null">
            and address like #{address}
        </if>
    </where>
</select>

3.<foreach>標籤

當需要用多個id查詢使用者時,SQL是這樣的:select * from user where id in (1, 2, 3);
這樣我們在進行範圍查詢時,就要將一個集合中的值,作為引數動態新增進來。
QueryVo.java中加入一個List集合用於封裝引數

private List<Integer> ids;

UserDao.java

/**
 * 根據id集合查詢使用者列表
 * @param vo
 * @return
 */
List<User> findInIds(QueryVo vo);

UserDao.xml

<select id="findInIds" resultType="User" parameterType="QueryVo">
    select * from user
    <where>
        <if test="ids != null and ids.size() > 0">
            <foreach collection="ids" open="id in ( " close=")" item="id" separator=",">
                #{id}
            </foreach>
        </if>
    </where>
</select>

MyBatisTests.java

@Test
public void testFindInIds() {
    QueryVo vo = new QueryVo();
    List<Integer> ids = new ArrayList<>();
    ids.add(1);
    ids.add(2);
    ids.add(3);
    vo.setIds(ids);
    List<User> users = userDao.findInIds(vo);
    for (User user : users) {
        System.out.println(user);
    }
}

<foreach>標籤用於遍歷集合,它的屬性:

  • collection: 代表要遍歷的集合元素,注意編寫時不要寫#{}
  • open: 代表SQL的開始部分
  • close: 代表SQL的結束部分
  • item: 代表遍歷集合的每個元素,生成的變數名
  • sperator: 代表分隔符

4.<sql>標籤和<include>標籤

Mapper中可將重複的SQL提取出來,使用<include>引用即可,最終達到SQL重複使用的目的。
UserDao.xml

<sql id="defaultSql">
    select * from user
</sql>

<select id="findById" resultType="User" parameterType="int">
    <include refid="defaultSql"></include>
    <where>
        <if test="username != null and username != '' ">
            and username like #{username}
        </if>
        <if test="address != null">
            and address like #{address}
        </if>
    </where>
</select>