MyBatis 之十:MyBatis 框架注解中的动态 SQL

2024-03-16 22:28

本文主要是介绍MyBatis 之十:MyBatis 框架注解中的动态 SQL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注解的动态SQL

注解中使用动态SQL ,可以通过使用的 script脚本来实现,(不推荐)

在 SQL 字符串中可以使用 MyBatis 的动态 SQL 元素(如 <if>、<choose>、<when>、<otherwise>、<foreach> 等),但需要将其包裹在 script 标签内。

在 MyBatis 中利用注解实现动态 SQL 查询,可以让代码更加简洁,

不过在处理复杂动态 SQL 时要注意可读性和维护性,必要时依然推荐结合或转向 XML 配置文件进行映射

@Update("<script>" +"update emp\n" +"        <set>\n" +"            <if test=\"salary!=null\">\n" +"                sal=#{salary},\n" +"            </if>\n" +"            <if test=\"deptno!=null\">\n" +"                deptno=#{deptno},\n" +"            </if>\n" +"            <if test=\"ename!=null\">\n" +"                ename=#{ename},\n" +"            </if>\n" +"            <if test=\"hiredate!=null\">\n" +"                hiredate=#{hiredate},\n" +"            </if>\n" +"        </set>\n" +"        where empno=#{empno}" +"</script>")
void update(Emp emp);

Provider 动态SQL

上面使用脚本实现动态SQL,效率低容易出错

框架针对动态SQL需求,提供了 Provider 来解决

@InsertProvider

@SelectProvide

@UpdateProvider

@DeleteProvider

实现多条件组合动态查询

第一步先定义Provider 类,完全自定义。

package com.wdzl.provider;import com.wdzl.pojo.Emp;
import org.apache.ibatis.jdbc.SQL;public class EmpProvider {/*** 之前的普通的拼接SQL的方式* @return*/public String getSearch(Emp emp){String sql = "select * from emp where 1=1";if(emp.getDeptno()!=null){sql += " and deptno=#{deptno}";}if(emp.getEname()!=null){sql += " and ename = #{deptno}";}if(emp.getSalary()!=null){sql += " and sal >= #{salary}";}return sql;}/*** 使用 SQL()*/public String getSQL(Emp emp){return new SQL(){{ //注意:下面代码是在匿名内部类的代码段中SELECT("empno,ename,sal,hiredate");  // select empno,ename,salary,hiredateFROM("emp");if(emp.getDeptno()!=null){WHERE("deptno=#{deptno}"); //默认为 and 条件}OR();                                   // 指定为 or 条件if(emp.getEname()!=null){WHERE("ename = #{deptno}");}if(emp.getSalary()!=null){WHERE("sal >= #{salary}");}//排序ORDER_BY("hiredate desc");}}.toString();}
}

注意:上面代码中两个不同的方法实现,对于外部调用者来说,都是调用方法传入对象,返回字符串的SQL所以使用哪一种方式都可以。

第二步通过注解调用

修改 IEmpDao 接口中查询的方法,使用注解来引用上面的类中的某一个方法

先看调用Provider 类中第一个方法:

@SelectProvider(type = EmpProvider.class,method = "getSearch")
List<Emp> queryByCondtion(Emp emp);

下面是调用 Provider 类中第二个方法

@SelectProvider(type = EmpProvider.class,method = "getSQL")
List<Emp> queryByCondtion(Emp emp);

直接调用接口,测试即可

这篇关于MyBatis 之十:MyBatis 框架注解中的动态 SQL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816909

相关文章

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

Spring Boot结成MyBatis-Plus最全配置指南

《SpringBoot结成MyBatis-Plus最全配置指南》本文主要介绍了SpringBoot结成MyBatis-Plus最全配置指南,包括依赖引入、配置数据源、Mapper扫描、基本CRUD操... 目录前言详细操作一.创建项目并引入相关依赖二.配置数据源信息三.编写相关代码查zsRArly询数据库数

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp