Mybatis映射文件中动态sql语句

2023-11-05

目录

Mybatis映射文件深入

动态sql语句

官方文档中动态sql

动态SQL之if

测试示例if

动态sql之foreach

测试示例foreach

 sql片段的抽取

Mybatis映射文件深入知识小结


Mybatis映射文件深入

动态sql语句

概述:Mybatais的映射文件中,前面我们的SQL都是比较简单的,有时候业务逻辑复杂时,我们的sql时动态变化的,此时在其那面学习的sql就不能满足要求了

官方文档中动态sql

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。

动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

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

动态SQL之if

测试示例if

UserMapper接口下

package com_Mybatis_sql.mapper;

import com_Mybatis_sql.pojo.User;

import java.util.List;

public interface UserMapper {
    public List<User> findByCondition(User user);
}

 UserMapper2.xml文件下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com_Mybatis_sql.mapper.UserMapper">

<select id="findByCondition" parameterType="user" resultType="user">

 select *from user
-- 用where标签保住等价于where 1=1,有条件就进入
 <where>
 <if test="id!=0">
     and id=#{id}
 </if>

 <if test="username!=null">
     and username=#{username}
 </if>
 <if test="password!=null">
     and password=#{password}
 </if>
 </where>
</select>



</mapper>

test测试下



public class MapperTest {
    @Test
    public void test1() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        //模拟条件user
     User user=new User();
        user.setId(1);
        user.setUsername("zhangsan");
       user.setPassword("123");
        List<User> userList = mapper.findByCondition(user);
        System.out.println(userList);
    }

}

运行结果

 当没有写条件时,原来的sql语句就等价于select *from user

<select id="findByIds" parameterType="list" resultType="user">
    select *from user
    <where>
        <foreach collection="list" open="id in(" close=")" item="id" separator=",">
            #{id}
        </foreach>

    </where>

</select>

 这样的动态查询无论是有没有条件或者是有多个条件都能查询到

动态sql之foreach

循环执行sql的拼接操作,例如::select *from user where id in(1,2,3)

测试示例foreach

UserMapper接口下

public interface UserMapper {

    public List<User> findByIds(List<Integer> ids);
}

配置文件UserMapper2.xml配置文件下

<select id="findByIds" parameterType="list" resultType="user">
    select *from user
    <where>
        <foreach collection="list" open="id in(" close=")" item="id" separator=",">
            #{id}
        </foreach>

    </where>

</select>

MapperTest测试类下

public class MapperTest {


    @Test
    public void test2() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

     //模拟ids的数据
        List<Integer> ids=new ArrayList<Integer>();
        ids.add(1);
        ids.add(2);
        List<User> byIds = mapper.findByIds(ids);
        System.out.println(byIds);

    }
}

 运行结果

 sql片段的抽取

sql中可将重复的sql提取出来,使用include引用即可,最终达到sql重用的目的

<!--sql语句抽取-->
    <sql id="selectUser"> select *from user</sql>

<select id="findByIds" parameterType="list" resultType="user">
    <include refid="selectUser"></include>
    <where>
        <foreach collection="list" open="id in(" close=")" item="id" separator=",">
            #{id}
        </foreach>

    </where>

</select>

Mybatis映射文件深入知识小结

<select>:查询

<insert>:插入

<update>:修改

<delete>:删除

<where>:where条件

<if>:if判断

<foreach>:循环

<sql>:sql片段抽取

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis映射文件中动态sql语句 的相关文章

随机推荐

  • 中国14岁初中生,开源Windows 12网页版,star数近2k

    出品 OSC开源社区 ID oschina2013 最近在网上冲浪 发现名为 Windows 12 网页版 的开源项目 在网页端实现了 Windows 12 的交互和 UI 项目亮点 精美的 UI 设计 流畅丰富的动画 各种高级的功能 相较
  • 解决Ubuntu 14.04 built-in display 分辨率较低的方法

    打开终端 输入 sudo nona etc X11 xorg conf 将下列代码粘贴复制到终端 Section Monitor Identifier Monitor0 VendorName Monitor Vendor ModelName
  • http://www.msftconnecttest.com/redirect找不到应用程序解决办法

    我在连学校内网的时候 不能自动跳转到登录的页面 因为有一些默认的配置已经被修改 可能有的人认为不是自己修改的 那么原因也有可能是软件安装的过程中默认设置被修改 也有可能是你不轻易间点错了 不废话了 直接发图 第一步 window10 点击左
  • epoll全面讲解:从实现到应用

    epoll全面讲解 从实现到应用 什么是epoll 或者说 它和select有什么区别 什么是select 有的朋友可能对select也不是很了解啊 我这里稍微科普一下 网络连接 服务器也是通过文件描述符来管理这些连接上来的客户端 既然是供
  • 使用 getopt() 进行命令行处理

    使用 getopt 进行命令行处理 轻松处理复杂命令行 文档选项 打印本页 将此页作为电子邮件发送 样例代码 级别 中级 Chris Herborth chrish pobox com 自由撰稿人 作家 2006 年 5 月 25 日 所有
  • 只需单击三次,让中文GPT-2为你生成定制故事

    2019 11 12 12 49 55 机器之心报道 机器之心编辑部 想要 GPT 2 生成中文故事 听听它对各种主题的看法 你可以试试这个中文预训练 GPT 2 项目 它开源了预训练结果与 Colab Demo 演示 只需要单击三次 我们
  • QSettings读取int文件解析失败

    问题 QSettings解析失败 ini文件如下 System name CPMS with IIoT by R Campro Precision Machinery Co Ltd gs sys id CAMPRO gs cod csub
  • AI引擎助力,CamScanner智能高清滤镜开启扫描新纪元!

    文章目录 写在前面 突破图像处理难点 扫描全能王的独特优势 耳听为虚 眼见为实 产品背后的主要核心 AI Scan助力 深度学习助力智能文档处理的国际化进程 品味智能文档处理的轻松与精准 写在前面 在数字化快速发展的今天 我们时常会遇到需要
  • 产品经理漫谈四

    每几天一篇 业界学习知识分享 请关注 如有同感请加vip阅读 产品经理如何给足一线 渠道 区域销售足够信心 思考 人性 商业 利益共同体 尊重时效 尊重承诺 价值方向 行业动态符合 具有更大兼容性 服务体系建立 笔者认为 除了产品包含市场方
  • 芯片验证从零开始系列(三)——SystemVerilog的连接设计和测试平台

    芯片验证从零开始系列 三 SystemVerilog的连接设计和测试平台 接口interface modport 验证环境结构 激励发生器 监测器 检测器 测试平台和设计间的竞争原因 断言 总结 声明 未经作者允许 禁止转载 推荐一个IC
  • AD域服务器下如何批量创建用户及修改AD域的最大返回条目数。

    最近在用户现场遇到一个问题就是通过ldap导入用户 发现导入失败 经过分析得知是AD域服务器设置的最大返回条目数默认为1000 当数据超过1000 通过ldap search s获取数据时就会异常 通过抓包分析得知是 报文回复不全导致无法解
  • 史上最全 App功能测试点分析

    1 2测试周期 测试周期可按项目的开发周期来确定测试时间 一般测试时间为两三周 即 15个工作日 根据项目情况以及版本质量可适当缩短或延长测试时间 正式测试前先向主管确认项目排期 1 3测试资源 测试任务开始前 检查各项测试资源 产品功能需
  • [k8s]笔记01

    1 k8s是什么 k8s是一套自动化容器运维的开源平台 2 k8s可以做什么 能在物理机或虚拟集群上调度和运行程序容器 快速精准地部署应用程序 即时伸缩应用程序 无缝展现新特征 限制硬件用量仅为所需资源 3 k8s概念 1 Cluster集
  • java8新特性从入门到应用 第二章 Streams数据流

    java8新特性从入门到应用 第二章 Stream 数据流 特点介绍 Stream组成 源 中间操作 筛选与切片 映射 排序 Stream的终止操作 查找与匹配 归约 收集 Collector 接口API 此流非彼流 估计第一眼看到这个标题
  • springboot定时任务出错 Unexpected use of scheduler.

    最近在使用springboot的定时器写定时任务时 项目启动就会报以下的错误 java lang IllegalStateException Unexpected use of scheduler 困扰了很久 因为以前也写过定时器 但没遇到
  • 北大硕士7年嵌入式学习经验分享

    大家现在状态是怎么样的 这几年技术进步怎么样 职场晋升 管理水平有没有提升 欢迎留言 本文内容来自于知乎 觉得内容很不错 分享给大家 下文的我代表的是原作者 作者 梦人亦冷 链接 https www zhihu com question 3
  • ip地址0.0.0.0与127.0.0.1的区别

    最近在项目开发中发现一个奇怪的问题 当服务器与客户端在同一台机器上时 用服务器ip 本地主机ip 192 168 1 xxx 127 0 0 1以及0 0 0 0都能登陆服务器 于是找点资料研究一下 其实 最开始是发现服务器ip填0能登陆成
  • MyBatis框架搭建及教程(详解)

    MyBatis文章目录 Mybatis框架的搭建以及使用教程 目录 简介 一 MyBatis框架搭建步骤 1 1 配置XML 1 2 编写MyBatis框架核心配置文件 1 3 创建实体类 1 4 创建Mapper接口 1 5 创建SQL映
  • doesnt exist table_MYSQL ERROR 1146 Table doesnt exist 解析

    原创转载请注明出处 源码版本 5 7 14 在MYSQL使用innodb的时候我们有时候会看到如下报错 ERROR 1146 42S02 Table test test1bak doesn t exist 首先总结下原因 缺少frm文件 i
  • Mybatis映射文件中动态sql语句

    目录 Mybatis映射文件深入 动态sql语句 官方文档中动态sql 动态SQL之if 测试示例if 动态sql之foreach 测试示例foreach sql片段的抽取 Mybatis映射文件深入知识小结 Mybatis映射文件深入 动