当前位置:首页 » 编程语言 » mybatis的动态sql语句

mybatis的动态sql语句

发布时间: 2025-07-02 10:56:51

㈠ MyBatis 动态sql where/if/choose/bind介绍

面对复杂的SQL拼接问题,MyBatis 动态SQL功能显得尤为重要。它通过一系列如if, choose, when, otherwise, trim, where, set, foreach等标签,实现了SQL语句的灵活构建,确保了准确性和开发效率的提升。

首先,where+if标签用于处理多参数的条件判断。例如,当第二个参数为空时,它会自动处理条件语句,避免了不必要的空值影响。在单参数传递时,它确保了SQL的完整性。

其次,where+choose标签类似于Java的switch语句,允许根据给定的条件选择执行特定的查询条件,只需满足其中一个条件即可,实现了查询逻辑的灵活切换。

而在处理多个参数时,choose标签会执行第一个满足条件的部分,后续条件将被忽略,这与Java的短路逻辑类似。

最后,where+bind标签则是绑定OGNL表达式的值到变量,特别适合在模糊查询中,提供方便的变量引用,简化了查询语句的编写。

总结起来,MyBatis的动态SQL提供了强大的条件控制和变量绑定功能,使得复杂的SQL构建变得直观且易于管理,极大地提高了开发效率。

㈡ Mybatis 动态sql语句if标签和where标签结合巧妙使用

在Mybatis中,动态SQL的if标签和where标签可以巧妙地结合,以实现灵活的查询条件。假设我们的需求是根据电话和名字查找用户数据。

初始的SQL查询可能看起来像这样:

SELECT * FROM users WHERE mobile LIKE '%{mobile}' AND gender = #{gender}

在Mapper.xml文件中,配置的动态SQL如下:

<select id="getUserByPhoneName">
SELECT * FROM users
<choose>
<when test="gender != null">
AND gender = #{gender}
</when>
<otherwise>
-- 如果gender未传,则不添加此条件
</otherwise>
</choose>
AND mobile LIKE #{mobile}
</select>

在代码块2-2中,我们对性别条件进行了改进,使用if标签来判断,仅当gender为0或1时执行查询,代码如下:

<if test="gender != null">
AND gender = #{gender}
</if>

如果要查询所有用户信息而不指定gender和username,可以修改代码块2-3,移除if标签:

<!-- 移除if标签 -->
AND mobile LIKE #{mobile}

总结,通过结合if标签,我们可以灵活地根据传入的参数动态调整SQL查询条件。这在处理不同场景下的用户查询时显得尤其有用。

㈢ Mybatis Plus是如何实现动态SQL语句的原理你懂吗

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,开发就不需要再写xml了,直接调用这些方法就行,就类似于JPA。

那么这篇文章就来阅读以下MP的具体实现,看看是怎样实现这些增强的。

入口类:

通过在入口类 #build方法中, 在应用启动时, 将MyBatis plus(简称MP)自定义的动态配置xml文件注入到Mybatis中。

{publicSqlSessionFactorybuild(Configurationconfiguration){//...省略若干行if(globalConfig.isEnableSqlRunner()){newSqlRunnerInjector().inject(configuration);}//...省略若干行returnsqlSessionFactory;}}

这里涉及到2个MP2个功能类

扩展继承自Mybatis的MybatisConfiguration类: MP动态脚本构建,注册,及其它逻辑判断。

SqlRunnerInjector: MP默认插入一些动态方法的xml 脚本方法。

MybatisConfiguration类

这里我们重点剖析MybatisConfiguration类,在MybatisConfiguration中,MP初始化了其自身的MybatisMapperRegistry,而MybatisMapperRegistry是MP加载自定义的SQL方法的注册器。

MybatisConfiguration中很多方法是使用MybatisMapperRegistry进行重写实现

其中有3个重载方法addMapper实现了注册MP动态脚本的功能。

{/***Mapper注册*/=newMybatisMapperRegistry(this);//..../***初始化调用*/publicMybatisConfiguration(){super();this.mapUnderscoreToCamelCase=true;languageRegistry.setDefaultDriverClass(MybatisXMLLanguageDriver.class);}/***MybatisPlus加载SQL顺序:*<p>1、加载XML中的SQL</p>*<p>2、加载SqlProvider中的SQL</p>*<p>3、XmlSql与SqlProvider不能包含相同的SQL</p>*<p>调整后的SQL优先级:XmlSql>sqlProvider>CurdSql</p>*/@(MappedStatementms){//...}//...省略若干行/***使用自己的MybatisMapperRegistry*/@Overridepublic<T>voidaddMapper(Class<T>type){mybatisMapperRegistry.addMapper(type);}//....省略若干行}

在MybatisMapperRegistry中,MP将mybatis的MapperAnnotationBuilder替换为MP自己的

{@Overridepublic<T>voidaddMapper(Class<T>type){//...省略若干行parser=new(config,type);parser.parse();//...省略若干行}}

在MybatisMapperRegistry类的addMapper方法中,真正进入到MP的核心类,这个类是MP实现动态脚本的关键类。

动态构造

在MP的核心类的parser方法中,MP逐一遍历要加载的Mapper类,加载的方法包括下面几个

{@Overridepublicvoidparse(){//...省略若干行for(Methodmethod:type.getMethods()){/**for循环代码,MP判断method方法是否是@Select@Insert等mybatis注解方法**/parseStatement(method);InterceptorIgnoreHelper.initSqlParserInfoCache(cache,mapperName,method);SqlParserHelper.initSqlParserInfoCache(mapperName,method);}/**这2行代码,MP注入默认的方法列表**/if(GlobalConfigUtils.isSupperMapperChildren(configuration,type)){GlobalConfigUtils.getSqlInjector(configuration).inspectInject(assistant,type);}//...省略若干行}@(,Class<?>mapperClass){Class<?>modelClass=extractModelClass(mapperClass);//...省略若干行List<AbstractMethod>methodList=this.getMethodList(mapperClass);TableInfotableInfo=TableInfoHelper.initTableInfo(builderAssistant,modelClass);//循环注入自定义方法methodList.forEach(m->m.inject(builderAssistant,mapperClass,modelClass,tableInfo));mapperRegistryCache.add(className);}}{@OverridepublicList<AbstractMethod>getMethodList(Class<?>mapperClass){returnStream.of(newInsert(),//...省略若干行newSelectPage()).collect(toList());}}

在中,MP真正将框架自定义的动态SQL语句注册到Mybatis引擎中。而AbstractMethod则履行了具体方法的SQL语句构造。

具体的AbstractMethod实例类,构造具体的方法SQL语句

以 SelectById 这个类为例说明下

/***根据ID查询一条数据*/{@(Class<?>mapperClass,Class<?>modelClass,TableInfotableInfo){/**定义mybatisxmlmethodid,对应<id="xyz">**/SqlMethodsqlMethod=SqlMethod.SELECT_BY_ID;/**构造id对应的具体xml片段**/SqlSourcesqlSource=newRawSqlSource(configuration,String.format(sqlMethod.getSql(),sqlSelectColumns(tableInfo,false),tableInfo.getTableName(),tableInfo.getKeyColumn(),tableInfo.getKeyProperty(),tableInfo.getLogicDeleteSql(true,true)),Object.class);/**将xmlmethod方法添加到mybatis的MappedStatement中**/returnthis.(mapperClass,getMethod(sqlMethod),sqlSource,tableInfo);}}

至此,MP完成了在启动时加载自定义的方法xml配置的过程,后面的就是mybatis ${变量} #{变量}的动态替换和预编译,已经进入mybatis自有功能。

总结一下

MP总共改写和替换了mybatis的十多个类,主要如下图所示:

总体上来说,MP实现mybatis的增强,手段略显繁琐和不够直观,其实根据构造出自定义方法的xml文件,将其转换为mybatis的Resource资源,可以只继承重写一个Mybatis类:SqlSessionFactoryBean 比如如下:

entsApplicationContextAware{privateResource[]mapperLocations;@(Resource...mapperLocations){super.setMapperLocations(mapperLocations);/**暂存使用mybatis原生定义的mapperxml文件路径**/this.mapperLocations=mapperLocations;}/***{@inheritDoc}*/@()throwsException{=getBeanFactory();/**只需要通过将自定义的方法构造成xmlresource和原生定义的Resource一起注入到mybatis中即可,这样就可以实现MP的自定义动态SQL和原生SQL的共生关系**/this.setMapperLocations(InjectMapper.getMapperResource(this.dbType,beanFactory,this.mapperLocations));super.afterPropertiesSet();}}

在这边文章中,简单介绍了MP实现动态语句的实现过程,并且给出一个可能的更便捷方法。

来源:juejin.cn/post/6883081187103866894

㈣ MyBatis动态SQL标签的用法

MyBatis动态SQL标签的用法主要包括以下几个核心元素

  1. if标签

    • 用途:用于在SQL语句中添加条件判断。
    • 功能:根据条件表达式的真假,决定是否包含某段SQL代码。
  2. choose标签

    • 用途:类似于Java中的switch语句,用于在多个条件中选择一个执行。
    • 功能:包含一个或多个when标签和一个可选的otherwise标签,当某个when标签的条件满足时,执行对应的SQL代码。
  3. where标签

    • 用途:用于自动处理SQL中的where条件语句。
    • 功能:能够智能地添加条件,同时自动处理逻辑和空格,避免生成语法错误的SQL。
  4. set标签

    • 用途:在更新操作中,用于添加或修改条件。
    • 功能:与where标签类似,能够智能地处理更新语句中的set部分,自动添加逗号等符号。
  5. foreach标签

    • 用途:用于处理集合数据,循环执行SQL语句。
    • 功能:能够遍历集合中的元素,生成相应的SQL代码,常用于处理IN查询或批量插入/更新操作。
  6. trim标签

    • 用途:允许在SQL内容前后添加前缀和后缀,或忽略某些特定部分。
    • 功能:提供了强大的格式化和定制功能,通过prefix、suffix、prefixOverrides和suffixOverrides等属性来控制SQL代码的格式。

这些动态SQL标签为编写高效且灵活的SQL提供了强大工具,使得在编写SQL时能够更加智能化和灵活地处理复杂逻辑和数据处理需求。

㈤ Mybatis Plus 实现动态SQL语句的原理

Mybatis Plus 实现动态SQL语句的原理主要基于以下几个关键点:

**1. 入口类与自定义配置 的build方法:在应用启动时,Mybatis Plus通过的build方法动态注入其自定义配置XML文件到Mybatis中。

**2. 关键功能类 MybatisConfiguration:扩展自Mybatis的MybatisConfiguration类主要负责动态脚本的构建、注册和逻辑判断。它初始化了MybatisMapperRegistry,该注册器负责加载自定义SQL方法。 SqlRunnerInjector:负责添加Mybatis Plus特有的动态方法的XML脚本。

**3. 核心解析类 :这是Mybatis Plus的核心类,它在解析Mapper类时动态构造SQL语句。例如,对于SelectById这样的操作,Mybatis MapperAnnotationBuilder会根据注解或配置动态生成相应的SQL语句。

**4. 重写与替换 Mybatis Plus对Mybatis的十多个类进行了重写和替换,包括Mybatis的MapperAnnotationBuilder和处理动态SQL的逻辑。这种重写和替换使得Mybatis Plus能够在Mybatis的基础上实现更高级的功能,如无需XML配置即可进行CRUD操作。

**5. 配置与扩展 通过一系列的配置和扩展,Mybatis Plus实现了无XML的CRUD操作,极大地提升了开发效率。虽然实现过程相对繁琐,但最终的结果是开发者可以更加便捷地使用Mybatis进行数据库操作。

综上所述,Mybatis Plus通过入口类的自定义配置、关键功能类的扩展、核心解析类的动态构造、对Mybatis类的重写与替换以及一系列的配置与扩展,实现了动态SQL语句的生成与注册。

热点内容
日本溥仪访问 发布:2025-07-03 04:24:27 浏览:672
java文件遍历 发布:2025-07-03 04:22:22 浏览:140
android画虚线 发布:2025-07-03 04:11:04 浏览:384
系统启动密码怎么取消 发布:2025-07-03 04:08:06 浏览:746
python程序设计第三版课后答案 发布:2025-07-03 03:58:08 浏览:213
socket上传文件 发布:2025-07-03 03:57:24 浏览:895
安卓cleo脚本 发布:2025-07-03 03:41:26 浏览:245
编程器解读 发布:2025-07-03 03:22:49 浏览:24
中国电信加密通信业务 发布:2025-07-03 03:06:00 浏览:521
脚本家的台词 发布:2025-07-03 03:05:50 浏览:710