SSM框架——Mybatis(5)动态SQL

动态SQL——<if>标签

  • 根据实体类的不同取值,使用不同的SQL语句进行查询,比如在id不为空时进行id查询等操作。
    • 首先在持久层DAO接口进行定义
    /**
     * 根据用户信息,查询用户列表
     * @param user
     * @return
     */
    List<User> findByUser(User user);
    • 其次在持久层DAO映射进行配置工作
<!-- 查询对象的属性值不定,可能只有用户名,或者性别或其他-->
    <select id="findByUser" parameterType="com.mybatis.User" resultType="com.mybatis.User">
        select * from user where 1=1
        <if test="username != null">
            and username=#{username}
        </if>
    </select>
    • 测试用例
    @Test
    public void testfindByUser(){
        User u=new User();
        u.setUsername("L");

        List<User> users = userDao.findByUser(u);
        for(User user : users) {
            System.out.println(user);
        }
    }
  • 对于在持久层DAO的映射配置中使用where 1=1或where 1=0的原因,主要是因为,在实际的应用过程当中会出现很多情况,比如已经在上面写了where语句,但是之后的条件没有一个满足,导致语句出现了单个的where,造成不必要的SQL语句错误,因此会使用where 1=1或1=0这种恒true或false的错误,这就是一种在不确定因素的查询状态下,能够保证构造一条正确的SQL语句的方式。

动态SQL——<where>标签

  • 之前在if标签中已经介绍了相关的为什么要使用where 1=1这种语句。今天where标签就是为了解决这个问题而存在的。
<!-- 查询对象的属性值不定,可能只有用户名,或者性别或其他-->
    <select id="findByUser" parameterType="com.mybatis.User" resultType="com.mybatis.User">
        select * from user
        <where>
            <if test="username != null">
                and username=#{username}
            </if>
        </where>
    </select>

动态SQL——<foreach>标签

  • 在进行范围查询的时候,就可以将一个集合中的值作为参数动态添加进来。并进行参数的传递。
    • 首先在QueryVo实体类中进行定义List<Interger>对象
public class QueryVo {
    private User user;

    private List<Integer> IDS;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public List<Integer> getIDS() {
        return IDS;
    }

    public void setIDS(List<Integer> IDS) {
        this.IDS = IDS;
    }
}
    • 其次在持久层DAO中进行设置等工作
List<User> findByIDS(QueryVo vo);
    • 然后在相应的xml配置文件当中进行配置等工作
    <!-- 按照一定的数据进行查询 使用foreach语句进行查询 -->
    <select id="findByIDS" parameterType="com.mybatis.QueryVo" resultType="com.mybatis.User">
        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>
    • 测试代码
    @Test
    public void testfindByIDS(){
        QueryVo vo=new QueryVo();
        List<Integer> IDS=new ArrayList<Integer>();
        IDS.add(50);
        IDS.add(51);
        IDS.add(52);
        IDS.add(50);
        IDS.add(44);
        vo.setIDS(IDS);

        List<User> users = userDao.findByIDS(vo);
        for(User user : users) {
            System.out.println(user);
        }
    }
  • 通过测试发现以下几个点
    • 不管List中的数据是否顺序,最后查询出来的结果都是按从小到大的顺序显示
    • 当重复出现数字,例如重复出现50时,最后的结果只会出现一次。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值