Mybatis中动态sql的使用

news2025/1/19 3:17:51

文章目录

  • 1. if 标签
  • 2.choose、when、otherwise
  • 3. trim、where、set
  • 4. foreach

动态 SQL 是 MyBatis 的强大特性之一,使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。Mbatis-Plus封装了一些固定的单表的查询,对于一些复杂的关联还得使用sql进行查询 。
常见的标签有以下几种:

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

1. if 标签

if标签可以对进行传入的参数进行判断.

<!--定义结果集-->
    <resultMap id="baseResultMap" type="com.elite.mybatis.entity.Person">
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="email" property="email"/>
    </resultMap>
    <!--定义sql片段-->
    <sql id="selectList">
          select id,name,age,email from person
    </sql>
    <!--if标签-->
    <select id="selectPersonByName" resultMap="baseResultMap">
          <include refid="selectList"></include>
          where 1=1
          <if test="name!=null and name!= ''">
             and  name like  CONCAT('%',CONCAT(#{name},'%'))
          </if>
    </select>

测试

public class TestDynamicSql {

    SqlSession sqlSession =null;
    @Before
    public void init() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        sqlSession = sqlSessionFactory.openSession();
    }
    /**
     * 查询人员信息
     */
    @Test
    public void testIf()  {

        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
        List<Person> personList = personMapper.selectPersonByName(null);
        personList.forEach(p->{
            System.out.println(p.toString());
        });
        PersonMapper personMapper1 = sqlSession.getMapper(PersonMapper.class);
        List<Person> personList1 = personMapper.selectPersonByName("elite");
        personList1.forEach(p->{
            System.out.println(p.toString());
        });
    }
}

2.choose、when、otherwise

choose可以根据条件进行判断加上条件进行查询。

/**
     * selectPersonByNameAndAge
     */
    /**
     * 查询人员信息
     */
    @Test
    public void testChoose() {
        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
        System.out.println("================传入名字按名字查询===============================");
        List<Person> personList = personMapper.selectPersonByNameAndAge("elite",null);
        personList.forEach(p -> {
            System.out.println(p.toString());
        });
        System.out.println("==================传入年龄按年龄查询=============================");
        List<Person> personList1 = personMapper.selectPersonByNameAndAge(null,24);
        personList1.forEach(p -> {
            System.out.println(p.toString());
        });
        System.out.println("===============都不传入按默认的id=1查询返回================================");
        List<Person> personList2 = personMapper.selectPersonByNameAndAge(null,null);
        personList2.forEach(p -> {
            System.out.println(p.toString());
        });
    }

sql查询

3. trim、where、set

前边拼接sql的地方可能一个条件都不加的情况下,我们需要写一个where 1=1才可以,这几个标签就可以解决这个问题。

    <select id="selectPersonById" resultMap="baseResultMap">
        <include refid="selectList"></include>
        <where>
            <if test="id != null and id!= '' ">
                id = #{id}
            </if>
        </where>
    </select>

测试代码

   /**
     * 查询人员信息
     */
    @Test
    public void testWhere() {
        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
        System.out.println("================不传入id===============================");
        List<Person> personList = personMapper.selectPersonById(null);
        personList.forEach(p -> {
            System.out.println(p.toString());
        });
        System.out.println("================传入id===============================");
        List<Person> personList1 = personMapper.selectPersonById(1L);
        personList1.forEach(p -> {
            System.out.println(p.toString());
        });
    }

测试set

 <!--set标签-->
    <update id="updatePersonById">
        update person
        <set>
            <if test="name != null">name=#{name},</if>
            <if test="age != null">age=#{age},</if>
            <if test="email != null">email=#{email}</if>
        </set>
        where id=#{id}
    </update>

测试

 /**
     * 测试更新
     */
    @Test
    public void testSet() {
        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
        Person p = new Person();
        p.setId(1L);
        p.setName("testset");
        p.setEmail("testset@qq.com");
        personMapper.updatePersonById(p);
        System.out.println(personMapper.selectPerson(1L).toString());
        //Person{id=1, name='testset', age=22, email='testset@qq.com'}
    }

4. foreach

动态 SQL 的另一个常见使用场景是对集合进行遍历。

mapperxml


<!--foreach-->
    <select id="selectPersonByIds" resultMap="baseResultMap">
        <include refid="selectList"></include>
        <where>
            <foreach item="item" index="index" collection="ids"
                     open="id in (" separator="," close=")">
                #{item}
            </foreach>
        </where>
    </select>

测试

 /**
     * 测试更新
     */
    @Test
    public void testForeach() {
        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
        Long[] ids = new Long[]{1L,2L};
        personMapper.selectPersonByIds(ids).forEach(person -> {
            System.out.println(person.toString());
        });
    }

测试结果

Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@12b08d6]
==>  Preparing: select id,name,age,email from person WHERE id in ( ? , ? )
==> Parameters: 1(Long), 2(Long)
<==    Columns: id, name, age, email
<==        Row: 1, elite, 22, elite@qq.com
<==        Row: 2, elite2, 24, elite2@qq.com
<==      Total: 2
Person{id=1, name='elite', age=22, email='elite@qq.com'}
Person{id=2, name='elite2', age=24, email='elite2@qq.com'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SaaS企业应该如何建立稳固的客户关系?

近年来&#xff0c;“客户成功”一词越来越热&#xff0c;这主要是由于当下企业正面临人口红利触顶、获客成本高昂、用户转化率低下、企业业绩增长受阻等问题&#xff0c;所以更多的企业开始将重心转移到对老客户的维护上&#xff0c;这也使得客户成功团队在企业中发挥的作用越…

Go中的异常处理

Go 中异常处理 主要掌握 一下几个方面: 掌握error接口掌握defer延迟掌握panic及recover error接口 error是指程序中出现不正常的情况,从而导致程序无法正常运行; go中为错误的类型提供了简单的错误处理机制 go中error的源码: // The error built-in interface type is t…

栈:程序员必备的工具箱

栈的结构和基本操作 本篇博客会讲解栈。栈是一种线性的数据结构&#xff0c;它满足“后进先出”的特性。栈有两端&#xff0c;分别是栈顶和栈底。每次插入或者删除数据&#xff0c;都是在栈顶的方向进行的。画个图解释一下&#xff1a;假设上面是栈顶&#xff0c;下面是栈底。…

linux ioctl 理解

背景 传统的操作系统可以分成两层&#xff0c;用户层和内核层。内核代码处理敏感资源同时在不同应用程序中间提供了安全且可信的隔离&#xff0c;出于此&#xff0c;操作系统要阻止用户态的程序直接访问内核资源。用户空间的程序通常发出一个给内核的请求&#xff0c;该请求称为…

基于vite4+pinia2模仿chatgpt移动端聊天模板Vue3MobileGPT

运用vite4.x构建mobile端仿chatgpt聊天实例Vue3-mobileGPT vue3-mobilegpt 基于 vite4vue3pinia2vue-routervant 等技术开发移动端仿ChatGPT智能聊天项目模板。支持lightdark两种主题&#xff0c;搭配vue3组件库Vant&#xff0c;界面简洁美观。 就前几天OpenAI就推出了IOS版Cha…

从 Vue Devtools 调用 WebStorm 打开文件

从 Vue Devtools 调用 WebStorm 打开文件 Vue Devtools 有一个功能, 可以直接在查看组件时, 直接打开对应的文件, 但默认是使用 VSCode 打开, 本文介绍如何使用 WebStorm 打开文件. 修改 vue.config.js: const openInEditor require("launch-editor-middleware");…

外包工作6年,聊一下感想.....

我不知道当年怎么想的&#xff0c;能在一个外包公司一干就是6年&#xff0c;后来终于跳出来了&#xff0c;现在的公司虽然不是什么大厂吧&#xff0c;但至少是个正经的互联网企业&#xff0c;待遇也不错。其实很多地方的朋友都有提到外包公司的一些弊端。 我个人的建议是&#…

linux下安装google谷歌浏览器

前言 记录下linux下安装谷歌浏览器全过程。 一、下载安装包 https://www.google.cn/intl/zh-CN/chrome/ 访问谷歌浏览器&#xff0c;拉到最下面 点击其他平台&#xff0c;选择linux 然后下载下来 下载完成后得到一个安装包 二、安装步骤 2.1.上传到linux服务器&#x…

chatgpt赋能Python-python_calu

Python Calu&#xff1a;Python程序员不可或缺的计算工具 作为一名有10年Python编程经验的工程师&#xff0c;我一直在使用Python编写各种程序&#xff0c;其中不可或缺的就是Python Calu。在下面&#xff0c;我将向您介绍Python Calu的特点及其在Python编程中的重要性。 什么…

uniapp内使用 mescroll

前言 在使用uniapp开发项目的过程中&#xff0c;在很多场景里都需要下拉刷新和上拉加载&#xff0c;而 mescroll.js 则是一个非常精致的下拉刷新和上拉加载 js 框架。 官网地址&#xff1a;mescroll 介绍 mescroll.js 是在 H5端 运行的下拉刷新和上拉加载插件&#xff0c;时…

如何使用 Xshell 连接 Linux 服务器

目录 &#x1f333;搭建 Linux 环境 &#x1f331;Linux 环境的搭建方式 ☘️购买云服务器 &#x1f333;使用Xshell远程登陆到Linux服务器 &#x1f331;下载安装Xshell ☘️查看Linux主机ip &#x1f340;使用Xshell登录主机 &#x1f4a7;方法1 &#x1f4a7;方法2…

宝塔面板搭建网站教程:Linux下使用宝塔一键搭建网站,内网穿透发布公网上线

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 转载自cpolar内网穿透的文章&#xff1a;使用宝塔面板快速搭建网站&#xff0c;并内网穿透实现公网远程访问 前言 宝塔面板作为简单好用的服务器运维管理面板&…

VScode必备插件大全

为了高效率的工作&#xff0c;我们在使用vScode的是时候&#xff0c;经常会用到一些好用的插件&#xff1b;现在就个人喜欢的插件分享给大家&#xff0c;欢迎点赞加收藏&#xff1b; 1、JavaScript(ES6) code snippets ES6 语法智能提示及快速输入&#xff0c;不仅仅支持 .js…

2009.03-2022.06华证ESG季度评级(季度)

2009.03-2022.06华证ESG评级&#xff08;季度&#xff09; 1、时间&#xff1a;2009.03-2022.06.15 2、来源&#xff1a;整理自Wind 3、指标&#xff1a;华证ESG&#xff08;只有综合评级&#xff0c;无细分评级数据&#xff09; 4、样本数量&#xff1a;A股4800多家公司 …

由浅入深Dubbo核心源码剖析高阶配置运用

目录 1 不同配置覆盖关系2 属性配置优先级3 重试与容错处理机制4 多版本控制5 本地存根调用6 负载均衡机制7 服务降级运用8 并发与连接控制 1 不同配置覆盖关系 Dubbo高阶配置运用 关于配置参看官方文档&#xff1a;https://dubbo.apache.org/zh/docsv2.7/user/configuration/ …

chatgpt赋能Python-python_bobo

Python Bobo&#xff1a;轻量级Web框架 Python是一个强大的编程语言&#xff0c;被广泛用于web应用程序和数据科学。用Python构建web应用程序的其中一条途径是使用框架。它们提供了一些实用的功能&#xff0c;如路由、模板、数据库集成等等。 Python中许多框架都很强大&#x…

Keil Debug 串口调试技巧

Keil Debug 串口调试技巧 效果 debug窗口效果 虚拟串口效果 debug窗口实现方法 第一步&#xff1a;配置参数 更改对应的bebug窗口参数 两边的 Dialog DLL 更改为&#xff1a;DARMSTM.DLL两边的 Parameter &#xff08;这里的根据单片机型号更改&#xff09;更改为&#xff…

chatgpt赋能Python-python_char

Python Char&#xff1a;了解 Python 字符的基础知识 Python是一种广泛使用的编程语言&#xff0c;因其易于学习、语法简单且适用于不同的应用场景而备受欢迎。在Python中&#xff0c;字符是一种重要的数据类型&#xff0c;也是值得深入学习的主题之一。本文将介绍Python字符的…

基于 Docker 搭建 ownCloud 个人云盘

本文源码&#xff1a;https://github.com/chen2438/chenhaotian.top/tree/main/source/_posts/linux-app/owncloud.md 在我的博客上查看&#xff1a;https://chenhaotian.top/2022/09/07/linux-app/owncloud/ 基于 Docker 搭建 ownCloud 个人云盘 官方文档 机翻气息贯穿全文…