MyBatis的动态SQL是最令人喜欢的功能

在了解 动态SQL之前,你首先得知道一个表达式 OGNL,这个是基础!

  • 面试常问问题 : Mybatis 中$与#的区别?
  • 是将传入的值当做字符串的形式,select id,name,age from test where id =#{id},
    当把id值传入到后台的时候,就相当于 select id,name,age from test where id =‘1’.
  • ""是将传入的数据直接显示生成sql语句,selectid,name,agefromtestwhereid="是将传入的数据直接显示生成sql语句,select id,name,age from test where id = "是将传入的数据直接显示生成sql语句,selectid,name,agefromtestwhereid={id},
    当把id值1,传入到后台的时候,就相当于 select id,name,age from test where id = 1.
  • 使用#可以很大程度上防止sql注入。(语句的拼接)

if 标签

  • mapper
    select from test where 1=1 and username like concat('%', #{username}, '%') and ip=#{ip}
  • 在mapper 接口中映射这个方法
    List selectByTestSelective(Test example);

下面每个标签都会有对应的方法,但下文没有一一写出,现参考如下

List<Test> selectByExample(TestExample example);
List<Test> selectByTestSelective(Test example);
List<Test> selectByIdOrUserName(Test example);
List<Test> selectByTestSelectiveWhereTag(Test example);
List<Test> selectByTestIdList(List<Integer> ids);
int insertList(List<Test> students);
int updateTestSetTag(Test example);
int selectSelectiveTrim(Test example);

  • 测试
@RequestMapping(value = "/dongtaiSql")
@ResponseBody
public void dongtaiSql() {Test example = new Test();example.setUsername("周");List<Test> selectByTestSelective = testMapper.selectByTestSelective(example);for (Test test : selectByTestSelective) {System.out.println(test.getUsername());}
}

  • 打印结果
  • 也就是说,你传什么值 它会根据你传的值来拼接sql,不传值则不拼接,这种相对来说比较简单,易于理解。

【注意】 下文所有的请求都是通过postman发出的。

include标签

  • 一个非常好用的辅助性标签,用于放一些公共的返回结果集,方便其他的查询方法使用,比如在mapper中使用方式如下:
    username, lastloginTime select from test where id = #{id,jdbcType=BIGINT}

choose标签 ,配合when ,otherwise 标签使用

choose when otherwise 标签可以帮我们实现 if else 的逻辑。一个 choose 标签至少有一个 when,
最多一个otherwise。

  • mapper
    select from test where 1=1 and id=#{id} and username=#{username} and 1=2
  • 打印结果

找不到 周 ,因为我只有周杰伦或者周杰 。 这个choose和 if 的功能有点类似,但是和if 不同的是choose 有点你有什么我就根据你给的查,而if 则是你传了所有条件,我逐个判断你的条件然后给你查。if 更多适用于表单查询的时候用。而choose 更多的时候。。。其实这两个达到的目的是一样的,我更喜欢用choose.

where 标签

  • mapper
    select from test and username like concat('%', #{username}, '%') and ip=#{ip}
  • 结果
  • 我什么条件也没传,他在where中找不到匹配的条件就查找了全部给了我,这种其实和上面choose 中的最后那个条件有异曲同工之处,上变改成1=1 一样的效果。

foreach 标签

  • mapper
    select from test where id in #{id}
  • 代码
@RequestMapping(value = "/dongtaiSql3")
@ResponseBody
public void dongtaiSql3() {ArrayList<Integer> arrayList = new ArrayList<Integer>();arrayList.add(6);arrayList.add(5);List<Test> selectByTestSelective = testMapper.selectByTestIdList(arrayList);for (Test test : selectByTestSelective) {System.out.println(test.getUsername());}
}

  • 结果
  • 这个标签太好用了,foreach 也可以用来批量插入数据,比如:
  • mapper
    insert into test(username, gender, ip) values ( #{test.username}, #{test.gender},#{test.ip} )
  • 代码
 Test example2 = new Test();example2.setUsername("郭富城");example2.setGender(1);example2.setIp("123232113122");Test example3 = new Test();example3.setUsername("邱淑贞");example3.setGender(0);example3.setIp("123232113333");ArrayList<Test> arrayList = new ArrayList<Test>();arrayList.add(example);arrayList.add(example2);arrayList.add(example3);int selectByTestSelective = testMapper.insertList(arrayList);if (selectByTestSelective == 1) {System.out.println("批量插入:"+arrayList.size()+"条数据");}
}

  • 结果
  • .........这里的mapper 每次修改都要重新启动,很是麻烦。注意这里 #{test.username}, #{test.gender},#{test.ip} 最后不要有逗号,否则会报一个sql语法错误,原因是多了,。还有就是这里如果传的值是list等非实体类的参数的时候,是不用声明parameterType 的。
  • foreach 的变量说明
    collection: 必填, 集合/数组/Map的名称. item: 变量名。即从迭代的对象中取出的每一个值 index: 索引的属性名。当迭代的对象为 Map 时, 该值为 Map 中的 Key. open: 循环开头的字符串 close: 循环结束的字符串 separator: 每次循环的分隔符

bind 标签

  • 使用 bind 来让该 SQL 达到支持两个数据库的作用
  • mapper
    select from test where 1=1 <bind name="nameLike" value="'%'+username+'%'"/> and username like #{nameLike} </if> <if test="ip != null"> and ip=#{ip} </if>
  • 代码
    @RequestMapping(value = "/dongtaiSql") @ResponseBody public void dongtaiSql() { Test example = new Test(); example.setUsername("周"); List selectByTestSelective = testMapper.selectByTestSelective(example); for (Test test : selectByTestSelective) { System.out.println(test.getUsername()); } }
  • 结果

发现依然可以。 说明这个bind 就是绑定一些变量的 ,nameLike 就代表了username 的模糊搜索,就是如果别的地方用得到它的模糊搜索,拿来用即可。用法是 like 后面直接加上 #{nameLike }。

set 标签

这个标签常用于做修改语句,比如

  • mapper
    UPDATE Products username = #{username}, ip = #{ip}, id = #{id}
  • 代码
    @RequestMapping(value = "/dongtaiSql5") @ResponseBody public void dongtaiSql5() { Test example = new Test(); example.setUsername("周"); example.setIp("cium"); example.setId(27); int selectByTestSelective = testMapper.updateTestSetTag(example); System.out.println(selectByTestSelective);
    }
  • 结果
  • 这个set 说白了就是update语句的 set 时候的一个灵活操作。

trim 标签

  • mapper
    select * from test          AND username=#{username}      AND ip=#{ip}
  • 【注意】
  • 这里有很多坑,首先mybatis-plus 中不是 prefixoverride 而是prefixOverrides
  • 然后"AND |OR" 必须有空格,原因如下图
  • 如果 ip 不是字符串就不能用length() 方法

trim标签各参数的说明

prefix:在trim标签内sql语句加上前缀。
suffix:在trim标签内sql语句加上后缀。
prefixOverrides:指定去除多余的前缀内容
suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。
复制代码

然而我在配置的时候却遇到了更坑的问题,迟迟得不到解决…欢迎有兴趣的朋友一起交流下解决最后这个问题。

最后

感谢大家看到这里,文章有不足,欢迎大家指出;如果你觉得写得不错,那就给我一个赞吧。

作者:程序员麦冬
链接:https://juejin.cn/post/6901900140655673357
来源:掘金

mybatis if test 用法_SpringBoot整合Mybatis-Plus 实战之动态SQL,Mybatis拿得出手的功能之一...相关推荐

  1. Mybatis最拿得出手的功能之一 SpringBoot整合Mybatis-Plus 实战之动态SQL

    MyBatis的动态SQL是最令人喜欢的功能 在了解 动态SQL之前,你首先得知道一个表达式 OGNL,这个是基础! 面试常问问题 : Mybatis 中$与#的区别? #是将传入的值当做字符串的形式 ...

  2. MyBatis Dynamic SQL(一)— 真正的Mybatis动态sql — MyBatis Dynamic SQL

    目录 现状 MyBatis Dynamic SQL 项目地址 官方文档 项目介绍 作者 Mybatis Generator 简介 特性 目标 提示 快速使用 步骤 定义常量Tables和Columns ...

  3. 真正的Mybatis动态sql —MyBatis Dynamic SQL

    MyBatis Dynamic SQL MyBatis Dynamic SQL简介 MyBatis缺点 MyBatis Dynamic SQL优势 MyBatis Dynamic SQL项目信息 项目 ...

  4. mybatis学习(四)连接池、事务、动态SQL、多表查询

    目录 连接池 事务 动态SQL 1.if标签 2.where标签 3.foreach标签 4.sql标签 多表操作 (一)一对多.多对一 .一对一 1.查询所有账户,在账户信息后显示所属的用户的用户名 ...

  5. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...

  6. Springboot框架整合Mybatis-plus实战动态SQL以及常见的Mybatis面试题

    目录 MyBatis的动态SQL是最令人喜欢的功能 if 标签 include标签 choose标签 ,配合when ,otherwise 标签使用 where 标签 foreach 标签 bind ...

  7. 9、mybatis中动态sql的使用

    对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来.首先大家需要了解mybatis是什么.用mybatis来做什么.为什么要用mybatis.有什么优缺点:当知道了为什么的时候 ...

  8. MyBatis 接口绑定方案及多参数传递、动态 SQL、ThreadLocal、缓存

    一.MyBatis 接口绑定方案及多参数传递 作用:实现创建一个接口后把mapper.xml由mybatis 生成接口的实现 类,通过调用接口对象就可以获取 mapper.xml 中编写的 sql. ...

  9. SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL

    前言 通过前面的MyBatis部分学习,已经可以使用MyBatis独立构建一个数据库程序,基本的增删查改/关联查询等等都可以实现了.简单的单表操作和关联查询在实际开的业务流程中一定会有,但是可能只会占 ...

最新文章

  1. 网站被黑你隔了多久才知道?
  2. win10下右键菜单添加“打开cmd”
  3. Saltstack grains组件
  4. sqlite常见使用总结
  5. hdu 2149 巴什博弈
  6. KesionICMS智能建站系统v8源码
  7. 两行代码实现微信小程序联系人sidebar
  8. Time flies
  9. 编译libxcb时报错:No package 'xcb-proto' found
  10. 将jpg格式转成PDF格式的转换器
  11. 百度推广怎么调整计算机优先,百度推广oCPC的优化技巧是什么?oCPC常见问题汇总...
  12. 高光谱遥感数据光谱特征的提取与应用---高光谱基础知识科普论文
  13. 2023软件测试最难求职季,哪些测试技能更容易拿到offer?
  14. MySql 数据库 管理员密码忘记怎么办?
  15. linux panic机制
  16. 回顾 Firefox 历史
  17. 多组input文件,每组 multiple选择多张图片上传可增删其中任意一张图片,用formData对象实现;(ajax做异步,自己做延时同步)
  18. 服务器文件夹重定向,文件夹重定向
  19. wcf第3步之报文分析及原生调用
  20. 8.7 Kuratowski定理

热门文章

  1. iOS故障排除指南:基本技巧
  2. 快速构建Windows 8风格应用15-ShareContract构建
  3. PC机键盘的处理过程
  4. [轉]MS SQL Server启用AWE用查看内存使用情况
  5. JAVA从下载到浏览器运行完整篇,写给lewis
  6. C++ 区分中文,非中文,截取含有中文的string字符串的两种方法
  7. GPL协议 与 LGPL协议
  8. java 获取计算机内存
  9. 如何利用XShell隧道通过跳板机连接内网机器
  10. mysql 四 表操作