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

一个系列搞定MyBatis:MyBatis配置动态SQL语句基础

MyBatis配置动态SQL语句基础

MyBatis配置动态SQL语句

在 MyBatis 的 SQL映射文件中,有时候需要根据一些查询条件,来选择不同的SQL语句,如果每一个场景都重写SQL,很显然效率没有很高,而 MyBatis 的动态SQL很好的解决了这种问题,根据条件动态的处理 SQL, 特别简单的说就是,写一次SQL,但是根据分支等的跳转,在多个场景下也可以使用,例如:

  • 当查询条件由于参数不同而无法确定具体是什么,可以使用 <where> 标签包含
  • <where> 可以使用 <if test="...."> 分条件进行处理,实现动态
  • <foreach> 遍历标签放到后面代码中具体说

在此之外,动态SQL同时结局了,在原生 JDBC 中需要拼接SQL语句时由于书写问题,而导致报错

(一) where 和 if 标签

UserMapper 接口

/**
* 根据条件查询
* @return
*/
List<User> findUserByCondition(User user);
复制代码

UserMapper.xml

<select id="findUserByCondition" resultType="cn.ideal.domain.User" parameterType="cn.ideal.domain.User">
	select  * from user
    <where>
   		<if test="username != null">
        	and username = #{username}
        </if>
        <if test="gender != null">
            and gender = #{gender}
        </if>
    </where>
</select>
复制代码

注意:在SQL中,“and” 用来拼接已有一个或多个查询条件的语句,当此语句为第一个查询条件的时候,会因为 <where> 的存在屏蔽第一个 “and”

MyBatisTest

/**
 * 根据条件查询
 * @throws Exception
 */
@Test
public void testFindByCondition() throws Exception{
    User user = new User();
    user.setUsername("汤姆");
    user.setGender("女");

    List<User> users = userMapper.findUserByCondition(user);
    for (User u : users){
        System.out.println(u);
    }
复制代码

执行效果

img

img

(二) 复用SQL

有一些语句,在我们的程序中,使用的频率特别高,这个时候,我们也可以对其进行,单独的配置,然后达到复用的效果

首先,我们需要对其进行简单的声明

<sql id="xxxxx">
	<!-- 复用的SQL -->
</sql>
复制代码

在需要引用的地方,我们可以这样引用

<where>
	<include refid="xxxxx"></include>
	<!-- 可能还用引用别的 -->
</where>
复制代码

(三) foreach标签

提出这样一种需求,在用户中查询寻多个id,例如(12,16,17)我们可以这样写SQL

select * from user where id=12 or id=16 or id=17
复制代码

或者这样

select * from user where id in (12,16,17)
复制代码

而这种情况下,我们需要向SQL中传递一个数据或者List类型的参数,然后使用 <foreach> 标签去遍历然后解析

UserMapper 接口

/**
     * 根据QueryUserVo中提供的id集合,查询用户信息
     * @param vo
     * @return
     */
    List<User> findUserInIds(QueryUserVo vo);
复制代码

UserMapper.xml

<select id="findUserInIds" resultType="cn.ideal.domain.UserInstance" parameterType="cn.ideal.domain.QueryUserVo">
	select * from user
	<where>
        <if test="ids != null and ids.size() > 0">
        	<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
            	#{uid}
            </foreach>
        </if>
    </where>
</select>
复制代码

解释一下

  • collection 指定输入对象中的集合属性
  • item 为每次遍历生成的对象名
  • open为开始遍历时拼接的字符串
  • close为结束便利时要拼接的字符串
  • separator为遍历两个对象中间需要拼接的串

本例中,我哦们使用了 select * from user where id in (12,16,17) 这种形式,如果想使用 or那种形式,只需要修改拼接格式就可以了

/**
 * 根据QueryUserVo中提供的id集合,查询用户信息
 * @throws Exception
 */
    @Test
    public void testfindUserInIds() throws Exception{
        QueryUserVo vo = new QueryUserVo();
        List<Integer> list = new ArrayList<Integer>();
        list.add(12);
        list.add(16);
        list.add(17);
        vo.setIds(list);

        List<User> users = userMapper.findUserInIds(vo);
        for (User u : users){
            System.out.println(u);
        }
    }
复制代码

执行效果

img

执行效果

img

相关文章:

  • 一个系列搞定MyBatis:MyBatis快速上手增删改查
  • 一个系列搞定MyBatis:Mybatis多表查询
  • PropertyPlaceholderConfigurer 用法超详细解析!
  • JavaFX之WebView超详细解析!
  • javafx之webEngine超详细解析
  • mybatis-plus进阶教程!超详细使用方法解析!
  • mybatis-plus入门教程!看完必懂!超详细解析!
  • Mybatis-Plus中的代码生成器AutoGenerator超详细解析!完整配置!
  • Mybatis plus关闭驼峰命名,防止出现查询为Null!四种方法超详细解析!
  • Spring体系结构超详细解析!
  • 自然语言处理系列之: NLP基础
  • 自然语言处理系列之:中文分词技术
  • 自然语言处理系列之:词性标注与命名实体识别
  • 自然语言处理系列之: 关键词提取算法
  • 自然语言处理系列之: 句法分析
  • docker-consul
  • Golang-长连接-状态推送
  • Javascript编码规范
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 技术胖1-4季视频复习— (看视频笔记)
  • 解决iview多表头动态更改列元素发生的错误
  • 前端技术周刊 2019-02-11 Serverless
  • 前嗅ForeSpider教程:创建模板
  • 深入浅出webpack学习(1)--核心概念
  • 异常机制详解
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (接口自动化)Python3操作MySQL数据库
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 4.0发布后不能正常显示图片问题
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .net6 webapi log4net完整配置使用流程
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET命令行(CLI)常用命令
  • .NET企业级应用架构设计系列之技术选型
  • .NET企业级应用架构设计系列之应用服务器
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @test注解_Spring 自定义注解你了解过吗?
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [20171101]rman to destination.txt
  • [ajaxupload] - 上传文件同时附件参数值
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [Angular 基础] - 表单:响应式表单
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++]AVL树怎么转