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

网友投稿 933 2022-09-04


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

目录前言1、编写xml: SqlGenarate.mapper.xml2、定义接口3、实现接口总结

前言

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

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

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

1、编写xml: SqlGenarate.mapper.xml

SELECT

a,

b

FROM

`table_name`

WHERE

field1 = #{field1Value} AND field2 = #{field2Value}

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 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 paramMap) {

//获取执行sql

Configuration con = sqlSessionFactory.getConfiguration();

//传xmxaPEll文件中的 需要执行的id编号,如: com.jason.bi.data.sql.generate.getSql

MappedStatement s = con.getMappedStatement(sqlId);

BoundSql bSql = s.getBoundSql(paramMap);

//获取到sql中封装的参数的数量

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

}

}

总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python:正则表达式re模块(菜鸟教程 python 正则表达式)
下一篇:Python使用Redis实现IP代理池(python多线程使用ip代理池)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~