数据墙项目总结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日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值