文章目录
1. 传统开发模式存在的问题
几乎每一个后端coder的工作,都是在围绕单表增删改查玩。很多时候为了支持业务,或是开了个新服务,或是建了一张新表,或是单表增删改查接口来一套,总之莫名其妙的就得上个线。
俗话说的好,频繁上线一定会带来意想不到的事故。于是,各种各样的解决方案应运而生。
2. 自研easy-job插件的背景
我一直在想有没有一个最佳的解决方案,直到发现了腾讯出的apijson。然而,一通操作猛如虎之后,我还是被劝退了。apijson存在的几个问题:1.代码侵入性极强;2.学习成本较高;3.还是得频繁修改代码上线。总而言之,像是东找一点西找一点凑出来的垃圾。
作为一个有梦想的coder,apijson虽然满足不了我的需要,但是给了我非常大的启发。于是,自研的easy-job插件顺势而生。当你了解什么是easy-job之后,你会真正体会到什么叫做后端零代码开发。
3. 使用教程
3.1 新建springboot空项目并引入easy-job包
<dependency>
<groupId>io.github.xiaoyudeguang</groupId>
<artifactId>easy-job</artifactId>
<version>4.3.1</version>
</dependency>
3.2 在src/main/resources路径下新增application.properties文件加入数据库配置:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test??ullNamePatternMatchesAll=true&serverTimezone=GMT%2b8?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
3.3 在src/main/java路径下新增启动类并启动
3.4 调接口完成对数据库表的增删改查
比如我的数据库中存在一张用户表(表名为user):
那么,本地启动服务后,直接postman调接口:
1.新增用户数据(http://localhost:8080/user/save)
- 根据id查询数据(http://localhost:8080/user/9)
3.根据id修改数据(http://localhost:8080/user/9)
4.根据id删除数据(http://localhost:8080/user/9)
5.查询数据列表(http://localhost:8080/user/list)
6.分页查询数据列表(http://localhost:8080/user/page)
可以看到,常用的接口基本都支持了。示例用的是用户表,实际使用中可以直接操作任意一张表。如果操作的是order表,那么将接口路径中的user变成order即可。
基于这种模式,任何一张表都可以用这些接口来操作。无论是已有的数据表,还是新增表,代码是不需要做任何调整的。
4. 关键实现
4.1 提供接口服务的核心代码
@PostMapping("/{table_name}/save")
public HttpResponse save(@PathVariable(name = "table_name") String tableName,
@RequestBody Map<String, Object> dataMap) throws Exception {
logger.debug("tableName.{}, dataMap = {}", tableName, dataMap);
return HttpResponse.success(dataService.save(tableName, dataMap));
}
@DeleteMapping("/{table_name}/{data_id}")
public HttpResponse remove(@PathVariable(name = "table_name") String tableName,
@PathVariable(name = "data_id") String dataId) throws Exception {
logger.debug("tableName.{}, dataId = {}", tableName, dataId);
return HttpResponse.success(dataService.remove(tableName, Maps.newMap("id", dataId)));
}
@PutMapping("/{table_name}/{data_id}")
public HttpResponse edit(@PathVariable(name = "table_name") String tableName,
@PathVariable(name = "data_id") String dataId, @RequestBody Map<String, Object> updateMap)
throws Exception {
logger.debug("tableName.{}, dataId = {}, requestMap = {}", tableName, dataId, updateMap);
return HttpResponse.success(dataService.edit(tableName, updateMap, Maps.newMap("id", dataId)));
}
@GetMapping("/{table_name}/{data_id}")
public HttpResponse getOne(@PathVariable(name = "table_name") String tableName,
@PathVariable(name = "data_id") String dataId) throws Exception {
logger.debug("tableName.{}, dataId = {}", tableName, dataId);
return HttpResponse.success(dataService.getOne(tableName, Maps.newMap("id", dataId)));
}
@PostMapping("/{table_name}/list")
public HttpResponse list(@PathVariable(name = "table_name") String tableName,
@RequestBody(required = false) Map<String, Object> parameterMap) throws Exception {
logger.debug("tableName.{}, parameterMap = {}", tableName, parameterMap);
return HttpResponse.success(dataService.list(tableName, parameterMap));
}
@PostMapping("/{table_name}/page")
public HttpResponse page(@PathVariable(name = "table_name") String tableName,
@RequestBody(required = false) Page<Map<String, Object>> page) throws Exception {
logger.debug("tableName.{}, page = {}", tableName, page);
return HttpResponse.success(dataService.page(tableName, page));
}
4.2 easy-job的扩展知识点
- easy-job插件本质上是对单表的增删改查操作,通过接口路径中的table_name属性来选择被操作的表;
- 所有查询接口都支持like操作,只需要接口的参数值带“%”,接口中会自动判断是否like和like的类型;
- 可以通过在配置文件中设置application.simple-name的值来给所有接口增加一个前缀;