当前位置: 首页 > article >正文

MyBatis操作--进阶

 博主主页: 码农派大星.

    数据结构专栏:Java数据结构

 数据库专栏:MySQL数据库

JavaEE专栏:JavaEE

软件测试专栏:软件测试

关注博主带你了解更多知识

1. 动态SQL

动态SQL是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的sql拼接

1.1 <if>标签

比如说注册分为两种字段:必填字段和⾮必填字段,⾮必填字段该如何实现呢,这就需要使⽤动态标签了

接⼝定义:

Integer insertByCondition(UserInfo userInfo);

Mapper.xml实现:

   <insert id="insertByCondition">
        insert into user_info (username, password,
        <if test="age!=null">
        age,
        </if>
        gender,
        phone
        )
        values (#{username}, #{password},
        <if test="age!=null">
        #{age},
        </if>
        #{gender},
        #{phone}
        )

    </insert>

 

测试:

@Test
    void insertByCondition() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhangwu222");
        userInfo.setPassword("zhangwu222");
        userInfo.setGender(0);
       // userInfo.setAge(16);
       //注释掉age,看它怎么测出结果
        userInfo.setPhone("123456789");
        userInfoXmlMapper.insertByCondition(userInfo);
    }

<if>标签判断age是否为null,如果为null,就会拼接后面的phone属性 

 注解⽅式(不推荐) 

使用<script></script>方式

 @Insert("<script> insert into user_info (username, password,\n" +
            "        <if test='age!=null'>age,</if>\n" +
            "        gender," +
            "        phone" +
            "        )" +
            "        values (#{username}, #{password}," +
            "        <if test='age!=null'>#{age},</if>" +
            "        #{gender}," +
            "        #{phone}" +
            "        )</script>")
    Integer insertByCondition(UserInfo userInfo);

测试: 


    @Test
    void insertByCondition() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhangwu222");
        userInfo.setPassword("zhangwu222");
        userInfo.setGender(0);
        // userInfo.setAge(16);
        userInfo.setPhone("123456789");
        userInfoMapper.insertByCondition(userInfo);
    }

1.2 <trim>标签

prefix:表⽰整个语句块,以prefix的值作为前缀

suffix:表⽰整个语句块,以suffix的值作为后缀

prefixOverrides:表⽰整个语句块要去除掉的前缀

suffixOverrides:表⽰整个语句块要去除掉的后缀

  <insert id="insertByCondition">
        insert into user_info
        <trim prefixOverrides="," prefix="(" suffix=")" suffixOverrides=",">
            <if test="username!=null">
                username,
            </if>
            <if test="password!=null">
                password,
            </if>
            <if test="age!=null">
                age,
            </if>
            <if test="gender!=null">
                gender,
            </if>
            <if test="phone!=null">
                phone
            </if>
        </trim>
        values
        <trim prefixOverrides="," prefix="(" suffix=")" suffixOverrides=",">
            <if test="username!=null">
                #{username},
            </if>
            <if test="password!=null">
                #{password},
            </if>
            <if test="age!=null">
                #{age},
            </if>
            <if test="gender!=null">
                #{gender},
            </if>
            <if test="phone!=null">
                #{phone}
            </if>
        </trim>

    </insert>

测试

@Test
    void insertByCondition() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhangwu222");
        userInfo.setPassword("zhangwu222");
        userInfo.setGender(0);
       // userInfo.setAge(16);
       // userInfo.setPhone("123456789");
        userInfoXmlMapper.insertByCondition(userInfo);
    }

1.3 <where>标签  

 List<UserInfo> selectByCondition(UserInfo userInfo);
 <select id="selectByCondition" resultType="com.mybatis.model.UserInfo">
        select * from user_info
       <where>
           <if test="username!=null">
               username = #{username}
           </if>
           <if test="age!=null">
               and age = #{age}
           </if>
           <if test="gender!=null">
               and gender = #{gender}
           </if>
       </where>


    </select>
 @Test
    void insertByCondition() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhangwu222");
        userInfo.setPassword("zhangwu222");
        userInfo.setGender(0);
       // userInfo.setAge(16);
       // userInfo.setPhone("123456789");
        userInfoXmlMapper.insertByCondition(userInfo);
    }

<where>只会在⼦元素有内容的情况下才插⼊where⼦句,⽽且会⾃动去除⼦句的开头的AND或 OR

1.4 <set>标签

根据传⼊的⽤⼾对象属性来更新⽤⼾数据,可以使⽤标签来指定动态内容

 <update id="updateByCondition2">
        update user_info
        <set>
            <if test="username!=null">
                username=#{username},
            </if>
            <if test="password!=null">
                password=#{password},
            </if>
            <if test="age!=null">
                age=#{age}
            </if>
        </set>
        <where>
            <if test="id!=null">
                id=#{id}
            </if>
        </where>
    </update>

测试 

 @Test
    void updateByCondition() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("cxk");
        userInfo.setPassword("cxk");
        userInfo.setId(3);
        userInfo.setAge(12);
        userInfoXmlMapper.updateByCondition2(userInfo);
    }

 1.5 <foreach>标签

对集合进⾏遍历时可以使⽤该标签

collection:绑定⽅法参数中的集合,如List,Set,Map或数组对象

item:遍历时的每⼀个对象

open:语句块开头的字符串

close:语句块结束的字符串

separator:每次遍历之间间隔的字符串

需求:根据多个userid,删除⽤⼾数据

 Integer batchDelete(List<Integer> ids);

    <delete id="batchDelete">
        delete from user_info where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

 测试:

 @Test
    void batchDelete() {
        userInfoXmlMapper.batchDelete(List.of(6,7,8));

    }

 

1.6<include> 标签

在xml映射⽂件中配置的SQL,有时可能会存在很多重复的⽚段,此时就会存在很多冗余的代码

对重复的代码⽚段抽取,将其通过<sql>标签封装到⼀个SQL⽚段,然后再通过 <include>标签进⾏引⽤

 <sql id="selectAll">
        select * from user_info;
 </sql>
  <select id="queryUserInfos" resultType="com.mybatis.model.UserInfo">
       <include refid="selectAll"></include>
    </select>


http://www.kler.cn/a/389942.html

相关文章:

  • 【STM32】基于SPI协议读写SD,详解!
  • kafka消费数据太慢了,给优化下
  • 分享一个傻瓜式一键启动的加速器
  • C#程序开发,检测当前电脑已经安装的软件目录
  • Python标准库模块的使用:math、datetime
  • mysql5.7安装SSL报错解决(2),总结
  • JAVA完成猜数字小游戏
  • JavaScript Cookie 与 服务器生成的 Cookie 的区别与应用
  • vue的原理
  • Docker 的常用命令有哪些?
  • Python实现SPFA算法
  • 浏览器交互事件汇总
  • 97_api_intro_imagerecognition_pdf2word
  • GEE ui界面实现:用户自画多边形, 按面积比例在多边形中自动生成样点,导出多边形和样点shp,以及删除上一组多边形和样点(有视频效果展示)
  • 数据库设计——E-R 图,学习笔记
  • 探索Copier:Python项目模板的革命者
  • 【软考系统架构设计师论文】论面向服务的架构设计
  • 11.9.2024刷华为
  • 基于SSM(Spring + Spring MVC + MyBatis)框架的汽车租赁共享平台系统
  • 渗透测试---python基础:基础语法的使用
  • 嵌入式系统的利器C++
  • 一、HTML
  • 网络初阶——应用层:HTTPS 协议
  • 【初阶数据结构与算法】线性表之链表的分类以及双链表的定义与实现
  • 【C#设计模式(3)——抽象工厂模式(Abstract Factory Pattern)】
  • 弱口令整改方案:借助双因子认证加强账号密码安全