首先该功能可以通过拿mybatis底层的代码工具对象去改写,改造成我们仅需要的sql维护功能,可以大大美化我们的spark代码 或者 flink代码,
因为你不可能在代码里,埋一大堆恶心的字符串和换行符\\N +" " +。 不仅不美观,而且极其难以维护。 所以我们项目设计过程中,考虑把代码统一像spring项目一样,
把sql语句,包括传参都挪到xml文件里去赋值调用。
1、 工具类
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ParameterMode;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.apache.ibatis.type.TypeHandlerRegistry;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class XmlUtils
{
public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
public static String getRealSql(String sqlId,Map map){
Environment environment = new Environment("development",new JdbcTransactionFactory(),new PooledDataSource());
//通过底层开发者模式的environment创建configuration对象
Configuration configuration = new Configuration(environment);
//加入mapper接口类映射器,并注册别名
configuration.getTypeAliasRegistry().registerAlias("OmeMapper",OmeMapper.class);
configuration.addMapper(OmeMapper.class);
//TODO 如果业务量大起来,可以直接使用路径下的所有Mapper接口类,例如:
//configuration.getTypeAliasRegistry().registerAliases("com.warehouse.mapper");
//configuration.addMappers("com.warehouse.mapper");
//绑定里面的sql, 并且把写的map参数也传给sql
BoundSql boundSql = configuration.getMappedStatement(sqlId).getBoundSql(map);
String sql = boundSql.getSql();
if(StringUtils.isEmpty(sql)){
return "";
}
//美化Sql
sql.replaceAll("[\\s\n]+"," ");
// 填充占位符, 把传参填进去,使用#{}、${} 一样的方式
Object parameterObject = boundSql.getParameterObject();
//参数映射列表,有入的(in) 有出的
SparkSql整合Mybatis的xml文件管理维护Sparksql语句。这个架构也可以使用其他计算引擎,如flink
于 2021-03-31 10:55:20 首次发布