package com.uas.erp.schedular.database; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.uas.erp.schedular.b2b.domain.IdObject; import com.uas.erp.schedular.service.SettingService; import com.uas.erp.schedular.util.BeanUtil; import com.uas.erp.schedular.web.ResultListWrap; import com.uas.erp.schedular.web.ResultWrap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import java.util.*; /** * Created by Pro1 on 2017/7/27. * 基于REST接口的JDBC操作 */ @Component public class RestJdbcTemplate { @Autowired private RestTemplate restTemplate; @Autowired private SettingService settingService; private String getUrl() { return settingService.getValue("api.database.url"); } /** * 执行语句 * @param exec * @param args */ public void execute(String exec, Object... args) { ResultWrap result = restTemplate.postForObject(getUrl() + "/v1/exec", Executable.execute(exec, args), ResultWrap.class); if (!result.isSuccess()) { throw new RuntimeException(result.getMessage()); } } /** * 批量执行 * @param execs */ public void batchExecute(String[] execs) { ResultWrap result = restTemplate.postForObject(getUrl() + "/v1/exec", Executable.execute(execs), ResultWrap.class); if (!result.isSuccess()) { throw new RuntimeException(result.getMessage()); } } /** * 批量执行 * @param execs */ public void batchExecute(List execs) { batchExecute(execs.toArray(new String[]{})); } /** * 查询列表 * @param exec * @param args * @return */ public List> queryForList(String exec, Object... args){ HttpEntity request = new HttpEntity(Executable.query(exec, args)); ParameterizedTypeReference>>> responseType = new ParameterizedTypeReference>>>(){}; ResponseEntity>>> response = restTemplate.exchange(getUrl() + "/v1/exec", HttpMethod.POST, request, responseType); ResultWrap>> result = response.getBody(); if (result.isSuccess()) { return result.getContent(); } throw new RuntimeException(result.getMessage()); } /** * 查询单行 * @param exec * @param args * @return */ public Map queryForMap(String exec, Object... args){ List> data = queryForList(exec, args); if (!CollectionUtils.isEmpty(data)) { return data.get(0); } return null; } /** * 查询单行,返回值的数组 * @param exec * @param args * @return */ public Object[] queryForArray(String exec, Object... args){ Map data = queryForMap(exec, args); if (null != data) { return data.values().toArray(); } return null; } /** * 查询,返回单个字段的值 * @param exec * @param args * @return */ public Object getObject(String exec, Object... args){ Map data = queryForMap(exec, args); if (null != data) { return data.values().iterator().next(); } return null; } /** * 查询,返回单个Integer类型的值 * @param exec * @param args * @return */ public int getInt(String exec, Object... args){ Object data = getObject(exec, args); if (null != data) { return (int) data; } return 0; } /** * 查询,返回单个Double类型的值 * @param exec * @param args * @return */ public double getDouble(String exec, Object... args){ Object data = getObject(exec, args); if (null != data) { return (double) data; } return 0D; } /** * 查询,返回单个Float类型的值 * @param exec * @param args * @return */ public float getFloat(String exec, Object... args){ Object data = getObject(exec, args); if (null != data) { return (float) data; } return 0F; } /** * 查询,返回单个String类型的值 * @param exec * @param args * @return */ public String getString(String exec, Object... args){ Object data = getObject(exec, args); if (null != data) { return data.toString(); } return null; } /** * 统计行 * @param exec * @param args * @return */ public int count(String exec, Object... args){ if (!exec.toLowerCase().startsWith("select ")) { exec = "select count(1) " + exec; } return getInt(exec, args); } /** * 取序列值 * @param sequenceName * @return */ public int generate(String sequenceName) { return getInt("select " + sequenceName + ".nextval from dual"); } /** * 取编号值 * @param sequenceName * @param type * @return */ public String generateCode(String sequenceName, int type) { return callForString("{call Sp_GetMaxNumber(?,?,?)}", sequenceName, type); } /** * 查询对象列表 * @param * @return */ public List queryForBeanList(String exec, Class targetCls, Object... args) { HttpEntity request = new HttpEntity(Executable.query(exec, BeanUtil.getProperties(targetCls), args)); String resultStr = restTemplate.postForObject(getUrl() + "/v1/exec", request, String.class); // json工具对超过两层的嵌套泛型无法解析,用ResultListWrap替代ResultWrap> ResultListWrap result = JSON.parseObject(resultStr, new TypeReference>(targetCls){}); if (result.isSuccess()) { return result.getContent(); } throw new RuntimeException(result.getMessage()); } /** * 查询对象 * @param * @return */ public T queryForBean(String exec, Class targetCls, Object... args) { List beans = queryForBeanList(exec, targetCls, args); if (!CollectionUtils.isEmpty(beans)) { return beans.get(0); } return null; } /** * call procedure * @param exec call语句 * @param args in参数 * @param outParams out参数 * @return */ public Map callForMap(String exec, Object[] args, String[] outParams){ HttpEntity request = new HttpEntity(Executable.call(exec, outParams, args)); ParameterizedTypeReference>>> responseType = new ParameterizedTypeReference>>>(){}; ResponseEntity>>> response = restTemplate.exchange(getUrl() + "/v1/exec", HttpMethod.POST, request, responseType); ResultWrap>> result = response.getBody(); if (result.isSuccess()) { List> list = result.getContent(); if (!CollectionUtils.isEmpty(list)) { return list.get(0); } return null; } throw new RuntimeException(result.getMessage()); } /** * call procedure and return string * @param exec * @param args * @return */ public String callForString(String exec, Object... args) { Map data = callForMap(exec, args, new String[]{"v_return"}); Object code = null == data ? null : data.get("v_return"); return null == code ? null : code.toString(); } public List queryIdList(String sql, Class elementType) { HttpEntity request = new HttpEntity(Executable.query(sql, BeanUtil.getProperties(elementType), null)); String resultStr = restTemplate.postForObject(getUrl() + "/v1/exec", request, String.class); ResultListWrap result = JSON.parseObject(resultStr, new TypeReference>(elementType){}); List list = new ArrayList<>(); if (!CollectionUtils.isEmpty(result.getContent())) { for (IdObject object : result.getContent()) { list.add(object.getId()); } } return list; } }