摸鱼技巧-mybatis动态sql实现接口配置查询
很多公司内部为了效率,在一些后台管理系统上开始使用低代码工具。
今天我们就讲下 如果通过mybatis的动态sql,简单实现一个接口配置查询功能。技术栈 springboot、mybatis、mysql
(一)在mysql新增两张表。api_config 是配置 接口路径 和sql的关系的。userinfo 是查询测试表(自己随意建立 我就不贴图了)。
(二)先写 api_config的查询代码,这里就是基本的 mybatis使用方法。mapper类、service类、以及mapper xml文件
@Servicepublic class ApiConfigService { @Autowired private ApiConfigMapper apiConfigMapper; public ApiConfig getApiConfig(String urlPath,String method){ return apiConfigMapper.getApiConfigByPath(urlPath,method); }
@Mapperpublic interface ApiConfigMapper { ApiConfig getApiConfigByPath(@Param("urlPath") String urlPath, @Param("method") String method);}
<mapper namespace="com.example.mapper.ApiConfigMapper"> <select id="getApiConfigByPath" resultType="com.example.entity.ApiConfig"> select * from api_config where url_path = #{urlPath} and method=#{method} </select></mapper>
(三)cotroller 接收 url请求。
这里我们需要接收符合规则的所有请求。通过 spring requestMapping 内地模糊匹配来实现。如下@GetMapping("/get/*")
1、获取请求地址
2、获取请求方法
3、根据请求地址和请求方法 查找 对应的sql是什么。
4、将 请求参数 以及 对应的sql 放到 paramMap参数中。
这里我先实现Get请求,post请求 大家可以自行去实现。
@RestController@RequestMapping("/api")public class UserController { @Autowired private ApiService apiService; @Autowired private ApiConfigService apiConfigService; @Autowired private HttpServletRequest request; @GetMapping("/get/*") public Object getUser(@RequestParam(required = false) Map<String,Object> requestMap){ String requestPath = request.getServletPath(); String method = request.getMethod(); ApiConfig apiConfig = apiConfigService.getApiConfig(requestPath,method); ParamMap paramMap = new ParamMap(); paramMap.putAll(requestMap); paramMap.setSql(apiConfig.getSql()); return apiService.getResult(paramMap); }
(四)apiService 比较简单 如下
@Servicepublic class ApiService { @Autowired private ApiMapper apiMapper; public ResultMap getResult(ParamMap paramMap) { List<Map<String,Object>> list = apiMapper.selectList(paramMap); ResultMap resultMap = new ResultMap(); resultMap.put("data",list); return resultMap; }}
(五)这里是重点、重点、重点。我们来看 ApiMapper类 如何通过动态sql 来实现查询的。
1 类里只有一个 方法 selectList 。返回 使用的 是 List<Map<String,Object>> 。
其中Map<String,Object> 存的是 表中一条记录 的各个字段值。
List 就代表 查询出的多个记录。
2 我们不写xml文件了。这里用了 SelectProvider注解类,注解类有两个参数
type 代表 sql来源于哪个类 method 代表 类里的哪个方法。
通过这种方式让mapper类获取执行的代码
@Mapperpublic interface ApiMapper { @SelectProvider(type = SqlProvider.class,method = "provideSql") List<Map<String,Object>> selectList(ParamMap paramMap);}
3 接下来看看 SqlProvider类。非常简单 就是将 表里配置的sql返回一下。
我给的例子就是 select * from userinfo where id=#{id}
public class SqlProvider { public String provideSql(ParamMap paramMap){ return paramMap.getSql(); }}
(六)启动程序后 我们看下请求效果。请求成功
最后,如果再开发一个页面前端配置,是不是 解放了我们后端小伙伴的双手。当然高并发场景就不要这么玩了。后台管理还是可以这么玩的。
此时我们可以跟领导说这几个接口开发 后端需要3天,实际 30分钟整完。剩下的时间是不是就可以摸鱼了。