摘要:前兩篇已經構建了標準工程實例,也整合了實現了簡單數據庫訪問,本篇主要更深入的學習下,實現較為完整的數據庫的標準服務。到這里,最復雜的數據訪問基本就算編寫完了。
前兩篇已經構建了RESTful API標準工程實例,也整合了MyBatis實現了簡單數據庫訪問,本篇主要更深入的學習下,實現較為完整的數據庫CRUD的標準服務。
首先看下要實現的效果吧,完成下面截圖部分的API,除了CRUD之外,分頁查詢也是使用的比較多的。
這次是采用代碼編寫的方式,沒有使用通用mapper和分頁組件,打算先熟悉下整個流程,后面實際開發功能的話還是使用的好,提高開發效率。
下面是編碼的詳細步驟:
編寫TempMapper我們優先實現數據庫訪問,之前一直采用的是注解的方式,所以這次就注解到底了。
但是遇到了第一個問題,sql如何拼接,之前簡單的例子不會涉及,但這次有分頁,有更新(可能更新某個字段)。
網上看了下,一種方式是使用方法動態去拼接,嘗試了一下,發現這代碼可讀性太差了,還不如直接用xml的方式了,后來才知道有@Provider,動態語言注解,其實就是通過該注解去指向你生成動態Sql的方法,相關代碼如下:
我們定義一個TempSqlProvider類,用于提供所需要的Sql字符串,這里寫了兩個方法,分別生成分頁查詢的sql語句和更新sql語句:
public class TempSqlProvider { //生成分頁Sql public String sqlTempPaging(Mapmap) { StringBuffer sql = new StringBuffer("select id,name,content from temp where 1=1 "); if(map.get("id")!=null) { sql.append(" and id=#{id}"); } if(map.get("name")!=null) { sql.append(" and name=#{name}"); } if(map.get("content")!=null) { sql.append(" and content=#{content}"); } if(map.get("offect")!=null&&map.get("limit")!=null) { sql.append(" limit #{offset}, #{limit}"); } return sql.toString(); } //生成更新Sql public String updateTempSql(Temp temp) { return new SQL(){{ UPDATE("temp"); if(temp.getName() != null){ SET("name=#{name}"); } if(temp.getContent() != null){ SET("content=#{content}"); } WHERE("id=#{id}"); }}.toString(); } }
可以看到,這里用了兩種方式,查詢的sql我通過字符串拼接的方式直接寫sql,而更新的sql我使用MyBatis提供了SQL類org.apache.ibatis.jdbc.SQL,大家可以參考下,后者看起來更優雅點。
然后我們可以編寫TempMapper了,具體代碼如下:
@Mapper public interface TempMapper { @Select("SELECT `id`,`name`,`content` FROM TEMP WHERE ID = #{id}") Temp findById(@Param("id") Integer id); @SelectProvider(type=TempSqlProvider.class,method="sqlTempPaging") ListgetTempPaging(Map map); @Insert("INSERT INTO TEMP(NAME, CONTENT) VALUES(#{name}, #{content})") int insert(@Param("name") String name,@Param("content") String content); @UpdateProvider(type=TempSqlProvider.class,method="updateTempSql") int update(Temp temp); @Delete("DELETE FROM TEMP WHERE ID=#{id}") int delete(@Param("id") Integer id); }
這里可以看到,我們分別通過@SelectProvider和@UpdateProvider注解,指向對應sql的類和方法,實現動態sql。
到這里,最復雜的數據訪問基本就算編寫完了。
輕插:MyBatis的一些注解說明除了常規的CRUD的注解之外(@Select,@Update,@Insert,@Delete)和使用動態語言注解@Provider之外,有必要再說明下傳參方式。
使用@Parm基本上有三種,在上面的demo都有使用到findById方法,@Parm中定義的id對應sql中#{id}。
使用Map當參數過多且不確定時,通過Map對象來作為傳遞參數的容器,如上面getTempPaging方法,但是在代碼可讀性上比較差點,我只有到具體sql中才能找到具體有哪些參數。
使用對象使用普通的java對象來作為傳參方式,如上面的update方法,當參數確定時使用對象的方式比較好。
編寫Service層我們繼續編寫Service層。
首先定義TempService接口,確認給要輸出的方法,代碼如下,簡單的CRUD和一個分頁的查詢方法:
public interface TempService { Temp getTemp(Integer id); ListgetTempPaging(Map map); Boolean insertTemp(Temp temp); Boolean updateTemp(Temp entity); Boolean deleteTemp(Integer id); }
然后編寫對應實現TempServiceImpl,代碼如下:
@Service public class TempServiceImpl implements TempService{ @Autowired private TempMapper tempMapper; @Override public Temp getTemp(Integer id) { return tempMapper.findById(id); } @Override public ListgetTempPaging(Map map) { return tempMapper.getTempPaging(map); } @Override public Boolean insertTemp(Temp temp) { return tempMapper.insert(temp.getName(),temp.getContent())>0; } @Override public Boolean updateTemp(Temp entity) { return tempMapper.update(entity)>0; } @Override public Boolean deleteTemp(Integer id) { return tempMapper.delete(id)>0; } }
這部分沒有什么好說的,由于沒有很復雜的邏輯,直接調用的mapper。
編寫Controller暴露對外訪問路由,同時整合Swagger,整體代碼如下:
@Api(description ="Temp測試服務") @RestController @RequestMapping("/temp") public class TempController { @Autowired private TempService tempService; @ApiOperation(value="根據Id查詢Temp信息", notes="MyBatis實現數據庫訪問demo") @RequestMapping(value = "/{id}",method = RequestMethod.GET) public Temp getTemp(@ApiParam(name="id",value="主鍵id",required=true) @PathVariable Integer id) { Temp t=tempService.getTemp(id); return t; } @ApiOperation(value="分頁查詢Temp信息", notes="MyBatis實現數據庫訪問demo") @RequestMapping(value = "/paging",method = RequestMethod.GET) @ResponseBody public ListgetTempPaging(@RequestParam Map map) { List t=tempService.getTempPaging(map); return t; } @ApiOperation(value="新增Temp信息", notes="MyBatis實現數據庫訪問demo") @RequestMapping(value = "",method = RequestMethod.POST) public String postTemp(@RequestBody Temp temp) { tempService.insertTemp(temp); return "success"; } @ApiOperation(value="根據Id更新Temp信息", notes="MyBatis實現數據庫訪問demo") @RequestMapping(value = "/{id}",method = RequestMethod.PUT) public String putTemp(@PathVariable Integer id,@RequestBody Temp temp) { temp.setId(id); tempService.updateTemp(temp); return "success"; } @ApiOperation(value="根據Id刪除Temp信息", notes="MyBatis實現數據庫訪問demo") @RequestMapping(value = "/{id}",method = RequestMethod.DELETE) public String deleteTemp(@PathVariable Integer id) { Boolean result=tempService.deleteTemp(id); return result.toString(); } }
主要實現了五個接口,簡單的CRUD和一個分頁。
到這里,代碼基本編寫完成,如無意外的話,編譯后即可得到上面說的截圖效果。
輕插:Swagger常用注解說明上面代碼中使用了一些Swagger基本的注解:
@Api:用在請求的類上,表示對類的說明
@ApiOperation:用在請求的方法上,說明方法的用途、作用
@ApiParam:用在請求的方法上,表示參數說明
主要用了這三個,@Api主要描述下整個服務組的一些說明,@ApiOperation主要描述單個服務的說明,這兩個感覺還是有點必要的。
至于其他的,感覺視情況而定吧,如果要把一個服務全部描述清楚,這代碼看上去真的有點恐怖。
下面是一些Swagger其他一些注解,供大家了解參考,因為沒有使用到,沒有深入去研究,詳細的可以參考官網
@ApiModel: 用于類表示對類進行說明,用于參數用實體類接收
@ApiModelProperty:用于方法,字段
表示對model屬性的說明或者數據操作更改
@ApiIgnore:用于類,方法,方法參數
表示這個方法或者類被忽略
@ApiImplicitParam: 用于方法
表示多帶帶的請求參數
@ApiImplicitParams:用于方法,包含多個 @ApiImplicitParam
總結本篇主要結合Spring Boot學習筆記(四)構建RESTful API標準工程實例和Spring Boot學習筆記(五)整合MyBatis實現數據庫訪問,填充了CURD服務的基本實現。
開發應用時,主流程實現應該沒有問題了,但還有很多不足,比如日志,一些傳參驗證,異常捕獲等。后期也會慢慢學習,分享出來。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68970.html
摘要:關閉進程問題順利解決。問題泄也是一個奇葩的問題,百度一下,原來碰到的人挺多,原因就是高版本的驅動會有數據庫和系統時區差異我用的版本是,所以碰到了,修改下配置,執行時區就可以了或者用回版本,該版本不會存在時區問題。 本文主要在上一篇Spring Boot學習筆記(四)構建RESTful API標準工程實例的基礎上,整合MyBatis,實現簡單的MySql數據庫訪問 引入依賴 這里主要依賴...
摘要:哪吒社區技能樹打卡打卡貼函數式接口簡介領域優質創作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現在公司的現狀是碼農太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區Java技能樹打卡?【打卡貼 day2...
摘要:認證鑒權與權限控制在微服務架構中的設計與實現一引言本文系認證鑒權與權限控制在微服務架構中的設計與實現系列的第一篇,本系列預計四篇文章講解微服務下的認證鑒權與權限控制的實現。 java 開源項目收集 平時收藏的 java 項目和工具 某小公司RESTful、共用接口、前后端分離、接口約定的實踐 隨著互聯網高速發展,公司對項目開發周期不斷縮短,我們面對各種需求,使用原有對接方式,各端已經很...
摘要:引入了新的環境和概要信息,是一種更揭秘與實戰六消息隊列篇掘金本文,講解如何集成,實現消息隊列。博客地址揭秘與實戰二數據緩存篇掘金本文,講解如何集成,實現緩存。 Spring Boot 揭秘與實戰(九) 應用監控篇 - HTTP 健康監控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...
摘要:代碼自動生成底層服務有很多通用的,利用代碼生成最好不過了,這里作者將代碼生成放在中的,避免與正式代碼沖突。主要通過來實現,項目中的模板文件可以自行定義。相互學習,共同進步 從零開始學習Spring Boot也有幾天時間了,項目已經不允許我這么慢慢學習了,急需底層變現實現一套簡單的Restful API用于業務支撐。 于是在GitHub上找到了一個不錯的demo,直接看demo搭建自己的...
閱讀 853·2021-11-24 09:38
閱讀 1084·2021-10-08 10:05
閱讀 2577·2021-09-10 11:21
閱讀 2799·2019-08-30 15:53
閱讀 1826·2019-08-30 15:52
閱讀 1963·2019-08-29 12:17
閱讀 3417·2019-08-29 11:21
閱讀 1608·2019-08-26 12:17