当前位置: 首页 > news >正文

Mybatis的动态SQL~

        MyBatis有一个强大特性就是它的动态SQL。在实际项目开发中,经常需要根据不同条件拼接SQL语句,拼接时还要确保不能忘了必要的空格,有时候还要注意省掉列名列表最后的逗号...等等。在使用JDBC 或其他类似持久层框架操作数据库时,处理这种情况是非常麻烦的,甚至可以用痛苦来形容,而在MyBatis中利用动态SQL这一特性可以很简单地解决这个问题。

        动态SQL元素和使用JSTL或其他类似基于XML的文本处理器相似,MyBatis采用功能强大的基于OGNL的表达式来完成动态SQL。OGNL 的表达式可以被用在任意的SQL 映射语句中。


如上,假设有如上一张表,我们想查询如下条件:

  • status=1
  • 公司名包含【华为】
  • 品牌名包含【华为】

则在映射文件中书写如下sql语句:

    <select id="selectByCondition" resultMap="brandResultMap">select * from tb_brand where status=#{status} and company_name like #{companyName}and brand_name like #{brandName}</select>

接口中的方法名:

    List<Brand> selectByCondition(@Param("status") int status,@Param("companyName")String companyName,@Param("brandName")String brandName);

测试类如下:

public void testselectByCondition() throws IOException {int status=1;String companyName="华为";String brandName="华为";companyName="%"+companyName+"%";brandName="%"+brandName+"%";
//        1.获取SqlSessionFactoryString resource ="mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//        2.获取SqlSession对象SqlSession sqlSession= sqlSessionFactory.openSession();
//        3.获取Mapper接口的代理对象BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
//        4.执行方法List<Brand> brands=brandMapper.selectByCondition(status,companyName,brandName);System.out.println(brands);
//        5.释放资源sqlSession.close();}

 查询结果:

但是在实际场景中,可能并不需要同时查询3个条件,这样的话,参数值无法传入给sql中的占位符,后台会发生语法错误~

 

此时用到Mybatis中的动态sql技术:

 

 修改sql语句如下:

    <select id="selectByCondition" resultMap="brandResultMap">select * from tb_brand where<if test="status!=null">status=#{status}</if><if test="company_name!=null and company_name!=''">and company_name like #{companyName}</if><if test="brand_name!=null and brand_name!=''">and brand_name like #{brandName}</if></select>

如上,当有条件不存在时,会直接省略对该条件的判断。

    <select id="selectByCondition" resultMap="brandResultMap">select * from tb_brand<where><if test="status!=null">status=#{status}</if><if test="companyName!=null and companyName!=''">and company_name like #{companyName}</if><if test="brandName!=null and brandName!=''">and brand_name like #{brandName}</if></where></select>

但是还存在bug,当第一个条件不存在时会直接导致关键字where和and相连接导致语法错误,将where标签嵌到外面即可解决~ 

相关文章:

  • 【AIGC调研系列】通义千问、文心一言、抖音云雀、智谱清言、讯飞星火的特点分析
  • ZC706+AD9361 运行 open WiFi
  • Node.js常用命令
  • JavaScript 与 Vue 3:从基础到 MVVM 架构的实践探索
  • 如何开始定制你自己的大型语言模型
  • Springboot整合瀚高
  • 低代码开发:助力企业实现数字化运维体系搭建
  • Golang基础-5
  • 数据结构(六)——图
  • JAVAEE——线程池
  • 利用R语言和curl库实现网页爬虫的技术要点解析
  • Unity AI Navigation自动寻路
  • Ruoyi-Cloud-Plus_使用Docker部署分布式微服务系统---SpringCloud工作笔记200
  • I/O模型的一些理解
  • Github万星项目lobe-chat,连接GPT4GPTs,平替chatgpt-plus
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【391天】每日项目总结系列128(2018.03.03)
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Android框架之Volley
  • bearychat的java client
  • CentOS从零开始部署Nodejs项目
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Vue实战(四)登录/注册页的实现
  • Yeoman_Bower_Grunt
  • 阿里云应用高可用服务公测发布
  • 程序员该如何有效的找工作?
  • 动态规划入门(以爬楼梯为例)
  • 仿天猫超市收藏抛物线动画工具库
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 算法-图和图算法
  • 微信支付JSAPI,实测!终极方案
  • 我是如何设计 Upload 上传组件的
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 【云吞铺子】性能抖动剖析(二)
  • 阿里云重庆大学大数据训练营落地分享
  • #QT(一种朴素的计算器实现方法)
  • #控制台大学课堂点名问题_课堂随机点名
  • (ibm)Java 语言的 XPath API
  • (安卓)跳转应用市场APP详情页的方式
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (理论篇)httpmoudle和httphandler一览
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转) Android中ViewStub组件使用
  • (转载)(官方)UE4--图像编程----着色器开发
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .Net IE10 _doPostBack 未定义
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .Net8 Blazor 尝鲜
  • .NET构架之我见
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @Autowired自动装配