import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.session.SqlSessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.demo.core.resource.mapper.ResourceMapper;
import com.demo.core.utils.DateUtils;
@Component
public class MyBatisSql {
private final Logger logger = LoggerFactory.getLogger(MyBatisSql.class);
private final String sqlId = ResourceMapper.class.getName() + ".selectExportResEntities";
@Autowired
private SqlSessionFactory sqlSessionFactory;
public void execute() throws Exception {
Map paramMap = initParamMap();
MappedStatement ms = sqlSessionFactory.getConfiguration()
.getMappedStatement(sqlId);
BoundSql boundSql = ms.getBoundSql(paramMap);
List parameterMappings = boundSql.getParameterMappings();
List paramValues = getParamValues(paramMap, parameterMappings);
// 获取执行的sql,此时未设置参数
String sql = boundSql.getSql();
String execSql = getExecuteSql(sql, paramValues);
logger.info("sql:{}\n", execSql);
}
/**
* 设置查询参数值,返回可直接执行的sql
*/
private String getExecuteSql(String sql, List paramValues) {
while(sql.indexOf("?") != -1 && paramValues.size() > 0) {
Object paramValue = paramValues.get(0);
String value = paramValue.toString();
if (paramValue instanceof String) {
value = "'" + paramValue.toString() + "'";
}
else if (paramValue instanceof Date || paramValue instanceof Timestamp) {
value = DateUtils.format((Date) paramValue,
DateUtils.yyyy_MM_dd_HH_mm_ss);
value = "str_to_date('" + value + "','%Y-%m-%d %T')";
}
sql = sql.replaceFirst("\\?", value);
paramValues.remove(0);
}
return sql;
}
/**
* 根据动态查询条件获取查询参数值
*/
private List getParamValues(Map paramMap,
List parameterMappings) {
if (parameterMappings == null) {
return new ArrayList();
}
List paramValues = new ArrayList();
for (ParameterMapping pm : parameterMappings) {
if (pm.getMode() != ParameterMode.OUT) {
String paramName = pm.getProperty();
Object paramValue = paramMap.get(paramName);
paramValues.add(paramValue);
}
}
return paramValues;
}
/**
* 初始化查询参数
*/
private Map initParamMap() {
Map paramMap = new HashMap();
paramMap.put("resourceName", "用户管理");
paramMap.put("parentName", "权限管理");
paramMap.put("pageBegin", 0);
paramMap.put("pageSize", 20);
// paramMap.put("addTime", new Date());
return paramMap;
}
}