• mybatis的强大特性之一就是动态SQL。我们在写复杂查询的时候,会发现复杂查询包括了各种各样的判断,我们很难一鼓作气的写出完美的查询。动态SQL语句可以帮助我们拼接不同的SQL语句,而已让我们的代码变得更加优雅且功能更加强大。这一篇给大家介绍一下if的用法

    下边就是现在MyBatis的动态SQL在XML中支持的几种标签,他们分别是:

    • if
    • choose
    • trim(where、set)
    • foreach
    • bind

      if用法

    if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段,还可以在INSERT语句中用来判断是否插入某个字段的值

    where:(我们的项目中模糊查询很多都用到了if,如果模糊条件不为空,则执行模糊查询,如果为空就到此为止)

    <select id="FuzzyQueryClassByStrlike" parameterType="java.lang.String" resultType="com.dmsdbj.itoo.basicInfo.entity.ext.DivideClassModel">selecttc.id as classId,tc.class_code as classCode,tc.class_name as className,tc.profession_id as professionId,p.major_name as professionName,p.institution_id as InsititutionId,i.institution_name as InsititutionNamefrom t_class tcinner join  t_profession p on tc.profession_id = p.idinner join t_institution i on p.institution_id=i.id<if test="strLike !='' and strLike !=null">WHERE(tc.class_code LIKE concat('%',#{strLike},'%')ORtc.class_name LIKE concat('%',#{strLike},'%')ORp.major_name LIKE concat('%',#{strLike},'%')ORi.institution_name LIKE concat('%',#{strLike},'%'))</if>
    

      update(insert同理):如果要更新很多字段,但是一个步骤就可以完成,我们就可以使用if来进行判断,如果这个参数不为空则更新

    <update id="updateById" parameterType="com.dmsdbj.itoo.basicInfo.entity.EducationExperienceEntity">update t_education_experience<set><if test="remark != null">remark = #{remark,jdbcType=VARCHAR},</if><if test="operator != null">operator = #{operator,jdbcType=VARCHAR},</if><if test="endDate != null">end_date = #{endDate,jdbcType=DATE},</if><if test="schoolName != null">school_name = #{schoolName,jdbcType=VARCHAR},</if><if test="startDate != null">start_date = #{startDate,jdbcType=DATE},</if><if test="teacherName != null">teacher_name = #{teacherName,jdbcType=VARCHAR},</if><if test="studentId != null">student_id = #{studentId,jdbcType=VARCHAR},</if><if test="isDelete != null">is_delete = #{isDelete,jdbcType=TINYINT},</if><if test="education != null">education = #{education,jdbcType=VARCHAR},</if><if test="createTime != null">create_time = #{createTime,jdbcType=TIMESTAMP},</if><if test="updateTime != null">update_time = #{updateTime,jdbcType=TIMESTAMP},</if></set>where id = #{id,jdbcType=VARCHAR} and is_delete = 0</update>
    

      注意:
    if标签中有一个test属性,test属性值是一个符合OGNL要求的判断表达式,表达式的结果可以使true或者false,除此之外所有的非0值都为true。

上一篇中我们讲解了if标签的使用,但是他无法实现if…else的逻辑判断,这就要用到我们这一篇提到的choose when otherwise标签。

使用规则:

一个choose中至少有一个when,有0个或一个otherwise

举个例子:

<select id="selectByIdOrUserName" resultType="cd.mybatis.model.SysUser">
select id,user_name userName,user_password UserPassword,user_info userInfo
from sys_user
where 1=1
<choose><when test="id!=null">and id=#{id}</when><when test="userName !=null and userName !='' ">and user_name =#{uerName}</when><otherwise>and 1=2</otherwise>
</choose>
</select>

  

代码解释:

查询用户的信息,如果提供了id,那么优先使用id查询,如果没有id,提供了username,那么使用username作为条件查询,如果都没有则执行otherwise,确保返回值的正确

上一篇博客我们简单的介绍了一下choose when otherwise的用法,这一篇我们来聊聊另外当个差不多的标签的用法:where、set、trim

1. where标签的作用:如果该标签包含的元素中有返回值,就插入一个where;如果where后面的字符是以AND和OR开头的,就讲他们剔除

举个例子:

<select id="selectByUser" resultType="cd.mybatis.simple.model.SysUser">select id,user_name userName,user_password userPassWord,user_email userEmail,user_info userInfo,user_img headImg,create_time createTimefrom sys_userwhere 1=1<if test="userName != null and userName !=''">and user_name like concat('%',#{userName},'%')</if><if test="userEmail !=''and userEmail !=null">and user_email=#{userEmail}</if></select>

  使用where标签修改后:

<select id="selectByUser" resultType="tk.mybatis.simple.model.SysUser">select id,user_name userName,user_password userPassWord,user_email userEmail,user_info userInfo,user_img headImg,create_time createTimefrom sys_user<where><if test="userName != null and userName !=''">and user_name like concat('%',#{userName},'%')</if><if test="userEmail !=''and userEmail !=null">and user_email=#{userEmail}</if></where></select>

  

第一个例子中,如果没有where1=1,当两个if条件都不满足时,最后生成的SQL就会以where结束,这样不符合SQL规范,所以需要加一个默认为true的条件

第二个例子,如果两个if条件不满足的时候,where标签包着的这一段代码就会被剔除掉,在SQL中就不会出现这一段代码了。

2.set标签的作用:如果该标签包含的元素中有返回值,就插入一个set;如果set后面的字符串是以逗号结尾的,就将这个逗号剔除

举个例子:

<!--批量更新学生信息-XX-2017-7-24 17:00:08--><update id="updateStudentList"><foreach collection="studentEntitys" item="item" index="index" open="" close="" separator=";">update t_student<set><if test="item.classesId!='' and item.classesId!=null">classes_id=${item.classesId}</if><if test="item.code!='' and item.code!=null">code=${item.code}</if><if test="item.roomId!='' and item.roomId!=null">room_id=${item.roomId}</if></set>where id = ${item.id}</foreach></update>

  

注意最后的where id=${item.id} 是不可省略的,如果set包含的内容为空,只能避免最后遗留的逗号问题

3.trim用法:where和set标签的功能都可以使用trim标签来实现,并且在底层就是通过TrimSqlNode实现的

where标签对应的trim实现:

<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>

  set标签对应的trim实现:

<trim prefix="SET" prefixOverrides=",">
...
</trim>

  

trim属性

  • prefix:当trim元素内包含内容时,会给内容增加prefix指定前缀
  • prefixOverrides: 当trim元素内包含内容时,会把内容中匹配的前缀字符串去掉
  • suffix: 当trim元素内包含内容时,会给内容增加suffix指定的后缀
  • suffixOverrides:当trim内包含内容时,会把内容中匹配的后缀字符串去掉。

mybatis中大于等于小于等于的写法

第一种写法(1):原符号       <        <=      >       >=       &        '        "
替换符号    &lt;    &lt;=   &gt;    &gt;=   &amp;   &apos;  &quot;
例如:sql如下:
create_date_time &gt;= #{startTime} and  create_date_time &lt;= #{endTime}第二种写法(2):
大于等于
<![CDATA[ >= ]]>
小于等于
<![CDATA[ <= ]]>
例如:sql如下:
create_date_time <![CDATA[ >= ]]> #{startTime} and  create_date_time <![CDATA[ <= ]]> #{endTime}

  

转载于:https://www.cnblogs.com/wlsblog/p/7699420.html

mybatis常用方法总结相关推荐

  1. MyBatis-plus执行自定义SQL

    序号 类型 地址 1 MySQL MySQL操作之概念.SQL约束(一) 2 MySQL MySQL操作之数据定义语言(DDL)(二) 3 MySQL MySQL操作之数据操作语言(DML)(三) 4 ...

  2. Mybatis-Plus(连接Hive)

    序号 类型 地址 1 MySQL MySQL操作之概念.SQL约束(一) 2 MySQL MySQL操作之数据定义语言(DDL)(二) 3 MySQL MySQL操作之数据操作语言(DML)(三) 4 ...

  3. MySQL操作之视图

    序号 类型 地址 1 MySQL MySQL操作之概念.SQL约束(一) 2 MySQL MySQL操作之数据定义语言(DDL)(二) 3 MySQL MySQL操作之数据操作语言(DML)(三) 4 ...

  4. MySQL管理之索引

    序号 类型 地址 1 MySQL MySQL操作之概念.SQL约束(一) 2 MySQL MySQL操作之数据定义语言(DDL)(二) 3 MySQL MySQL操作之数据操作语言(DML)(三) 4 ...

  5. MySQL操作之数据备份与还原

    序号 类型 地址 1 MySQL MySQL操作之概念.SQL约束(一) 2 MySQL MySQL操作之数据定义语言(DDL)(二) 3 MySQL MySQL操作之数据操作语言(DML)(三) 4 ...

  6. MyBatis foreach 标签常用方法总结

    一.前言   在 MyBatis 中,常常会遇到集合类型的参数,虽然我们可以通过 OGNL 表达式来访问集合的某一个元素,但是 OGNL 表达式无法遍历集合.foreach 标签就是专门用来解决这类问 ...

  7. MyBatis框架概述

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设 ...

  8. MyBatis 为什么需要通用 Mapper ?

    一.通用 Mapper 的用途 ? 我个人最早用 MyBatis 时,先是完全手写,然后用上了 MyBatis 代码生成器(简称为 MBG),在使用 MBG 过程中,发现一个很麻烦的问题,如果数据库字 ...

  9. 扔掉工具类,Mybatis一个简单配置搞定数据加密解密!

    今日推荐 推荐 20 款 IDEA 主题!开源困境:Log4j2 维护者发声:没有工资,还要挨骂!!RedisJson 横空出世,性能碾压ES和Mongo!还在发愁写API文档?推荐一款阿里腾讯都在用 ...

最新文章

  1. poj3264 - Balanced Lineup(RMQ_ST)
  2. 【错误记录】前台进程报错 ( Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE )
  3. MySql 数据库 - 安装时提示缺失VCRUNTIME140_1.dll文件导致的无法启动此程序解决方法,vc++2015-2019运行库集合包获取
  4. T5 PEGASUS:开源一个中文生成式预训练模型
  5. Java Servlet生成JSON格式数据并用jQuery显示
  6. mysql存储过程语法 if_mysql存储过程语法 if
  7. 在easyui中如何使用ajax请求数据,Ajax 中正常使用jquery-easyui (转)
  8. python3 copy_Python3 深浅拷贝
  9. 拓端tecdat|R语言k-means聚类、层次聚类、主成分(PCA)降维及可视化分析鸢尾花iris数据集
  10. 跨浏览器书签导入实例演示,更好的管理书签!
  11. 海军某训练基地落户上海崇明岛 建设用地2500亩
  12. MAC下邮件客户端操作——解决无法登陆GMail IMAP服务器
  13. 2003系统服务器不设置密码,服务器2003怎么设置密码
  14. python9_Python9-列表-day4
  15. 博客园博客Wiz测试
  16. vue3+ts+element-plus(包含vuex、router) 随笔
  17. 从前慢-MySql基础
  18. inventor铸件图_inventor三维剖视图
  19. Python入门基础练习题
  20. 除去虚拟目录中的旧版本文件(临时文件下载、归档文件下载)

热门文章

  1. Android网络课程笔记-----本地音乐播放
  2. YY一下IT业的未来
  3. xstream,节点属性起别名时这样的问题你遇到过吗
  4. 卸载docker后部署k8s后docker无法启动问题
  5. h5页面生成图片分享到微信js_html2canvas 动态生成微信分享海报的优质js库
  6. iptables nat表含义_十(4)iptables语法、iptables filter表小案例、iptables nat表应用
  7. python语言基本控制结构有哪些-以下不属于Python语言控制结构的是()
  8. mysql中括号_干货!Python与MySQL数据库的交互实战
  9. Mysqldump命令参数介绍
  10. 大数据技术之 Kafka (第 3 章 Kafka 架构深入 ) Kafka 消费者