Mybatis操作数据库(二)

动态SQL
在 MyBatis 中,动态 SQL 是一种强大的特性,它允许根据不同的条件和场景在 SQL 语句中动态地组合和构建部分语句

< if>标签
我们在注册用户的时候,可能会有一个问题注册有两个字段
必填字段和非必填字段,这时我们需要使用动态标签来判定
例如:
添加性别为gender为非必填字段
定义接口

Integer insertUserByCondition(UserInfo userInfo);

实现xml

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

测试
当我们输入gender时 数据能正常插入

@Test
    void testInsertUserByCondition() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhangfei");
        userInfo.setPassword("123456");
        userInfo.setAge(12);
        userInfo.setGender(1);
        userInfo.setPhone("12345678911");
        Integer re = userInfoXMLMapper.insertUserByCondition(userInfo);
        if (re>0){
            log.info("插入成功!");
        }
    }

在这里插入图片描述
在这里插入图片描述
当我们不输入gender时会有

@Test
    void testInsertUserByCondition() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhangfei");
        userInfo.setPassword("123456");
        userInfo.setAge(12);
        //userInfo.setGender(1);
        userInfo.setPhone("12345678911");
        Integer re = userInfoXMLMapper.insertUserByCondition(userInfo);
        if (re>0){
            log.info("插入成功!");
        }
    }

我们可以看到sql语句变成了

 insert into userinfo(username,password,age, phone) values (?,?,?, ?)

在这里插入图片描述
注意:
在这里插入图片描述
< trim>标签
之前的插⼊⽤⼾功能,只是有⼀个 gender 字段可能是选填项,如果有多个字段,⼀般考虑使⽤标签结合标签,对多个字段都采取动态⽣成的⽅式。
这个标签可以帮助我们去除多余的字符
在这里插入图片描述
prefix:表⽰整个语句块,以prefix的值作为前缀
suffix:表⽰整个语句块,以suffix的值作为后缀
prefixOverrides:表⽰整个语句块要去除掉的前缀
suffixOverrides:表⽰整个语句块要去除掉的后缀
调整上面的xml:

 <insert id="insertUserByCondition">
    insert into userinfo
    <trim 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 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>

sql动态解析时 会第一个处理
基于 prefix 配置,开始部分加上 (
基于 suffix 配置, 结束部分加上 )
多个组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于suffixOverrides 配置去掉最后⼀个 ,

注意:

注意 < if test=“username !=null”> 中的 username 是传⼊对象的属性

< where>标签
传⼊的⽤⼾对象,根据属性做where条件查询,⽤⼾对象中属性不为 null 的,都为查询条件. 如username 为 “a”,则查询条件为 where username=“a”
原有sql

select * from userinfo where age = 18 and gender =1 and delete_flag = 0;

定义接口:

 List<UserInfo> queryByCondition();

xml实现:


在这里插入图片描述

<select id="queryByCondition" resultType="com.example.mybatisdemo.demos.web.model.UserInfo">
        select id, username, age, gender, phone, delete_flag, create_time,
        update_time from userinfo
        <where>
            <trim prefixOverrides="and">
                <if test="age != null">
                    and age = #{age}
                </if>
                <if test="gender != null">
                    and gender = #{gender}
                </if>
                <if test="deleteFlag != null">
                    and delete_flag = #{deleteFlag}
                </if>
            </trim>

        </where>

    </select>

结果:
在这里插入图片描述

< where> 只会在⼦元素有内容的情况下才插⼊where⼦句,⽽且会⾃动去除⼦句的开头的AND或OR 以上标签也可以使⽤ < trim
prefix=“where” prefixOverrides=“and”> 替换, 但是此种 情况下, 当⼦元素都没有内容时,
where关键字也会保留

< set>标签
需求: 根据传⼊的⽤⼾对象属性来更新⽤⼾数据,可以使⽤标签来指定动态内容
定义接口:传入的用户id属性 修改其他不为null属性

Integer updateUserByCondition(Integer id);

xml实现

 <update id="updateUserByCondition">
        update userinfo
        <set>
            <if test="age != null">
                and age = #{age}
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="deleteFlag != null">
                and delete_flag = #{deleteFlag}
            </if>
        </set>
        where id = #{id}
    </update>

< set> :动态的在SQL语句中插⼊set关键字,并会删掉额外的逗号. (⽤于update语句中) 以上标签也可以使⽤ < trim
prefix=“set” suffixOverrides=“,”> 替换。

结果:
在这里插入图片描述

< foreach>标签
对集合进⾏遍历时可以使⽤该标签。标签有如下属性:

属性说明
collection绑定⽅法参数中的集合,如 List,Set,Map或数组对象
item遍历时的每⼀个对象
open语句块开头的字符串
close语句块结束的字符串
separator每次遍历之间间隔的字符串

需求根据多个userid删除用户数据
表的信息
在这里插入图片描述
接口方法

void deleteByIds(List<Integer> ids);

xml实现

 <delete id="deleteByIds">
        delete from userinfo
        where id in 
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>
 @Test
    void deleteByIds() {

        userInfoXMLMapper.deleteByIds(Arrays.asList(12,11,10));
    }

结果
在这里插入图片描述
遇到的错误:
如果我们不加@Param(“ids”)
在这里插入图片描述
会报出类似:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/743974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库管理与数据库语句

数据库用户管理及高级sql语句 数据库管理 数据库用户管理 mysql权限表 在mysql中mysql库中的user表是最重要的权限表&#xff0c;记录允许连接到服务器的账号信息以及全局权限&#xff0c; 在mysql库中db和host表也是重要的权限表 db表中存储了用户对某个数据库的操作权限&…

CS-流量通讯特征修改-端口store证书流量通讯规则

免责声明:本文仅做技术交流与学习... 目录 1.修改默认端口&#xff1a; 2.去除store证书特征&#xff1a; 查看证书指纹&#xff1a; 生成证书指纹&#xff1a; 应用证书指纹&#xff1a; 3.去除流量通讯特征&#xff1a; 规则资源 http流量特征修改: https流量特征修改:…

Web APIs-DOM-事件相关整理(完成网页交互)

目录 1.事件监听 2.事件监听绑定 3.事件类型 4.实例注意 5.事件对象 6.环境对象 7.回调函数 1.事件监听 &#xff08;绑定事件/注册事件&#xff09;: 程序检测有没有事件产生&#xff08;事件&#xff1a;比如单机一个按钮&#xff08;编程时系统发生的动作或者事情&a…

C++ 14新特性个人总结

variable templates 变量模板。这个特性允许模板被用于定义变量&#xff0c;就像之前模板可以用于定义函数或类型一样。变量模板为模板编程带来了新的灵活性&#xff0c;特别是在定义泛化的常量和元编程时非常有用。 变量模板的基本语法 变量模板的声明遵循以下基本语法&am…

云计算基础知识

前言&#xff1a; 随着ICT技术的高速发展&#xff0c;企业架构对计算、存储、网络资源的需求更高&#xff0c;急需一种新的架构来承载业务&#xff0c;以获得持续&#xff0c;高速&#xff0c;高效的发展&#xff0c;云计算应运而生。 云计算背景 信息大爆炸时代&#xff1a…

HttpServletRequest・getContentLeng・getContentType区别

getContentLength()&#xff1a; 获取客户端发送到服务器的HTTP请求主体内容的字节数&#xff08;长度&#xff09; 如果请求没有正文内容&#xff08;如GET&#xff09;&#xff0c;或者请求头中没有包含Content-Length字段&#xff0c;则该方法返回 -1 getContentType()&am…

【昇思初学入门】第七天打卡-模型训练

训练模型 学习心得 构建数据集。这通常包括训练集、验证集&#xff08;可选&#xff09;和测试集。训练集用于训练模型&#xff0c;验证集用于调整超参数和监控过拟合&#xff0c;测试集用于评估模型的泛化能力。 &#xff08;mindspore提供数据集https://www.mindspore.cn/d…

绘制全球各大洲典型流域的时间序列图

流量世界第一、长度第二的亚马逊流域&#xff08;Amazon&#xff09;、南美洲第四大、整条河流位于巴西的圣弗朗西斯科流域&#xff08;Sao Francisco&#xff09;、世界第四长、北美洲最长的密西西比流域&#xff08;Mississippi&#xff09;、欧洲最长的伏尔加流域&#xff0…

GitLab 不小心提交了master/develop版本如何回退

1. 找寻最近的版本&#xff0c;使用git reset --hard 回退到具体的提交版本号 2. git push origin master --force 这个会遇到gitlab默认拦截&#xff0c;处理版本 版本仓库页面&#xff0c;选择Setting——Repository&#xff0c;找到Protected branches 3. 再回到master分支…

python爬虫-爬虫的基础知识储备

爬虫就是一个不断的去抓去网页的程序&#xff0c;根据我们的需要得到我们想要的结果&#xff01;但我们又要让服务器感觉是我们人在通过浏览器浏览不是程序所为&#xff01;归根到底就是我们通过程序访问网站得到html代码&#xff0c;然后分析html代码获取有效内容的过程。下面…

开源/标准版 首页 logo大小修改

这个是diy的&#xff1a; 文件地址&#xff1a;template/uni-app/pages/index/diy/components/headerSerch.vue 这个是页面设计的&#xff1a; 文件地址&#xff1a;template/uni-app/pages/index/visualization/components/headerSerch.vue 先删除这三个 然后改下图的地方

C++ 模板:全特化和偏特化

目录 全特化&#xff08;Full Specialization&#xff09; 偏特化&#xff08;Partial Specialization&#xff09; 特点和使用场景 注意事项 在C中&#xff0c;模板特化&#xff08;template specialization&#xff09;是一种强大的功能&#xff0c;允许对模板进行特定情…

云计算 | 期末梳理(下)

1.模运算 2. 拓展欧几里得算法 3.扩散和混淆、攻击的分类 香农的贡献:定义了理论安全性,提出扩散和混淆原则,奠定了密码学的理论基础。扩散:将每一位明文尽可能地散布到多个输出密文中去,以更隐蔽明文数字的统计特性。混淆:使密文的统计特性与明文密钥之间的关系尽量复杂…

Javaweb配置tomcat

Tomcat 9版本链接 链接&#xff1a;https://pan.baidu.com/s/1u-eDur5KlqlXM_IM50Ahtg?pwd1njm 提取码&#xff1a;1njm 1、打开idea&#xff0c;创建maven项目 2023版IDEA 2、 目录结构 ps: 如果结果不完整,选中main右键 新建对应的文件夹 3、 web项目设置Tomcat(部署项目…

A股周一走势历史罕见,你知道是为什么吗?

今天的A股&#xff0c;让人历史罕见&#xff0c;你知道是为什么吗&#xff1f;盘面出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天大盘低开低走&#xff0c;跌懵了&#xff0c;两市板块全部在等待翻红&#xff0c;这让人历史罕见。 2、盘面出现2个重要信号&#x…

【大数据】大数据时代的黎明

目录 前言 深入解读大数据的本质 大数据的起源与演进轨迹 大数据对社会经济的深远影响 经济领域的革新 社会治理与公共服务的智能化 创新体系的重构 面临的挑战与应对 前言 步入21世纪以来&#xff0c;人类文明正站在一个历史性的转折点上&#xff0c;迎来了大数据时代的…

VUE div的右上角的角标/标签

一、效果图 二、代码 <div class"comp-overview"><div class"overview-item" v-for"(item,index) in overviewInfoList" :key"index"><div class"angle_mark"><span>{{item.label}}</span>&…

Linux 磁盘空间清理

1.检查磁盘使用情况 #显示每个挂载点的磁盘使用量&#xff0c;以及可用空间和使用率 df -h #显示当前目录的全部文件和目录&#xff08;包括隐藏的&#xff09;,以MB显示 ll -h 2. du查看最大的目录或文件 #逐级检查某个目录下各个子目录的大小。从根目录开始&#xff0c;逐级…

谷歌云(GCP)4门1453元最热门证书限时免费考

谷歌云(GCP)最新活动&#xff0c;完成免费官方课程&#xff0c;送4门最热门考试免费考试券1张(每张价值200刀/1453元)&#xff0c;这4门也包括最近大热的AI/ML考试&#xff0c;非常值得学习和参加&#xff0c;活动7/17截止 谷歌云是全球最火的三大云计算厂商(前两名AWS, Azure…

【shell脚本速成】nginx安装脚本

文章目录 案例需求应用场景案例思路案例代码 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻&#xff0c;都沐浴在轻松…