利用Java如何获取Mybatis动态生成的sql接口实现

 更新时间:2022年01月07日 10:54:42   作者:程序猿小白菜  
MyBatis 的强大特性之一便是它的动态SQL,下面这篇文章主要给大家介绍了关于利用Java如何获取Mybatis动态生成的sql接口实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。

目的:利用mybatis动态生成sql的能力返回可执行的sql,但并不会执行。

场景:需要生成复杂的sql供其他程序执行

1、编写xml: SqlGenarate.mapper.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.jason.bi.data.sql.generate">

    <select id="getSql">
        SELECT
            a,
            b
        FROM
            `table_name`
        WHERE
            field1 = #{field1Value} AND field2 = #{field2Value}
    </select>

</mapper>

2、定义接口

import io.swagger.annotations.ApiOperation;

import java.util.Map;

/**
 * @author: jason
 * @Date: 2022-01-04
 */
public interface SqlService {

	@ApiOperation(value = "动态生成sql")
	String generate(String sqlId, Map<String, Object> paramMap);
}

3、实现接口

sqlId = namespace + ‘.’ + id

如SqlGenarate.mapper.xml中getSql对应的sqlId即为:com.jason.bi.data.sql.generate.getSql

paramMap为参数,paramMap.put(“field1Value”,“abc”),paramMap.put(“field2Value”,“efg”),

import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @author: jason
 * @Date: 2022-01-04
 */
@Service
public class SqlServiceImpl implements SqlService {
	@Autowired
	private SqlSessionFactory sqlSessionFactory;

	@Override
	public String generate(String sqlId, Map<String, Object> paramMap) {
		//获取执行sql
		Configuration con = sqlSessionFactory.getConfiguration();
		//传xml文件中的 需要执行的id编号,如: com.jason.bi.data.sql.generate.getSql
		MappedStatement s = con.getMappedStatement(sqlId);
		BoundSql bSql = s.getBoundSql(paramMap);
		//获取到sql中封装的参数的数量
		List<ParameterMapping> paramValues = bSql.getParameterMappings();
		return getExecuteSql(bSql.getSql(), paramValues, paramMap);
	}

	/**
	 * 生成可执行sql
	 *
	 * @param sql         获取的sql
	 * @param paramValues 动态参key
	 * @param map         动态参valur
	 * @return
	 */
	private String getExecuteSql(String sql, List<ParameterMapping> paramValues, Map map) {
		while (sql.indexOf("?") != -1 && paramValues.size() > 0) {
			String paramName = paramValues.get(0).getProperty();
			String paramValue = map.get(paramName).toString();
			String value = "";
			if (paramValue instanceof String) {
				value = "'" + paramValue + "'";
			}
			sql = sql.replaceFirst("\\?", value);
			paramValues.remove(0);
		}
		return sql;
	}
}

总结

到此这篇关于利用Java如何获取Mybatis动态生成sql接口实现的文章就介绍到这了,更多相关Java获取Mybatis动态生成sql接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot整合gateway的详细过程

    springboot整合gateway的详细过程

    本文介绍了如何配置和使用Spring Cloud Gateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要的朋友可以参考下
    2025-01-01
  • java中的 HashMap 的加载因子是0.75原理探讨

    java中的 HashMap 的加载因子是0.75原理探讨

    在Java中,HashMap是一种常用的数据结构,用于存储键值对,它的设计目标是提供高效的插入、查找和删除操作,在HashMap的实现中,加载因子(Load Factor)是一个重要的概念,本文将探讨为什么Java中的HashMap的加载因子被设置为0.75
    2023-10-10
  • 基于Jpa中ManyToMany和OneToMany的双向控制

    基于Jpa中ManyToMany和OneToMany的双向控制

    这篇文章主要介绍了Jpa中ManyToMany和OneToMany的双向控制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot实现前后端分离国际化的示例详解

    SpringBoot实现前后端分离国际化的示例详解

    Springboot国际化可以帮助使用者在不同语言环境中构建应用程序,这样应用程序可以有效地适应不同语言文化背景下的用户需求。本文主要介绍了SpringBoot实现前后端分离国际化的方法,需要的可以参考一下
    2023-02-02
  • 从try-with-resources到ThreadLocal,优化你的代码编写方式

    从try-with-resources到ThreadLocal,优化你的代码编写方式

    这篇文章主要为大家介绍了从try-with-resources到ThreadLocal,优化代码的编写方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java并发之CAS原理详解

    Java并发之CAS原理详解

    这篇文章主要为大家详细介绍了Java的CAS原理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 深入理解Java原生的序列化机制

    深入理解Java原生的序列化机制

    Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。下面小编和大家来一起学习一下吧
    2019-06-06
  • Mybatis实现单个和批量定义别名typeAliases

    Mybatis实现单个和批量定义别名typeAliases

    这篇文章主要介绍了Mybatis实现单个和批量定义别名typeAliases,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java使用CompletableFuture分批处理任务实现

    java使用CompletableFuture分批处理任务实现

    本文主要介绍了java使用CompletableFuture分批处理任务实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Java8深入学习之熟透Optional

    Java8深入学习之熟透Optional

    这篇文章主要给大家介绍了关于Java8深入学习之熟透Optional的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09

最新评论