JAVA获取执行sql
来源:互联网 发布:苗千网络 编辑:程序博客网 时间:2024/06/05 20:31
import java.lang.reflect.Method;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.mapping.BoundSql;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.mapping.ParameterMapping;import org.apache.ibatis.mapping.ParameterMode;import org.apache.ibatis.reflection.MetaObject;import org.apache.ibatis.reflection.factory.DefaultObjectFactory;import org.apache.ibatis.reflection.factory.ObjectFactory;import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory;import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.TypeHandlerRegistry;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import com.alibaba.fastjson.JSONObject;public class ExportJobHelper {@Autowiredprivate SqlSessionFactory sqlSessionFactory;private final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();private final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();/** * 反射对象,增加对低版本Mybatis的支持 * * @param object * 反射对象 * @return */public MetaObject forObject(Object object) { return MetaObject.forObject(object, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);}/** * 通过命名空间方式获取sql * @param namespace statementID * @param params 参数 * @return */public String getNamespaceSql(String namespace, Object params,SqlSession sqlFactory) {// ApplicationContext applicationContext= new ClassPathXmlApplicationContext("classpath:spring/spring-mybatis.xml");// SqlSessionFactory sqlFactory =(SqlSessionFactory) applicationContext.getBean("systemSqlSessionFactory"); params = wrapCollection(params); Configuration configuration = sqlFactory.getConfiguration(); MappedStatement mappedStatement = configuration.getMappedStatement(namespace); TypeHandlerRegistry typeHandlerRegistry = mappedStatement.getConfiguration().getTypeHandlerRegistry(); BoundSql boundSql = mappedStatement.getBoundSql(params); List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); String sql = boundSql.getSql(); if (parameterMappings != null) { for (int i = 0; i < parameterMappings.size(); i++) { ParameterMapping parameterMapping = parameterMappings.get(i); if (parameterMapping.getMode() != ParameterMode.OUT) { Object value; String propertyName = parameterMapping.getProperty(); if (boundSql.hasAdditionalParameter(propertyName)) { value = boundSql.getAdditionalParameter(propertyName); } else if (params == null) { value = null; } else if (typeHandlerRegistry.hasTypeHandler(params.getClass())) { value = params; } else { MetaObject metaObject = configuration.newMetaObject(params); value = metaObject.getValue(propertyName); } JdbcType jdbcType = parameterMapping.getJdbcType(); if (value == null && jdbcType == null) jdbcType = JdbcType.NULL; //jdbcType = configuration.getJdbcTypeForNull(); sql = replaceParameter(sql, value, jdbcType,parameterMapping.getJavaType()); } } } return sql;}/** * 根据类型替换参数 仅作为数字和字符串两种类型进行处理,需要特殊处理的可以继续完善这里 * * @param sql * @param value * @param jdbcType * @param javaType * @return */private String replaceParameter(String sql, Object value, JdbcType jdbcType, Class javaType) { String strValue = String.valueOf(value); if (jdbcType != null) { switch (jdbcType) { // 数字 case BIT: case TINYINT: case SMALLINT: case INTEGER: case BIGINT: case FLOAT: case REAL: case DOUBLE: case NUMERIC: case DECIMAL: break; // 日期 case DATE: case TIME: case TIMESTAMP: // 其他,包含字符串和其他特殊类型 default: strValue = "'" + strValue + "'"; } } else if (Number.class.isAssignableFrom(value.getClass())) { // 不加单引号 } else { strValue = "'" + strValue + "'"; } return sql.replaceFirst("\\?", strValue);}/** * 获取指定的方法 * * @param clazz * @param methodName * @return */private Method getDeclaredMethods(Class clazz, String methodName) { Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { if (method.getName().equals(methodName)) { return method; } } throw new IllegalArgumentException("方法" + methodName + "不存在!");}/** * 获取参数注解名 * * @param method * @param i * @param paramName * @return */private String getParamNameFromAnnotation(Method method, int i, String paramName) { final Object[] paramAnnos = method.getParameterAnnotations()[i]; for (Object paramAnno : paramAnnos) { if (paramAnno instanceof Param) { paramName = ((Param) paramAnno).value(); } } return paramName;}/** * 简单包装参数 * * @param object * @return */private Object wrapCollection(final Object object) { if (object instanceof List) { Map<String, Object> map = new HashMap<String, Object>(); map.put("list", object); return map; } else if (object != null && object.getClass().isArray()) { Map<String, Object> map = new HashMap<String, Object>(); map.put("array", object); return map; } return object;}public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory;}
}
阅读全文
0 0
- JAVA获取执行sql
- java执行sql语句并获取指定返回值
- Java执行sql语句并获取指定返回值
- 获取动态SQL执行结果
- 获取动态sql执行结果
- java 执行sql文件
- Java 执行sql脚本
- java 执行Sql文件
- java jdbcTemplate执行sql
- Java执行linux命令 获取执行结果
- 获取动态sql的执行结果
- MySQL如何获取当前执行的SQL
- MySQL如何获取当前执行的SQL
- 获取sql的执行计划总结!
- 获取sql 中执行错误存储过程
- hibernate执行sql获取泛型对象
- explain plan获取sql的执行计划
- DBMS_XPLAN包获取sql执行计划
- 【java面试系列之操作系统】进程和线程、死锁、内存管理方式
- http协议
- Python
- 关于UGUI的DropDown点击区域外不关闭的问题
- (2)七层模型基础---设备
- JAVA获取执行sql
- dubbo -- 搭建dubbo-admin管理界面
- Android edittext键盘的隐藏和显示
- Java基础
- 输出数组中奇数次出现的数
- Method breakpoints may dramatically slow down debugging
- JQuery中操作Css样式的方法
- 试题一layout和配置
- 将博客搬至CSDN