摘要:前两篇已经构建了标准工程实例,也整合了实现了简单数据库访问,本篇主要更深入的学习下,实现较为完整的数据库的标准服务。到这里,最复杂的数据访问基本就算编写完了。
前两篇已经构建了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服务的基本实现。
开发应用时,主流程实现应该没有问题了,但还有很多不足,比如日志,一些传参验证,异常捕获等。后期也会慢慢学习,分享出来。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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搭建自己的...
阅读 836·2021-11-24 09:38
阅读 1062·2021-10-08 10:05
阅读 2565·2021-09-10 11:21
阅读 2787·2019-08-30 15:53
阅读 1808·2019-08-30 15:52
阅读 1924·2019-08-29 12:17
阅读 3389·2019-08-29 11:21
阅读 1583·2019-08-26 12:17