前期准备:
myeclipse maven mysql
new spring starter project
添加maven依赖:
spring-boot-starter-data-jpa(jpa依赖),mysql-connector-java(mysql),spring-boot-starter-aop(面向切面)
配置文件:
yml(格式十分严格)--myeclipse找不到yml这个形式文件,创建xml然后改名yml就可以了。
1.配置端口: server:
port:8080
2.配置数据库:spring:
datasource:
driver-class-name:com.mysql.jdbc.Driver
url:jdbc:mysql://localhost:3306/数据库名
uername:root
pssword:1234
3.配置jpa:
jpa:
hibernate:
ddl-auto: update
show-sql:true
springboot启动类:
Application这个类一定要放在其他类的上一层。否则会出现无法扫描到其他类,就会导致无法创建bean实例以及无法自动创建表等等原因。
控制层:
Controller这个类要增加注解 @RestController,只有这样才会返回json等格式!或者添加@responseBody.
映射URL,可以用GetMapping,PostMapping,或 @RequestMapping(value="*****");
@RequestParam,@PathParm,@PathVariable和@@RequestBody
这四个注解都是用来传参数的,第一个是用来传递http://localhost:8080/page1?id=1 这种用的。第二个和第三个用来处理 http://localhost:8080/page1/1这种传参数的,后面这个是用来传对象用的。
实体类: Result(Aop思想),如果每一次的返回结果都不固定那么必定会带来很大的麻烦,如果定义一个Result,那么每次返回数据的时候
格式会保持一致,想要自动建表,在实体类中加入注解@Entity,切记无论哪一个类都放在启动类的下一层,否则无法扫描。@ID这个
注解,@GeneratedVlue表示自增长,@Min,等等可以用来表单验证,@Valid,写在Controller层中。
工具类:续上面的Result,如果我们想要返回的结果保持一致性,如Json格式中包含了,Code(识别码),MSG(信息),Data(数据),那么
我们可以创建一个工具类,resultUtils,定义几个方法,如Success表示成功访问,Error表示失败。成功的方法中一个有参数,一个没
参数。
public static Result succes(Object object)
{
Result result=new Result();
result.setCode(ResultEnum.SUCCES.getCode());
result.setMsg("sucess");
result.setData(object);
return result;
}
public static Result succes()
{
Result result=new Result();
result.setCode(ResultEnum.SUCCES.getCode());
result.setMsg(ResultEnum.SUCCES.getMsg());
return result;
}
public static Result error(Integer code,String msg)
{
Result result =new Result();
result.setCode( code);
result.setMsg( msg);
return result;
}
这样我们就可以省去很多重复的代码了!不想做码农,就不要重复写一样的代码!
泛型类:
前面说到了很多CODE,MSG。就是一个识别码代表一个信息,那么如果我们不定义一个泛型来规范这些识别码,那么有可能今天你写代码,CODE=1代表成功,明天Code=200又代表成功,那么每一个方法的识别码都不对应,等以后需求修改,我们要改的地方就很多了!这个也是愚蠢的方法,那么如何使用泛型呢?
定义一个泛型(很少使用,很多人都会忘记了),
public enum ResultEnum {
UNKONW_ERROR(-1,"未知错误"),
SUCCES(1,"成功"),
SORRY(2,"次数不足")
;
private String msg;
private Integer code;
ResultEnum(Integer code,String msg)
{
this.code= code;
this.msg=msg;
}
public String getMsg() {
return msg;
}
public Integer getCode() {
return code;
}
这样子我们就可以省去很多的时间以及给与你交互的另一端更大的方便了。
Dao层:
这一次我使用的是jpa,那么理所当然我们应该定义一个接口,如果我们写的是图书实体类的dao层,那么我们定义一个bookRepository,并且让他继承JAPRepository这个接口,JPA中已经提供了一些相应的方法给我们了。
Ascept:
面向切面,如果我们要验证一个用户是否登陆或者是否有权限,那么我们就可以定义一个类,使用
@Ascept
@Pointcut("execution(public * com.bojue.movie.Controller.movieController.*(..))")
public void log()
{ }
如果我们想要获取一些信息,例如URL等等东西,我们应该使用日志,而不使用输出语句了。
private final static Logger logger =LoggerFactory.getLogger(类名);
logger.info("url={}",request.getRequestURL());
logger.info("method={}",request.getMethod());
logger.info("ip={}",request.getRemoteAddr());
logger也可以用来捕获异常。
异常类:
那么说到了异常,我们就应该思考一下,如果出现了异常,我们应该如何将异常返回给前端或者其他端呢?前面我们已经提及到了,我们给
另一端的返回数据应该保持格式的一致性!那么我们的异常也应该这么去处理!所以我们应该定义一个handle来捕获异常,如果出现了异常我们就可以根据我们的格式去返回给其他端!
@ControllerAdvice
public class ExceptionHandle {
private final static org.slf4j.Logger logger= org.slf4j.LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value=Exception.class)
@ResponseBody
public Result handle(Exception e)
{ if(e instanceof myException)
{
myException girlException =(myException) e;
return ResultUtil.error(girlException.getCode(), girlException.getMessage());
}
logger.error("【系统异常】{}",e);
return ResultUtil.error(-1, e.getMessage());
}
}
Springboot的用法无穷无尽,但是重要的不是框架,最重要的思想。