數據牆項目總結2-1

數據牆項目總結2-1

情況:
1.最近需要配合數據牆前端編寫大量的後臺代碼,而大部分代碼可以值寫sql語句來實現。
2.前臺頻繁更新需求,而頻繁部署比較耗時,想盡量減少部署(減少jar包的更新)。
因此編寫了幾個類,完成了基本靠編寫sql語句就ok的期望。

思路

1.在mapper和對應的mapper.xml中預定義一堆通用方法和sql代碼模板。
2.在controller通過url來定位要執行的mapper方法
3.達成目的:只修改mapper.xml中的sql語句,重啓服務即可。

手段

Java基礎中的反射技術 和 泛型

主要代碼:

controller

/**
 * 與BaseWallService、BaseWallXXXXMapper配合使用
 * 反射工具類
 * @author lch
 * @since 2020-05-25
 */
public class BaseWallController<BaseServiceClass extends BaseService>{

    @Autowired
    private BaseServiceClass baseService;

    /**
     * 調用
     * @param selectMethodInMapper 在mapper中定義的方法名  mapper中方法的格式統一定義爲 List<JSONObject> xxxx(HashMap<String,String> xxxx);
     * @param args 傳遞的參數
     * @return [ {...},{...},{...} ]  jsonArray格式的數據
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    protected JSONArray baseSelect(
            String selectMethodInMapper,HashMap<String, Object> args
    ) {
        args.put("_method",selectMethodInMapper);
        return (JSONArray)JSONArray.toJSON(baseService.baseSelect(args));
    }

    /**
     * 無參數
     * @param selectMethodInMapper 在mapper中定義的方法名  mapper中方法的格式統一定義爲 List<JSONObject> xxxx(HashMap<String,String> xxxx);
     * @return
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    protected JSONArray baseSelect(
            String selectMethodInMapper) {
        HashMap<String, Object> args = new HashMap<>();
        return this.baseSelect(selectMethodInMapper,args);
    }

    /**
     * 直接通過sql語句查詢
     * @param sql
     * @return
     */
    protected JSONArray selectBySql(String sql) {
        return (JSONArray)JSONArray.toJSON(baseService.selectBySql(sql));
    }


    /**
     * 直接通過sql語句查詢
     * @param sql
     * @return
     */
    protected JSONArray selectBySqlInBody(String sql) {
        return (JSONArray)JSONArray.toJSON(baseService.selectBySql(sql));
    }
}


/**
 * controller
 * @author lch
 * @since 2020-05-25
 */
@RestController
@CrossOrigin(origins = "*", maxAge = 3600)
@RequestMapping("/wallDemo")
@Slf4j
public class WallDemoController extends BaseWallController<WallDemoService> {

    /**
     * 有參無參 均可使用此url
     * @param select
     * @param args 參數
     * @return [{...},{...},{...}]
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    @GetMapping("/{select}")
    public JSONArray commentSelect(
            @PathVariable("select") String select,
            @RequestParam(required = false) HashMap<String, Object> args
    )  {
            return  super.baseSelect(select,args);
    }

    /**
     * 調試完成後 禁用
     * @param sql
     * @return
     */
    @RequestMapping("selectBySql")
    public JSONArray selectBySql(String sql){
        return super.selectBySql(sql);
    }

    /**
     * 調試完成後 禁用
     * @param sql
     * @return
     */
    @RequestMapping("selectBySqlInBody")
    public JSONArray selectBySqlInBody(@RequestBody String sql){
        return super.selectBySqlInBody(sql);
    }


}

service

/**
 * @author lch
 * @since 2020-05-25
 */
@Slf4j
public class BaseService<BaseMapperClass extends BaseMapper> {

    @Autowired
    BaseMapperClass baseMapper;

    /**
     * 根據方法名調用對應的方法
     * @param args 參數
     * @return
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    public List<JSONObject> baseSelect(HashMap<String, Object> args) {
        //方法名
        String selectMethod=args.get("_method").toString();
        try {
            Method targetMethod = baseMapper.getClass().getDeclaredMethod(selectMethod, HashMap.class);
            args.remove("_method");
            log.debug("invoke:class={} method={} args={}", baseMapper, targetMethod, args.size());
            return (List<JSONObject>) targetMethod.invoke(baseMapper, args);
        }catch (InvocationTargetException|IllegalAccessException|NoSuchMethodException e){
            log.error("invoke error!",e);
            throw new RuntimeException(e);
        }
    }

    /**
     * 根據sql語句查詢
     * @param sql
     * @return
     */
    public List<JSONObject> selectBySql(String sql) {
        return baseMapper.selectJsonObjectListBySql(sql);
    }
}



/**
 * @author lch
 * @since 2020-05-25
 */
@Service
public class WallDemoService extends BaseService<WallDemoMapper>{
}

dao mapper

/**
 * @author lch
 * @since 2020-05-25
 */
@Mapper
public interface BaseMapper {

    /**
     * 根據sql語句查詢
     * @param sql
     * @return jsonObject的List
     */
    @ResultType(JSONObject.class)
    @Select("${sql}")
    List<JSONObject> selectJsonObjectListBySql(String sql);

}


/**
 * @author lch
 * @since 2020-05-25
 */
@Mapper
public interface WallDemoMapper extends BaseMapper {
    List<JSONObject> select01(HashMap<String,String> args);
    List<JSONObject> select02(HashMap<String,String> args);
    List<JSONObject> select03(HashMap<String,String> args);
    List<JSONObject> select04(HashMap<String,String> args);
    List<JSONObject> select05(HashMap<String,String> args);
    //此處共寫了一百個
    }

mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.icbc.cxlab.datawall.dao.WallDemoMapper">
    <select id="select00" resultType="com.alibaba.fastjson.JSONObject">select '空白SQL' as result from dual</select>
    <select id="select01" resultType="com.alibaba.fastjson.JSONObject">select '空白SQL' as result from dual</select>
    <select id="select02" resultType="com.alibaba.fastjson.JSONObject">select '空白SQL' as result from dual</select>
    <select id="select03" resultType="com.alibaba.fastjson.JSONObject">select '空白SQL' as result from dual</select>
    <select id="select04" resultType="com.alibaba.fastjson.JSONObject">select '空白SQL' as result from dual</select>
    <select id="select05" resultType="com.alibaba.fastjson.JSONObject">select '空白SQL' as result from dual</select>
    <select id="select06" resultType="com.alibaba.fastjson.JSONObject">select '空白SQL' as result from dual</select>
    <select id="select07" resultType="com.alibaba.fastjson.JSONObject">select '空白SQL' as result from dual</select>
    <select id="select08" resultType="com.alibaba.fastjson.JSONObject">select '空白SQL' as result from dual</select>
    <select id="select09" resultType="com.alibaba.fastjson.JSONObject">select '空白SQL' as result from dual</select>
共一百個

代碼附件

by 2020年05月25日

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章