重点讲解下restfull风格,然后快速集成下mybatis,最后会提供下项目实战中一年应用的样例,欢迎点评

什么是REST

一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

理解RESTful

要理解RESTful架构,需要理解Representational State Transfer这个词组到底是什么意思,它的每一个词都有些什么涵义。

下面我们结合REST原则,围绕资源展开讨论,从资源的定义、获取、表述、关联、状态变迁等角度,列举一些关键概念并加以解释。

  • 资源与URI
  • 统一资源接口
  • 资源的表述
  • 资源的链接
  • 状态的转移

要从以上几点去理解restful风格,要是长篇描述或许一篇文章也无法描述清楚,我们从实战出发,只需要掌握要要点即可,随着深入我们会有更深的理解。

1.案例中的Controller层会涉及GET,DELETE,PUT和POST的典型用法

2.我们先来具体看下RESTful风格的url,比如我要查询商品信息,那么

非REST的url:http://.../queryGoods?id=1001&type=t01

REST的url: http://.../t01/goods/1001

可以看出REST特点:url简洁,将参数通过url传到服务器,而传统的url比较啰嗦,而且现实中浏览器地址栏会拼接一大串字符,想必你们都见过吧。但是采用REST的风格就会好很多,现在很多的网站已经采用这种风格了,这也是潮流方向,典型的就是url的短化转换

集成步骤:

在pom文件引入mybatis-spring-boot-starter的依赖

   <!--新增--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency>

引入数据库连接依赖:

<!-- alibaba的druid数据库连接池 -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.9</version>
</dependency>

引入数据源

#数据库配置
spring:application:name: limp-framework-providerdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://115.28.166.xx:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=falseusername: rootpassword: testinitialSize: 3minIdle: 3maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 3600000validationQuery: select 'x'testWhileIdle: truetestOnBorrow: truetestOnReturn: true# 打开PSCache,并且指定每个连接上PSCache的大小poolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filters: stat,wall,slf4j# 通过connectProperties属性来打开mergeSql功能;慢SQL记录connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000# 合并多个DruidDataSource的监控数据#useGlobalDataSourceStat: true

mybatis配置

mybatis:config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径type-aliases-package: com.limp.framework.boss.domain    # 所有Entity别名类所在包mapper-locations: classpath:com/limp/framework/boss/persistence/oracle/*.xml,classpath:com/limp/framework/boss/persistence/mysql/*.xml             # mapper映射文件

Controller、Service层、Dao代码

采用resutful风格:

Controller层:主要注意增删改查 四种方式()


package com.limp.framework.boss.controller;import com.limp.framework.boss.domain.UserInfo;
import com.limp.framework.boss.service.UserInfoService;
import com.limp.framework.core.bean.Pager;
import com.limp.framework.core.bean.Result;
import com.limp.framework.core.bean.ResultCode;
import com.limp.framework.core.constant.Constant;
import com.limp.framework.core.constant.ResultMsg;
import com.limp.framework.utils.StrUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;import java.text.SimpleDateFormat;
import java.util.Date;/*** demo相关操作* @author:shinians email:shiniandate@163.com* @description:* @date:Created in 22:21 2018/6/2* @modified By:* @RestController:是controller和ResponseBody的集合*/
@RestController
@RequestMapping("/systemdemo")
public class DemoDomainController extends BaseController {private Logger loger= LoggerFactory.getLogger(DemoDomainController.class);@AutowiredUserInfoService userInfoService;/*** 设置默认页面显示的条数*/public static  final Integer DEFAULT_ROW=10;/*** 新增实体类信息* @param domain* @return*/@RequestMapping(value = "/domain",method= RequestMethod.POST)public String saveUserInfo(UserInfo domain) {loger.debug("/***新增实体类信息**/");if(userInfoService.save(domain)){return Result.getInstance(ResultCode.SUCCESS.toString(), ResultMsg.SUCCESS,"","").getJson();}return Result.getInstance(ResultCode.ERROR.toString(), ResultMsg.ERROR,"","").getJson();}/*** 根据id删除实体类* 为了管理员易于操作支持批量操作* @param id* @return*/@RequestMapping(value = "/user/{id}",method= RequestMethod.DELETE)public String delUserInfo(@PathVariable("id") String id) {loger.debug("/***根据用户id:{},删除实体类记录**/", id);String []ids=id.split(Constant.DHAO);if(id.split(Constant.DHAO).length>DEFAULT_ROW){return Result.getInstance(ResultCode.ERROR.toString(), ResultMsg.DEL_ERROR_IDS_TOO_MANY,"","").getJson();}Boolean flay=true;for(String did:ids){if(!userInfoService.delete(did)){flay=false;};}if(flay){return Result.getInstance(ResultCode.SUCCESS.toString(), ResultMsg.SUCCESS,"","").getJson();}return Result.getInstance(ResultCode.ERROR.toString(), ResultMsg.ERROR,"","").getJson();}/*** 更新实体类信息* @param domain* @return*/@RequestMapping(value = "/user",method= RequestMethod.PUT)public String updateUserInfo(UserInfo domain) {loger.debug("/***更新实体类信息**/");if(userInfoService.update(domain)){return Result.getInstance(ResultCode.SUCCESS.toString(), ResultMsg.UPDATE_SUCCESS,"","").getJson();}return Result.getInstance(ResultCode.ERROR.toString(), ResultMsg.UPDATE_ERROR,"","").getJson();}/*** 根据id获取实体类信息* @param model* @param id 查询的id* @return*/@RequestMapping(value = "/user/{id}",method= RequestMethod.GET)public String selectUserInfo(Model model, @PathVariable("id") String id) {loger.debug("/***根据用户id{},获取实体类基本信息**/", id);UserInfo userInfo= userInfoService.get(id);return Result.getInstance(ResultCode.SUCCESS.toString(), ResultMsg.SUCCESS,userInfo,"").getJson();}/*** 查询实体类列表,分页方法* @param userInfo* @return*/@RequestMapping(value = "/users",method= RequestMethod.GET)public String selectUserInfoList(UserInfo userInfo,Pager pager) {loger.debug("/***分页查询方法,返回实体类列表**/");pager = new Pager(pager.getPage(), StrUtils.isBlank(pager.getRows())||Constant.NUMBER_0==pager.getRows()?DEFAULT_ROW:pager.getRows());Pager<UserInfo> userInfoPager= userInfoService.getPageList(userInfo, pager);return Result.getInstance(ResultCode.SUCCESS.toString(), ResultMsg.SUCCESS,userInfoPager,"").getJson();}@InitBinderpublic void initBinder(WebDataBinder binder) {/*** 第一种方式:使用WebDataBinder注册一个自定义的编辑器,编辑器是日期类型* 使用自定义的日期编辑器,日期格式:yyyy-MM-dd,第二个参数为是否为空  true代表可以为空*  yyyy-MM-dd hh:mm:ss*/binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));}}

ServiceImpl层:参考DemoDomainServiceImpl类

Mapper一般都有现成的工具,所以根据公司用的插件生成即可(如下)

SpringBoot继承mybatis相对比较简单,

下载地址:https://github.com/shinians/limp-framework

SpringBoot专栏:集成mybatis以及restful风格样例演示(第8讲)相关推荐

  1. MyBatis系列之--Java 项目(非SpringBoot)集成MyBatis

    MyBatis系列之--Java 项目(非SpringBoot)集成MyBatis 对MyBatis简单介绍 核心接口SqlSessionFactory 实战 1. Maven创建Java项目 2. ...

  2. SpringBoot项目集成Mybatis Plus(一)多数据源配置

    随着微服务使用越来越广泛,功能越做越大,需要支持的数据源也会越来越多,这时就可以在项目中集成Mybatis Plus,支持多数据源.Mybatis Plus在 Mybatis基础上进行了功能扩充,非常 ...

  3. SpringBoot项目集成Mybatis Plus(五)条件构造器

    Mybatis Plus 提供了强大的条件构造器,在不写sql映射文件的情况下,完成复杂的查询和修改数据的操作. 条件构造器用于生成sql的where条件,包括 QueryWrapper, Updat ...

  4. SpringBoot项目集成Mybatis Plus(四)SQL映射文件

    实际使用中,都会用到自定义SQL查询语句,并且需要支持分页,因为之前在项目中配置了分页插件,所以用起来很简单. 例如,定义接口getList,接口参数为分页参数和查询条件, @RequestMappi ...

  5. SpringBoot项目集成Mybatis Plus(三)分页插件

    通过代码生成后,service继承了IService接口,这样可以直接使用Mybatis Plus封装的CRUD接口进行简单的增删改查. 例如简单的根据id查询: @RestController @R ...

  6. SpringBoot项目集成Mybatis Plus(二)代码生成器

    承接上文,接着开始最基础的代码开发,使用Mybatis Plus的代码生成器,简化流程式的开发工作. 1.引入maven依赖, <dependency><groupId>com ...

  7. SpringBoot指南(四)——RESTful风格

    请求的路径相同,通过改变请求的方式来对应增删改查 GET:查 POST:增 PUT:修 DELETE:删 原理 请求被HiddenHttpMethodFilter拦截 判断请求是否正常,是否是POST ...

  8. 序列化和反序列化的概念与延伸【详细解释 + 样例演示】

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化:把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 ...

  9. SpringBoot开发Restful风格的接口实现CRUD功能

    一.前言 我们都知道SpringBoot的出现使得在开发web项目的时候变得更加方便.快捷.之前写过一篇文章是如何快速搭建一个springboot项目:SpringBoot入门:使用IDEA和Ecli ...

最新文章

  1. 飞书与IAI国际广告奖,协同实现国内营销史上的创新“云终审”
  2. vector的resize()和reserve()函数
  3. 帮我看看这点破事 EVENT
  4. java B2B2C Springcloud电子商务平台源码-服务网关过滤器
  5. 利用Conda尝鲜Python 3.10
  6. curl获取站点的各类响应时间(dns解析时间,响应时间,传输时间)
  7. 软件项目风险评估报告00
  8. OSPF通过MPLS ×××
  9. windows7原版iso镜像_一定收藏,常用操作系统原版下载地址整理,Win7 Win10 Deepin...
  10. Netty工作笔记0083---通过自定义协议解决粘包拆包问题1
  11. 计算机图形图像发展前景,计算机图形学发展前景有什么趋势?
  12. 双活架构保服务24小时在线
  13. 解决IIS无法启动w3svc
  14. 虚拟麦克风音频输入_Audio Precision 全新声学/音频分析软件可减少测试时间
  15. NodeJs安装教程:看教程一步步学会安装NodeJs
  16. Linux 内核调试指南[转载]
  17. 74CMS_v4.2.1-v4.2.129后台Getshell
  18. IC设计之CDC(跨时钟域)问题
  19. 【《Real-Time Rendering 3rd》 提炼总结】(一) 全书知识点总览
  20. 爱因斯坦是人类历史上最伟大的科学家吗?

热门文章

  1. PDF转换成PPT简便的方法
  2. Redis主从模式下从库过期的key仍然能够被读到的解决方案
  3. Django配置连接SqlServer(版本Django3.2.5,python3.9)
  4. echarts折线图无数据断开解决方法
  5. android端采用FFmpeg进行音频混合与拼接剪切
  6. 使用Celery 容联云 异步发送验证码详解!!!
  7. Leetcode883 三维形体投影面积 高效解法
  8. 在 Kubernetes 上部署 Fluent Bit 收集日志发送到 Kafka
  9. AVPlayer 实现简单的视频播放功能
  10. 来自中国的人工智能解决方案,如何风靡全球数亿用户?