利用Java如何获取Mybatis动态生成的sql接口实现
作者:程序猿小白菜 发布时间:2021-05-25 13:05:27
标签: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;
}
}
来源:https://blog.csdn.net/zhu719224032/article/details/122318123


猜你喜欢
- 本文实例为大家分享了C#实现餐厅管理系统的具体代码,供大家参考,具体内容如下部分代码:fm_change_password.csusing
- selectMaps和selectList的区别selectList查询部分字段,会返回所有的,没查询的值为nullselectMaps 只
- 一、题目给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑
- Java的static关键字和C/C++语言的关键字有所不同:一旦在Java里使用了static关键字,那么这样的内容不再属于对象自己,而是
- 在System.Text.RegularExpression命名空间里,有正则表达式方法。using System.Collections.
- 这篇文章主要介绍了java property配置文件管理工具框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 概要集合概念:像数组一样是java的一个容器;和数组不同的是数组只能存同类型的数据,且长度定义之后就不可变,集合不仅,可以存多种类型的数据,
- 前言最近和前端联调接口,需要进行一个省市区联动,最终定的方案是通过接口返回一个树形结构给前端,类似这样的结构:下面就把相关表和代码分享给大家
- 相同点:二者都是Java的虚拟机,用来执行Java程序区别:javaw.exe运行程序时不会输出控制台信息,如果是双击打开jar文件的话(假
- 1.场景介绍:开发过程中我们经常性的会用到许多的中间表,用于数据之间的对应和关联.这个时候我们关联最多的就是ID,我们在一张表中插入数据后级
- 有时,类或方法需要对类型变量加以约束。下面是一个典型的例子,我们要寻找数组中的最小元素:public class ArrayAlg { &n
- 本文实例为大家分享了java实现简易飞机大战的具体代码,供大家参考,具体内容如下整体思路1.创建游戏窗体,添加面板JPanel,重写JPan
- 面试题:1同步方法和同步块,哪种更好?2.如果同步块内的线程抛出异常会发生什么?1. 同步方法和同步块,哪种更好?同步块更好,这意味着同步块
- 目录Bitmap类BitmapData类参考:Bitmap类Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组
- MapperScan添加动态配置(占位符)在对Mybatis自动扫描配置中,使用注解配置时,@MapperScan中的配置,通常配置如下:@
- 前言在一个 Web 请求中,参数我们无非就是放在地址栏或者请求体中,个别请求可能放在请求头中。放在地址栏中,我们可以通过如下方式获取参数:S
- 概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:1、若它的左子树不为空,则左子树上所有节点的值都小于根结点的值。
- 删除本地仓库未下载完成的缓存文件(删除像图片显示这样以.lastUpdated结尾的文件)执行mvn -v确保maven命令可以正常执行执行
- 本文实例为大家分享了Android SQLite数据库连接实现登录功能的具体代码,供大家参考,具体内容如下布局文件border.xml<
- 前言循环语句为众多程序员们提供了很大的便利,有while、do...while、for和 foreach。而且foreach语句很简洁,但是