java后台管理系统项目学习day09--mybatis<if -set,choose when otherwris>

1、if-set动态标签

1、动态实现数据更新操作,条件id=8,将八戒改为天蓬元帅,性别 未知

2、未被修改的八戒数据

在这里插入图片描述

1-1、测试类添加代码

在这里插入图片描述
代码如下:

 //动态实现数据更新操作,条件id=8,将八戒改为天蓬元帅,年龄:18 ,性别 未知
    @Test
    public void upade1(){
        Demo_User_Mapper d = session.getMapper(Demo_User_Mapper.class);
        Demo_User d1 = new Demo_User(8,"天蓬元帅",18,"未知");
        int rows  = d.updateU(d1);
        if(rows > 0){
            System.out.println("受影响行数"+rows);
        }
    }

1-2、接口添加代码

在这里插入图片描述

代码如下:

	int updateU(Demo_User d1);

1-3、常规写法——映射文件添加代码

在这里插入图片描述

代码如下:

<!-- 动态实现数据更新操作,条件id=8,将八戒改为天蓬元帅,年龄:18 ,性别 未知

     -->
    <update id="updateU">
        update demo_user
            set
                name = #{name},
                age = #{age},
                sex = #{sex}
            where
                id = #{id}
    </update>

1-4、测试结果

在这里插入图片描述
当用户把所有的数据都传递过来的时候,这种语法是没问题的,那如果用户他只传递了 id和age ,其他的忘了,会出现什么问题呢?

1-4-1、接口代码保持不变

1-4-2、修改测试代码,保留id和age

在这里插入图片描述

代码如下:

//动态实现数据更新操作,条件id=8,将八戒改为天蓬元帅,年龄:18 ,性别 未知
    @Test
    public void upade1(){
        Demo_User_Mapper d = session.getMapper(Demo_User_Mapper.class);
        Demo_User d1 = new Demo_User();
        d1.setId(8).setAge(520);
        int rows  = d.updateU(d1);
        if(rows > 0){
            System.out.println("受影响行数"+rows);
        }
    }

1-4-3、运行单元测试,结果如下

在这里插入图片描述

把null作为值写进了数据库。

1-4-4、映射文件中加if标签

以不为null的属性参数作为set条件

在这里插入图片描述

1-4-3-1、加入set标签删除多余的" , "号

在这里插入图片描述

代码如下:

  <!-- 动态实现数据更新操作,条件id=8,将八戒改为天蓬元帅,年龄:18 ,性别 未知

     -->
    <update id="updateU">
        update demo_user
            <set>
                <if test="name != null">name = #{name} , </if>
                <if test="age != null">age = #{age} , </if>
                <if test="age != null">sex = #{sex} </if>
            </set>
            where
                id=#{id}
    </update>

1-4-4、接口代码保持不变

1-4-5、运行测试结果

在这里插入图片描述

一定要区分null和0的区别:

1、null是空且没有确定的值。
2、0为确定的值。

2、sql动态分支查询

以条件进行数据查询:如果存在sex,则按sex查询,如果sex不存在,则按age查询

多个条件:sex=“xxx”,age=xxx

**SQL:
1、select * from demeo_user where sex=“xxx” and age = xxx **
**2、select * from demeo_user where sex=“xxx” or age = xxx **

这种语法能满足上述的条件查询吗?

答案:不能,这两条sql单独使用是都不能满足,两者合在一起就能满足,如果sql提供if–else结构多好,可是SQL可没有提供这种语法。

2-1、动态choose when otherwrise

2-1-1、测试类添加代码

以“马云”为例:

在这里插入图片描述

在这里插入图片描述

代码如下:

//以条件进行数据查询:如果存在sex,则按sex查询,如果sex不存在,则按age查询
    @Test
    public void select1(){
        Demo_User_Mapper d = session.getMapper(Demo_User_Mapper.class);
        Demo_User d1 = new Demo_User();
        d1.setSex("男").setAge(46);
        List<Demo_User> list = d.choose(d1);
        System.out.println(list);

    }

2-1-2、接口添加代码

在这里插入图片描述

代码如下:

List<Demo_User> choose(Demo_User d1);

2-1-3、映射文件添加代码

在这里插入图片描述

代码如下:

<!-- 以条件进行数据查询:如果存在sex,则按sex查询,如果sex不存在,则按age查询

        choose:     是分支结构的标识标签,有且只有一个条件体有效
        when:      判定条件体和<if>标签差不多
        otherwise:<when>的条件都不满足时,就会生效

        choose、when、otherwise 和 java里的 if——if else——if else....else 用法是一样的

     -->
    <select id="choose" resultType="Demo_User">
        select * from demo_user
            where
                <choose>
                    <when test="sex != null"> sex = #{sex} </when>
                     
                    <otherwise>age = #{age}</otherwise>
                </choose>
    </select>

2-1-4、测试结果

2-1-4-1、sex满足条件就按sex查询

在这里插入图片描述

2-1-4-1、sex不满足条件就按age查询
2-1-4-1-1、接口和映射文件代码保持不变
2-1-4-1-2、修改测试类代码

在这里插入图片描述

代码如下:

 //以条件进行数据查询:如果存在sex,则按sex查询,如果sex不存在,则按age查询
    @Test
    public void select1(){
        Demo_User_Mapper d = session.getMapper(Demo_User_Mapper.class);
        Demo_User d1 = new Demo_User();
        d1.setAge(46);
        List<Demo_User> list = d.choose(d1);
        System.out.println(list);

    }
2-1-4-1-3、运行单元测试结果

在这里插入图片描述

2-2、小结

choose when otherwise和java中的if–if else–if else–…–else的用法是一样的,哪一个满足条件就会去运行哪一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值