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

作者:程序猿小白菜 时间:2021-05-25 13:05:27 

前言

如果你有使用 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 + &lsquo;.&rsquo; + id

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

paramMap为参数,paramMap.put(&ldquo;field1Value&rdquo;,&ldquo;abc&rdquo;),paramMap.put(&ldquo;field2Value&rdquo;,&ldquo;efg&rdquo;),

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;
}
}

来源:https://blog.csdn.net/zhu719224032/article/details/122318123

标签:mybatis,动态sql,接口
0
投稿

猜你喜欢

  • SpringBoot AOP控制Redis自动缓存和更新的示例

    2023-08-31 17:34:37
  • Android Studio导入jar包过程详解

    2023-01-02 08:04:51
  • android仿直播圆点加载效果

    2023-11-13 07:11:10
  • 全面了解java基本类型和封装类型的区别及应用

    2022-10-03 05:39:09
  • c# 线程定时器 System.Threading.Timer的使用

    2022-07-08 01:28:09
  • 花样使用Handler与源码分析

    2023-07-30 08:36:31
  • 一篇文章带你初步认识Maven

    2023-08-31 01:56:14
  • Android 如何实现动态申请权限

    2023-07-30 00:51:31
  • Android仿XListView支持下拉刷新和上划加载更多的自定义RecyclerView

    2023-04-26 12:46:02
  • Android手机闹钟服务AlarmManagerk开发案例

    2023-05-21 14:15:28
  • C#操作注册表之RegistryKey类

    2022-12-11 06:12:53
  • java简单实现多线程及线程池实例详解

    2023-05-12 05:47:04
  • Android深入浅出之Binder机制

    2021-07-06 01:47:21
  • SpringBoot实现过滤器、拦截器与切片的实现和区别

    2023-04-28 22:51:04
  • 使用SpringBoot+EasyExcel+Vue实现excel表格的导入和导出详解

    2023-07-18 18:15:14
  • Cocos2d-x 3.0多线程异步加载资源实例

    2022-02-08 03:26:51
  • C#实现类似新浪微博长URL转短地址的方法

    2023-06-02 12:59:28
  • springboot+springmvc实现登录拦截

    2023-04-26 19:23:26
  • Java数组越界问题实例解析

    2023-10-25 18:16:23
  • Java全排列算法字典序下的下一个排列讲解

    2023-07-30 17:44:39
  • asp之家 软件编程 m.aspxhome.com