(三)MyBatis学习笔记——动态SQL语句

MyBatis 学习笔记(三) 动态SQL语句 | trim标签、foreach标签、choose标签 | MyBatis缓存机制 | MyBatis 逆向工程使用案例 文章目录参考资料运行环境获取Demo一、MyBatis 动态 SQL1.1 if 标签1.2 where 标签1.3 set 标签1.4 trim 标签1.5 foreach 标签1.5.1 List 类型1.5.2 Map 类型1.6 choose 标签二、MyBatis 缓存机制2.1 一级缓存2.2 二级缓存2.3 第三方二级缓存三、MyBatis逆向工程3.1 使用案例3.2 查询测试 参考资料 SPOC 还有一些参考的文章,都有在相应部分标注。 运行环境 windows10 IDEA 202 阅读详情

一、案例测试:不使用动态SQL语句

如果需要使用带有复杂参数的SQL语句,比如条件查询语句,需要怎样实现呢?例如,现在需要根据sid、name、age三个字段进行查询记录。

  1. 首先在映射配置文件中建立查询语句:
<!--多条件查询-->
<select id="selectCondition" resultType="student" parameterType="student">
    SELECT * FROM student WHERE sid=#{sid} AND name=#{name} AND age=#{age}
</select>
  1. 然后在StudentService.class定义条件查询接口,在StudentServiceImpl.class中编写条件查询的代码:
//动态SQL的实现--条件查询
    @Override
    public List<Student> selectCondition(Student student) {
        List<Student> list = null;
        SqlSession sqlSession = null;
        InputStream is = null;
        try {
            //1.加载核心配置文件
            is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //2.获取到SqlSession工厂对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //3.通过工厂对象获取到SqlSession对象
            sqlSession = sqlSessionFactory.openSession(true);
            //4.获取StudentMapper接口的实现类对象
            StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);//等同于:StudentMapper studentMapper = new StudentMapperImpl();

            //5.通过实现类对象调用方法,接收结果
            list = studentMapper.selectCondition(student);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //6.释放资源
            if(sqlSession != null) {
                sqlSession.close();
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //7.返回结果
        return list;
    }
  1. 控制层测试功能:
//条件查询功能
    @Test
    public void selectCondition(){
        //创建Student对象,设置查询条件
        Student stuTmp = new Student();
        stuTmp.setSid(2);
        stuTmp.setName("小乙");
        stuTmp.setAge(24);
        List<Student> students = service.selectCondition(stuTmp);
        for (Student stu : students) System.out.println(stu);
    }
  1. 结果:此时可以查询到该条记录。但将setSid、setName、setAge中任意一条去掉,即sid、name、age三个参数缺少任意一个,则不能查询到此记录。如果想这三个参数不管传入几个,都能执行查询语句呢?例如,只传入sid,就根据sid查询;传入了sid和age就根据这两个字段查。

二、动态SQL语句

动态SQL根据实体类的不同取值,可以使用不同的SQL语句进行查询。主要用到的标签有如下:

  • <where> 用于替换WHERE条件之后的语句
  • <if>
    <if test="条件判断">
    	查询条件拼接
    </if>
    
  • <foreach>
    <foreach collection="参数容器类型(list、array)" open="开始SQL语句" close="结束SQL语句" item="参数变量名" separator="分隔符">
    	获取参数
    </foreach>
    

1.< if>标签使用案例

将第一步中的映射文件中的条件查询语句更改为如下:

<!--多条件查询-->
    <select id="selectCondition" resultType="student" parameterType="student">
        SELECT * FROM student
        <where>
            <if test="sid != null">
                sid=#{sid}
            </if>
            <if test="name != null">
                AND name=#{name}
            </if>
            <if test="age != null">
                AND age=#{age}
            </if>
        </where>
    </select>

此时不管通过sid、name、age中的一个或多个字段都能查询到该记录。

2.< foreach>标签使用案例

  1. 首先在映射配置文件中建立查询语句:
    <select id="selectByIds" resultType="student" parameterType="list">
        SELECT * FROM student
        <where>
            <foreach collection="list" open="sid IN(" close=")" item="sid" separator=",">
                #{sid}
            </foreach>
        </where>
    </select>
  1. 然后在StudentService.class定义条件查询接口,在StudentServiceImpl.class中编写条件查询的代码:
//根据多个查询有无其中一个
    @Override
    public List<Student> selectByIds(List<Integer> idList) {
        List<Student> list = null;
        SqlSession sqlSession = null;
        InputStream is = null;
        try {
            //1.加载核心配置文件
            is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //2.获取到SqlSession工厂对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //3.通过工厂对象获取到SqlSession对象
            sqlSession = sqlSessionFactory.openSession(true);
            //4.获取StudentMapper接口的实现类对象
            StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);//等同于:StudentMapper studentMapper = new StudentMapperImpl();

            //5.通过实现类对象调用方法,接收结果
            list = studentMapper.selectByIds(idList);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //6.释放资源
            if(sqlSession != null) {
                sqlSession.close();
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //7.返回结果
        return list;
    }
  1. 最后在控制层中测试:
//根据多个查询有无其中一个
    @Test
    public void selectByIds(){
        //创建idList,设置查询条件
        List<Integer> idList = new ArrayList<>();
        idList.add(1);
        idList.add(2);
        List<Student> students = service.selectByIds(idList);
        for (Student stu : students) System.out.println(stu);
    }

此时可查询到在list中存在的sid的记录。

三、常用SQL语句抽取

像SELECT * FROM这种SQL语句使用较为频繁,所以可以将其进行抽取,以便于后续复用。这里使用<sql>标签:

<sql id="SQL语句唯一标识"> 抽取的SQL语句 </sql>

通过<include>标签引入定义的SQL语句:

<include refid="SQL语句唯一标识" />

例如,在上一步的<foreach>标签使用时可以使用:

	<sql id="select0"> SELECT * FROM student </sql>

    <select id="selectByIds" resultType="student" parameterType="list">
        <include refid="select0"/>
        <where>
            <foreach collection="list" open="sid IN(" close=")" item="sid" separator=",">
                #{sid}
            </foreach>
        </where>
    </select>
MyBatis:动态sql语句 ​ Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。参考的官方文档,描述如下: 官网地址:https://mybatis.org/mybatis-3/zh/dynamic-sql.html我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。 阅读详情

相关推荐

MediaPipe实战:从零构建人脸关键点检测应用

本文详细介绍了如何使用Google的MediaPipe框架从零构建一个实时人脸关键点检测应用。文章深入剖析了MediaPipe的三段式检测流水线,提供了Android平台的完整实战教程,包括环境配置、模型加载、摄像头集成、关键点绘制以及性能调优指南,帮助开发者快速实现高效、跨平台的人脸AR特效与交互功能。

weixin_29100927的博客 341

Mybatis学习笔记-三、动态SQL dynamic-sql

3.6 动态SQL dynamic-sql 有时候,静态的SQL语句并不能满足应用程序的需求。我们可以根据一些条件,来动态地构建 SQL语句。 例如,在Web应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后根据这些已选择的条件去执行检索操作。 在实现这种类型的搜索功能,我们可能需要根据这些条件来构建动态的SQL语句。如果用户提供了任何输入条件, 我们需要将那个条件添加到SQL语句的...

weixin_34755758的博客 1746

拯救者Y9000P 2022双系统实战:Ubuntu22.04分区优化与驱动避坑指南

本文提供联想拯救者Y9000P 2022款安装Ubuntu 22.04双系统的详细实战指南。重点讲解针对该机型的磁盘分区优化方案、NVIDIA显卡驱动安装避坑技巧,以及安装后的网络、时间同步等必备配置,帮助用户高效完成双系统部署并提升使用体验。

weixin_29208327的博客 422

Mybatis学习笔记(三)动态SQL标签详解

文章目录1、基本环境搭建2、动态SQL——if标签 1、基本环境搭建 建立数据库 建表语句 CREATE TABLE `t_teacher` ( `id` int(11) NOT NULL AUTO_INCREMENT, `teacherName` varchar(100) DEFAULT NULL, `class_name` varchar(100) DEFAULT NULL, `address` varchar(100) DEFAULT NULL, `birth_date` dat

Code皮皮虾的博客 690

Postman调试海康ISAPI接口全记录:从鉴权失败到成功修改设备名的踩坑指南

本文详细记录了使用Postman调试海康ISAPI接口的全过程,从鉴权失败到成功修改设备名的实战经验。涵盖Digest认证机制、XML请求体构造、常见错误排查及代码实现过渡,帮助开发者高效解决海康设备集成中的各种问题。

weixin_42620913的博客 660

【Clickhouse从入门到精通】第60篇:ClickHouse生态总结与未来展望

ClickHouse系列收官总结 本文作为《ClickHouse从入门到精通》系列的第60篇收官之作,系统回顾了整个系列的知识体系。文章从基础概念到高级应用,全面梳理了ClickHouse的核心技术: 知识体系:完整回顾了60篇文章的知识图谱,包括列式存储原理、MergeTree引擎家族、分布式架构等核心内容 生态工具:详细盘点了ClickHouse的企业版工具、运维监控、数据集成和可视化方案 版本演进:分析了从21.x到24.x的主要版本特性升级 未来趋势:展望了向量化引擎、湖仓一体、AI集成等发展方向

xyghehehehe的专栏 439

MyBatis学习笔记(三)动态Sql、缓存、MyBatis逆向工程、分页插件

MyBatis

weixin_43174141的博客 767

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 115

mybatis 学习笔记(三)动态SQL

[size=medium]MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。主要标签有[/size] [size=medium] if choose(when,otherwise) trim where set foreach [/size] [size=medium] (一)if就是简单的条件判断语句 例如下代码 [/...

三百亩 155

《多模态融合改进》支持目标检测、目标分割、OBB、姿态估计,配置教程

本文以为例,讲解如何配置,支持替换专栏里所有的改进方式。

Limiiiing的博客 795

Transformer模型在时间序列预测中的应用:价格和产量预测

Transformer模型由Attention is All You Need论文提出,并在机器翻译任务上取得了巨大成功。其主要特点是使用自注意力机制代替传统的递归或卷积操作进行序列建模。Transformer模型由编码器和解码器组成,其中编码器用于学习输入序列的表示,解码器用于生成目标序列。在时间序列预测中,我们只需要使用Transformer的编码器部分。编码器将历史数据作为输入,学习一个表示,然后使用该表示来预测未来的数值。

HnrzLinux的博客 736

mybatis学习笔记(三) 动态sql

在mybatis的映射文件中有如下一些标签可以使用 if , chose , where ,set , foreach , trim , include , 使用这些标签 可以帮助我们动态的生成sql 用法实例 select from `user` user_name = #{userName}

is_zhoufeng的专栏 1916

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Mybatis学习笔记(三)别名、sql与include标签、动态SQL查询、动态SQL修改、增、删、改

一、别名 位置:在主配置文件中 作用:可以在映射文件的 任何拥有 parameterType 和 resultType 属性的标签中引用 二、sql与include标签 sql标签 位置:在映射文件中 作用:可以存放多条SQL语句中重复的部分(一般用于存放重复的多个列名) include标签 位置:在映射文件中的任意标签中 作用:引用SQL标签中的内容 三、动态SQL查询 依赖于where标...

qq_43701801的博客 1607

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Mybatis 动态 SQL 语句大全

动态 SQL 语句大全

北执南念的博客 4692

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Mybatis动态SQL语句大全

Mybatis动态SQL语句大全

小学生波波 2642

关于‘ Mybatis中的动态SQL语句 ‘解析

MyBatis中的动态SQL是一种可以根据不同条件生成不同SQL语句的技术。它允许我们在映射文件中编写灵活的SQL语句,以便根据参数的不同情况来动态生成SQL语句。这种灵活性使得我们能够根据应用程序的需求来构建动态的查询语句。

weixin_73412838的博客 3337

Mybatis的动态SQL语句

Mybatis的动态SQL语句项目目录动态 SQL 之if标签持久层 Dao 接口持久层 Dao 映射配置测试代码动态 SQL 之where标签持久层 Dao 映射配置动态 SQL 之foreach标签需求在 QueryVo 中加入一个 List 集合用于封装参数持久层 Dao 接口持久层 Dao 映射配置测试代码Mybatis中简化编写的 SQL 片段定义代码片段引用代码片段 项目目录 动态 SQL 之if标签 持久层 Dao 接口 /** * 根据传入的参数条件 * @param user 查询的

『愚』的博客 3935

mybatis强大的动态SQL

我们可以将一些重复性的 SQL 语句进行抽取,以达到复用的效果。:抽取 SQL 语句标签。:引入 SQL 片段标签。抽取的 SQL 语句三、多条件组合查询之<where-if>我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。:条件标签。如果有动态条件,则使用该标签代替 where 关键字。:条件判断标签。查询条件拼接。

2501_90401192的博客 1636

MyBatis中动态sql语句标签详解

动态 SQL 通常写在mapper包下面的地址映射配置文件(.xml)中。根据条件的不同, SQL 语句也会随之动态的改变. MyBatis 中,提供了一组标签用于实现动态 SQL. 动态SQL语句标签包括以下标签: where…if… 标签 choose…when…otherwise… 标签 set…if 标签 trim 标签 bind 标签 foreach 标签 inclu...

时间静止 4852

MyBatis学习 之 三、动态SQL语句

目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose when otherwise foreach 参数为array示例的写法 参数为list示例的写法 三、动态SQL语句 MyBatis学习 之 一、MyBatis简介与配置...

huidaoli 1553

mybatis动态生成sql语句

在Java代码中,我们通过来调用Mapper文件中定义的deleteById删除方法,并传递id = 59。MyBatis会将59替换到的SQL语句中,生成最终的SQL语句并执行,最终删除t_car表中id为59的记录。

gege_0606的博客 2179

Mybatis中动态SQL语句

类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。而使用if标签时,只要test中的表达式为true,就会执行if标签中的条件。foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。参数含义:index为数组的下标,item为数组每个元素的名称,名称随意,open循环开始,close循环结束,separator中间分隔输出。

weixin_47276069的博客 1519

Mybatis中动态SQL语句执行的各类标签详解

Mybatis在进行多条件查询时,需要考虑什么时候要把条件加入,什么时候不需要将条件加入Mybatis框架的动态SQL技术是。

qq_60003707的博客 1195

mybatis 动态SQL语句

动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句.官网描述:MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。

redemption_2的博客 1134

Mybatis之动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。 利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQ...

JustinNeil的博客 1万+
上一篇: (二)MyBatis学习笔记——实现Dao层的不同方式
下一篇: OJ ACM模式常见输入输出代码(牛客练习)
MegaBytes
博客等级 码龄8年 45粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值