mybatis的动态SQL

MyBatis的动态SQL MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接成完整的SQL之后再执行,以达到SQL复用、简化编程的效果。Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。 阅读详情

 mybatis的动态SQL
                1. MyBatis 的动态 SQL 元素与 JSTL 或 XML 文本处理器相似,常用

                         1.    <if>、
                         2. <choose>、<when>、<otherwise>、(if-else)
                         3. <trim>、<where>、<set>、
                         4. <foreach> 
            重点掌握标签:<if>/<where>/<foreach>/<trim>

            1.if标签:
                作用:可以根据自己传递的条件进行多条件查询
                属性:
                    test:判断的条件,一般判断该值是否不为空
                案例:

  <select id="findStu" resultMap="studentMap" parameterType="student">
                        SELECT * FROM student WHERE 1=1
                        <if test="sex != null">
                            and sex = #{sex}
                        </if>
                        <if test="name != null">
                            and name=#{name}
                        </if>
                        /*模糊查询方式一*/
                        <if test="stunum != null">
                            and stunum like #{stunum}
                        </if>
                        /*模糊查询方式二*/
                        <if test="stunum != null">
                            and stunum like concat("%",#{stunum},"%")
                        </if>
                        /*模糊查询方式三*/
                        <if test="stunum != null">
                            and stunum like "%"#{stunum}"%"
                        </if>
                    </select>

  2.where标签:
                作用:替换where条件的恒等式 1=1
                用法:    
                    将if标签写在where标签中即可
                案例: 

 <select id="findStu" resultMap="studentMap" parameterType="student">
                            SELECT * FROM student 
                            <where>
                                <if test="sex != null">
                                    and sex = #{sex}
                                </if>
                                <if test="name != null">
                                    and name=#{name}
                                </if>
                                <if test="stunum != null">
                                    and stunum like "%"#{stunum}"%"
                                </if>
                            </where>
                        </select>

                         #SQL注入的万能密码
                        ' or '1'='1

  3. foreach:
                    概念:
                        <foreach> 元素主要用在构建 in 条件中,它可以在 SQL 语句中迭代一个集合。

                        <foreach> 元素的属性主要有collection、item、index、open、separator、close。
                        collection:必填,值为所选迭代循环的属性名,值为mybatis内部定义的名字:list\array\key
                        item 表示集合中每一个元素进行迭代时的别名。
                        index 指定一个名字,用于表示在迭代过程中每次迭代到的位置。
                        open 表示该语句以什么开始。
                        separator 表示在每次进行迭代之间以什么符号作为分隔符。
                        close 表示以什么结束。

                        在使用 <foreach> 元素时,最关键、最容易出错的是 collection 属性,该属性是必选的,
                        但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:
                        如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。
                        如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。
                        如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,
                        collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。
                        
                    批量查询:

  mapper接口:
                        List<Product> findProductByListId(List<String> pid);
                        
                        mapper.xml配置文件:
                        <!-- 查询产品中编号为(2,9,25,100)商品信息 -->
                        <select id="findProductByListId" resultType="product">
                            SELECT * FROM product 
                            <where>
                                pid in 
                                <foreach collection="list" item="pid"
                                         open="(" separator="," close=")">
                                    #{pid}
                                </foreach>
                            </where> 
                        </select>

测试实现类:

     @Test
                        public void findProductByListIdTest() {
                            ProductMapper proMapper=session.getMapper(ProductMapper.class);
                            List<String> listPid=new ArrayList<String>();
                            listPid.add("2");
                            listPid.add("9");
                            listPid.add("25");
                            listPid.add("100");
                            List<Product> listPro=proMapper.findProductByListId(listPid);
                            System.out.println(listPro);
                            
                        }

批量添加:
                        需求:向数据库中同时添加多条数据
                            mapper接口:
                                /*批量插入数据*/
                                int addProductForeach(List<Product> proList);
                            
                            mapper.xml配置文件

  <!-- 批量添加数据 -->
                                <insert id="addProductForeach" parameterType="List">
                                    insert into product VALUES 
                                    <foreach collection="list" item="pro" separator=",">
                                        (
                                            #{pro.pid},
                                            #{pro.pname},
                                            #{pro.marketPrice},
                                            #{pro.shopPrice},
                                            #{pro.pimage},
                                            #{pro.pdate},
                                            #{pro.isHot},
                                            #{pro.pdesc},
                                            #{pro.pflag},
                                            #{pro.cid}
                                        )
                                    </foreach>
                                </insert>
                            

测试实现类:

   @Test
                            public void addProductForeachTest() {
                                ProductMapper proMapper=session.getMapper(ProductMapper.class);
                                List<Product> proList=new ArrayList<Product>();
                                for (int i = 55; i < 60; i++) {
                                    Product product = new Product();
                                    product.setPid(String.valueOf(i));
                                    product.setPname("Sony/索尼 ILCE-A6000L");
                                    product.setMarketPrice(4999.00);
                                    product.setShopPrice(4599.00);
                                    product.setPimage("products/img/00013.jpg");
                                    product.setPdate(new Date());
                                    product.setIsHot(1);
                                    product.setPdesc("Sony/索尼 ILCE-A6000L(E16-50/55-210)微单反长焦旅游双镜头相机\r\n" + 
                                            "随拍双镜头套机 全焦段覆盖 赠送微单大礼包");
                                    product.setPflag(1);
                                    product.setCid("2");
                                    proList.add(product);
                                }
                                
                                int i = proMapper.addProductForeach(proList);
                                System.out.println(i);
                                session.commit();
                                session.close();
                            }

批量修改:

  /*
                         * 批量更新数据
                         */
                        int updateProductForeach(List<Product> proList);
                        
                        <!-- 批量更新数据 collection="list" item="pro" item可以看做是list集合的对象 -->
                        <update id="updateProductForeach" parameterType="List">
                            <foreach collection="list" item="pro" separator=";"> 
                                UPDATE product 
                                <set>
                                    pname = #{pro.pname},
                                    market_price = #{pro.marketPrice},
                                    shop_price = #{pro.shopPrice},
                                    pimage = #{pro.pimage},
                                    pdate = #{pro.pdate},
                                    is_hot = #{pro.isHot},
                                    pdesc = #{pro.pdesc},
                                    pflag = #{pro.pflag},
                                    cid = #{pro.cid}
                                </set>
                                <where>
                                    pid = #{pro.pid}
                                </where>
                            </foreach>
                        </update>
                        

                     测试类:
                        /*
                         * 批量更新
                         */

  @Test
                        public void updateProductForeachTest() {
                            ProductMapper proMapper=session.getMapper(ProductMapper.class);
                            List<Product> proList=new ArrayList<Product>();
                            for (int i = 55; i < 60; i++) {
                                Product product = new Product();
                                product.setPid(String.valueOf(i));
                                product.setPname("Sony/索尼 ILCE-A6000 Plus");
                                product.setMarketPrice(5999.00);
                                product.setShopPrice(5599.00);
                                product.setPimage("products/img/00013.jpg");
                                product.setPdate(new Date());
                                product.setIsHot(1);
                                product.setPdesc("Sony/索尼 ILCE-A6000L(E16-50/55-210)微单反长焦旅游双镜头相机\r\n" + 
                                        "随拍双镜头套机 全焦段覆盖 赠送微单大礼包");
                                product.setPflag(1);
                                product.setCid("2");
                                proList.add(product);
                            }
                            
                            int i = proMapper.updateProductForeach(proList);
                            System.out.println(i);
                            session.commit();
                            session.close();
                        }

批量删除:
                        需求:对选中的多条数据进行一次性删除
                            QQ空间的照片管理:选中多个复选框进行删除
                        数据库分析:

  #删除一条
                            DELETE FROM `user` WHERE id=126;
                            #删除多条
                            DELETE FROM `user` WHERE id=126;
                            DELETE FROM `user` WHERE id=127;
                            DELETE FROM `user` WHERE id=128;
                            
                            DELETE FROM `user` WHERE id in(126,127,128);

mybatis实现:

  <!-- 批量删除 -->
                            <delete id="deleteProductForeach">
                                DELETE FROM product 
                                <where> 
                                    pid in
                                    <foreach collection="list" item="pid" open="(" separator="," close=")">
                                        #{pid}
                                    </foreach>
                                </where>
                            </delete>

<!-- 批量删除2 -->
                            <delete id="deleteProductForeach2">
                                <foreach collection="list" item="pid" separator=";">
                                    DELETE FROM product 
                                    <where>
                                        pid=#{pid}
                                    </where>
                                </foreach>
                            </delete>

MyBatis 中动态 SQL 标签 在 MyBatis 中,动态 SQL 是构建灵活且高效的 SQL 语句的重要工具。通过使用动态 SQL 标签,开发者可以根据不同的条件动态生成 SQL 语句的各个部分,从而避免手动拼接字符串带来的复杂性和潜在的错误。 阅读详情

相关推荐

MyBatis 动态 SQL

MyBatis动态SQL是在XML映射文件中通过特定标签实现SQL语句动态拼接的技术,解决了传统JDBC手动拼接SQL的繁琐问题。文章介绍了MyBatis的9种动态SQL标签:if(条件判断)、where+if(查询条件处理)、set(更新操作)、choose/when/otherwise(多条件分支)、trim(格式化处理)等,并详细说明了各标签的语法和使用场景。动态SQL通过OGNL表达式实现参数值计算和SQL拼接,既提高了开发效率,又需注意性能优化和SQL注入防范。文中提供了多个典型示例,如条件查询、

阿超的博客 1132

【MyBatis】动态SQL

在前一篇中,我们已经讲解了Mybatis的基本使用,那么本篇我们就进一步来了解Mybatis的功能。本篇我们主要讲的是Mybatis中的动态SQL,在前面我们的学习中,我们编写的SQL语句基本都是固定的,每个参数都需要传递,而通过动态SQL,它能根据我们所给的参数,动态地选择参数,不需要每个都传递。

zhyhgx的博客 2203

高通camera调试经验总结

修改AF对焦模式 adb shell setprop vendor.debug.camera.af.manual 2 //使能手动对焦 adb shell setprop vendor.debug.camera.af.manual 0 //使能自动对焦

weixin_43381364的博客 1万+

Mybatis-动态SQL

在页面原型中,列表上方的条件是动态的,是可以不传递的,也可以只传递其中的1个或者2个或者全部。而在我们刚才编写的SQL语句中,我们会看到,我们将三个条件直接写死了。如果页面只传递了参数姓名name 字段,其他两个字段 性别 和 入职时间没有传递,那么这两个参数的值就是null。此时,执行的SQL语句为:这个查询结果是不正确的。正确的做法应该是:传递了参数,再组装这个查询条件;如果没有传递参数,就不应该组装这个查询条件。

actavy的博客 3028

Mplus—交叉滞后面板模型(Cross-Lagged Panel Model, CLPM)

本文介绍交叉滞后模型相关知识,以及显变量模型与潜变量模型在Mplus中的语法。

m0_54401011的博客 1万+

计量经济学tempdisagg的python库:年度时序变月度

计量经济学tempdisagg的python库:年度时序变月度

素质云笔记 1528

mybatis强大的动态SQL

我们可以将一些重复性的 SQL 语句进行抽取,以达到复用的效果。:抽取 SQL 语句标签。:引入 SQL 片段标签。抽取的 SQL 语句三、多条件组合查询之<where-if>我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。:条件标签。如果有动态条件,则使用该标签代替 where 关键字。:条件判断标签。查询条件拼接。

2501_90401192的博客 1637

iTunes登录协议逆向与自动化实现:从抓包到3DES加密的完整实战

网络协议逆向与自动化是提升开发与测试效率的关键技术,其核心在于理解客户端与服务器之间的通信原理。通过分析HTTPS请求、逆向加密算法,可以模拟合法客户端行为,实现批量操作自动化,在自动化测试与账号管理等场景中具有重要价值。本文聚焦于iTunes登录协议,深入剖析了其认证流程,并利用Frida动态调试工具成功逆向出关键的3DES加密环节,为开发者提供了一套从协议分析到Python代码实现的完整解决方案。

480

Mybatis之动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。 利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQ...

JustinNeil的博客 1万+

jason-2卫星介绍及其数据下载

两台仪器发射脉冲宽度均为105.6μs,带宽320MHz(C频段)和320/100MHz(Ku频段),脉冲重复频率1800Hz(Ku频段)和300Hz(C频段),功率78W,数据传输速率22.5kbit/s。共发射了3颗卫星(Jason - 1/2/3),星上有效载荷均主要为雷达高度计和微波辐射计。Jason - 1卫星主要有效载荷为波塞冬 - 2和“贾森微波辐射计”,Jason - 2卫星进行了改进,主要携带了波塞冬 - 3和先进微波辐射计,此外,Jason - 2卫星还携带了“多里斯”系统。

beautyaaaa的博客 1606

再生龙(clonezilla)镜像比目标盘大——基于centos8.5

再生龙恢复到小盘遇到的问题及处理,首先是修改分区大小,进入dracut模式后再尝试恢复临时系统。

u010101453的博客 3689

MyBatis 动态SQL详解

注意,``失败后, `` 关键字只会去掉库表字段赋值前面的and,不会去掉语句后面的and关键字,即注意,`` 只会去掉`` 语句中的最开始的and关键字。在实际开发中会遇到许多相同的SQL,比如根据某个条件筛选,这个筛选很多地方都能用到,我们可以将其抽取出来成为一个公用的部分,这样修改也方便,一旦出现了错误,只需要改这一处便能处处生效了,此时就用到了这个标签了。这个标签和是天仙配,是共生的,include用于引用sql标签定义的常量。

Coisini__S的博客 1268

启动launch文件时显示找不到franka_ign_ros2_control-system...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 695

Mybatis动态SQL

Mybatis 动态Sql

心流时间的博客 1247

【GameFramework扩展应用】6-5、GameFramework框架出包时增加版本信息Version.txt文件

框架在热更新的时候,会先去获取文件,然后获取版本号,对比版本号和资源大小,才会开始下载资源。但是,框架生成AssetBundle资源的包里面是没有这个文件的,只能我们新建一个文件,然后手动填入数据,非常麻烦。好消息是,框架把这些接口都留给我们了,我们只需要继承接口,重写函数,然后在打包的时候选择这个辅助器即可。下面就来看一下如何实现把。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1039

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MyBatis 实现动态 SQL

MyBatis 中的动态 SQL 就是SQL语句可以根据不同的情况情况来拼接不同的sql。 本文会介绍 xml 和 注解 两种方式的动态SQL实现方式。

2302_76339343的博客 2375

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Mybatis的动态SQL

Test public void insertMoreByList(){ User user1 = new User("a1","男","北京");

m0_73971785的博客 1275

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MyBatis 之 动态 SQL

动态 SQL

lfm1010123的博客 2134

MyBatis——动态SQL

动态SQL是MyBatis中的一种功能,允许你在XML映射文件中编写动态生成的SQL语句。主要用于解决SQL语句需要根据不同情况进行变化的问题。例如,你可能需要根据用户输入的查询条件生成不同的where子句,或者可能需要根据程序运行时的状态切换不同的join子句等。MyBatis提供了一套丰富的标签库来帮助你编写动态SQL,包括等。

zxb的博客 1918

【MyBatis】如何编写动态SQL

如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。在循环的时候拼接多个sql条件,用trim标签的prefixOverrides属性覆盖第一个and或者or,前缀加上"and (“,后缀加上” )",动态生成一个条件满足多种情况的sql。使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

小七的博客 1169

MyBatis之动态sql

resultType适用于简单的结果映射,可以自动进行映射;resultMap适用于复杂的结果映射,需要手动定义映射关系。

kissship的博客 2634

【MyBatis】动态 SQL

这些标签可以根据传入的参数动态地添加、删除或修改 SQL 语句的某些部分。语句,用来根据不同条件选择执行不同的 SQL 语句,包含。标签根据传入的条件判断是否包含该 SQL 片段。用于在 SQL 语句中循环处理集合或数组,常用于。文件中使用特定的标签来完成的。子句中的值,并且自动加上括号和逗号分隔符。,则将相应的条件添加到 SQL 查询中。是指在程序执行过程中,根据实际的情况。标签用于自动处理 SQL 语句中的。部分,避免了多余的逗号和条件。部分,它会自动去除多余的。,之后的条件会自动处理为。

weixin_63466958的博客 1363
上一篇: mybatis的高级映射
下一篇: mybatis插件开发
Jarvis!
博客等级 码龄6年 822粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值