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语句,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} )

  • 代码

    @RequestMapping(value = "/dongtaiSql4") @ResponseBody public void dongtaiSql4() { Test example = new Test(); example.setUsername("刘德华"); example.setGender(1); example.setIp("123232113111");

       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语句多余的后缀","。
复制代码

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

最后

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

Mybatis最拿得出手的功能之一 SpringBoot整合Mybatis-Plus 实战之动态SQL相关推荐

  1. SpringBoot整合MyBatis并实现简单的查询功能

    学了SpringBoot整合MyBatis才知道什么叫做省事,想当初用SSM的时候,那配置是真的多,SpringBoot真的是太友好了,到底有多好,接下来演示一个对数据库的查询功能,然初学者的我们大开 ...

  2. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...

  3. SpringBoot整合Mybatis超详细流程

    SpringBoot整合Mybatis超详细流程 文章目录 SpringBoot整合Mybatis超详细流程 前言 详细流程 0.引入Mybatis 1.创建数据 2.创建程序目录 3.理解后台访问流 ...

  4. SpringBoot整合Mybatis(高级)

    SpringBoot整合Mybatis(高级) 文章目录 SpringBoot整合Mybatis(高级) 前言 基础环境配置 增删改查 ResultMap 复杂查询 多对一 一对多 动态SQL if ...

  5. springboot整合mybatis 使用HikariCP连接池

    springboot整合mybatis 使用HikariCP连接池 前言 Springboot让Java开发更加美好,本节主要讲的是使用Hikari数据库连接池,如果需要使用druid连接池的请看我另 ...

  6. springboot整合Mybatis例子

    上一篇介绍了使用spring-data-jpa来实现数据的持久化及展示,现在使用比较流行的Mybatis来整合springboot,这里通过一个完整的例子来展示.实现数据的录入,展示以及按条件查询,同 ...

  7. SpringBoot整合Mybatis演示

    SpringBoot整合Mybatis演示 1.环境准备 JDK 1.8 MySQL 5.7 Maven 3.6.3 Idea 2020.1.1 数据库模拟数据准备: CREATE DATABASE ...

  8. Springboot整合mybatis plus生成代码

    一.Springboot整合mybatis plus生成代码 1.介绍 1.1.前言 从零开始搭建一个项目骨架,最好选择合适熟悉的技术,并且在未来易拓展,适合微服务化体系等.所以一般以Springbo ...

  9. springboot整合mybatis实现简单的单表增删改查(完整代码可下载)

    搭建项目 项目简单效果,前端效果丑的一批,主要是后端功能实现: springboot增删改查 csdn完整代码下载链接: springboot+mybatis Gitee下载地址: Gitee下载地址 ...

最新文章

  1. 【项目管理】风险分析
  2. 安全领域多位世界级权威的智慧结晶——《黑客新型攻击防范:深入剖析犯罪软件》...
  3. Egret之粒子系统
  4. Spring 层次性依赖查找Bean
  5. Ubuntu下挂载U盘
  6. 装文件存储服务器Fastdfs
  7. maven聚合工程打包_史诗级!有手就会的Maven教程(八)
  8. android ion --system heap(个人理解,不确定完全对)
  9. 实对称矩阵不同特征值对应的特征向量都正交
  10. 简单的网页制作期末作业
  11. PHP编写添加学生信息,添加学生信息并显示(示例代码)
  12. window11下VC6复活记
  13. 独家 | GAN大盘点,聊聊这些年的生成对抗网络 : LSGAN, WGAN, CGAN, infoGAN, EBGAN, BEGAN, VAE
  14. 重磅!!微软终于对 JDK 下手了…
  15. 全球喷气发动机收入预计2028年达到1189.6亿美元
  16. 甲板智慧-“AI语音垃圾分类机器人”拍了拍你
  17. 动态规划算法 | 最长递增子序列
  18. 手机开机密码忘记了怎么办?
  19. Python中文文本聚类
  20. pgpool安装使用

热门文章

  1. unity 音频可视化方案
  2. Power bi 超市经典案例之销售分析(二)
  3. Go简明语法汇总--入门
  4. CAD2017打开图纸点字体替换时没有字体选择框的问题
  5. 关于partnerLinkType的相关实验
  6. matlab 输出矩阵 逗号隔开,在MATLAB中自定义矩阵时,矩阵同行元素之间用逗号隔开,而每一行元素之间用分号隔开。...
  7. python get函数用法_详解python中get函数的用法(附代码)
  8. buctoj周赛14
  9. 开关电源matlab仿真设计报告,MATLAB非隔离式开关电源仿真分析+源代码
  10. web页面设计中使用阿里字体(包含图标)