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