Mybatis入门笔记(6)——动态SQL

(会用)

if标签

<if>标签的 test 属性中写的是对象的属性名,

映射配置文件

<!-- 根据用户名和性别查询 -->
<select id="findUserByUserNameAndSex" parameterType="com.ben.domain.User" resultType="com.ben.domain.User">
    select * from user where 1=1
    <if test="username != null and username != ''">
        and username like '%${username}%'
    </if>
    <if test="sex != null and sex != ''">
        and sex = #{sex}
    </if>
</select>

持久层接口

//根据用户名和性别查询
List<User> findUserByUserNameAndSex(User user);

测试文件

//根据用户名和性别查询
@Test
public void testFindUserByUserNameAndSex(){
    User user = new User();
    user.setUsername("王");
    List<User> users = userdao.findUserByUserNameAndSex(user);
    for(User u : users) {
        System.out.println(u);
    }
}

where标签

为了简化上面 where 1=1 的条件拼装,我们可以采用<where>标签来简化开发。

作用

  1. 自动向sql语句中添加where关键字
  2. 去掉第一个条件的and关键字

映射配置文件

<select id="findUserByUserNameAndSex" parameterType="com.ben.domain.User" resultType="com.ben.domain.User">
        select * from user
        <where>
            <if test="username != null and username != ''">
                and username like '%${username}%'
            </if>
            <if test="sex != null and sex != ''">
                and sex = #{sex}
            </if>
        </where>

    </select>

SQL语句等价于:select * from user WHERE username like '%王%'

Sql片段

Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。

<!--抽取重复的语句代码片段-->
<sql id="defaultsql">
    select * from user
</sql>
<!--    查询所有-->
<select id="findAll" resultType="com.ben.domain.User">
<include refid="defaultsql"></include>
</select>

<!-- 通过Id查询一个用户   -->
<select id="findUserById" parameterType="Integer" resultType="com.ben.domain.User">
    <include refid="defaultsql"></include>
    where id = #{v}
</select>

foreach标签

<foreach>标签用于遍历集合.

属性:

collection:代表要遍历的集合元素,注意不要写#{}

open:语句的开始部分

close:结束部分

item:遍历集合的每个元素,生成的变量名

sperator:分隔符

举例:

select * from user where id in(1,45,46,47,48)

其对应的xml写法:


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

测试类写法:

@Test
public void testFindByIds(){
    QueryVo vo = new QueryVo();
    List<Integer> ids = new ArrayList<Integer>();
    ids.add(1);
    ids.add(45);
    ids.add(46);
    ids.add(47);
    ids.add(48);
    vo.setIds(ids);
    //6.执行操作
    List<User> users = userdao.findByIds(vo);
    for(User user : users) {
        System.out.println(user);
    }
}

QueryVo写法

package com.ben.domain;
import java.io.Serializable;
import java.util.List;

/**
 * @ClassName: QueryVo
 * @author: benjamin
 * @version: 1.0
 * @description: 查询条件对象
 * @createTime: 2019/07/15/17:35
 */

public class QueryVo implements Serializable {

    private User user;
    private List<Integer> ids;

    public List<Integer> getIds() {
        return ids;
    }

    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}
posted @ 2019-07-17 22:57  伊万夫斯基  阅读(345)  评论(0编辑  收藏  举报