摸魚技巧-mybatis動(dòng)態(tài)sql實(shí)現(xiàn)接口配置查詢
很多公司內(nèi)部為了效率,在一些后臺(tái)管理系統(tǒng)上開始使用低代碼工具。
今天我們就講下 如果通過(guò)mybatis的動(dòng)態(tài)sql,簡(jiǎn)單實(shí)現(xiàn)一個(gè)接口配置查詢功能。技術(shù)棧 springboot、mybatis、mysql
(一)在mysql新增兩張表。api_config 是配置 接口路徑 和sql的關(guān)系的。userinfo 是查詢測(cè)試表(自己隨意建立 我就不貼圖了)。
(二)先寫 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請(qǐng)求。
這里我們需要接收符合規(guī)則的所有請(qǐng)求。通過(guò) spring requestMapping 內(nèi)地模糊匹配來(lái)實(shí)現(xiàn)。如下@GetMapping("/get/*")
1、獲取請(qǐng)求地址
2、獲取請(qǐng)求方法
3、根據(jù)請(qǐng)求地址和請(qǐng)求方法 查找 對(duì)應(yīng)的sql是什么。
4、將 請(qǐng)求參數(shù) 以及 對(duì)應(yīng)的sql 放到 paramMap參數(shù)中。
這里我先實(shí)現(xiàn)Get請(qǐng)求,post請(qǐng)求 大家可以自行去實(shí)現(xiàn)。
@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 比較簡(jiǎn)單 如下
@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; }}
(五)這里是重點(diǎn)、重點(diǎn)、重點(diǎn)。我們來(lái)看 ApiMapper類 如何通過(guò)動(dòng)態(tài)sql 來(lái)實(shí)現(xiàn)查詢的。
1 類里只有一個(gè) 方法 selectList 。返回 使用的 是 List<Map<String,Object>> 。
其中Map<String,Object> 存的是 表中一條記錄 的各個(gè)字段值。
List 就代表 查詢出的多個(gè)記錄。
2 我們不寫xml文件了。這里用了 SelectProvider注解類,注解類有兩個(gè)參數(shù)
type 代表 sql來(lái)源于哪個(gè)類 method 代表 類里的哪個(gè)方法。
通過(guò)這種方式讓mapper類獲取執(zhí)行的代碼
@Mapperpublic interface ApiMapper { @SelectProvider(type = SqlProvider.class,method = "provideSql") List<Map<String,Object>> selectList(ParamMap paramMap);}
3 接下來(lái)看看 SqlProvider類。非常簡(jiǎn)單 就是將 表里配置的sql返回一下。
我給的例子就是 select * from userinfo where id=#{id}
public class SqlProvider { public String provideSql(ParamMap paramMap){ return paramMap.getSql(); }}
(六)啟動(dòng)程序后 我們看下請(qǐng)求效果。請(qǐng)求成功
最后,如果再開發(fā)一個(gè)頁(yè)面前端配置,是不是 解放了我們后端小伙伴的雙手。當(dāng)然高并發(fā)場(chǎng)景就不要這么玩了。后臺(tái)管理還是可以這么玩的。
此時(shí)我們可以跟領(lǐng)導(dǎo)說(shuō)這幾個(gè)接口開發(fā) 后端需要3天,實(shí)際 30分鐘整完。剩下的時(shí)間是不是就可以摸魚了。