- 1.直接在IDE 工具里点击运行
- 2.控制台进入项目目,输入命令来启动,如图所示
mvn spring-boot:run
-
3.第三种方式同样控制台下使用命令,如图所示
先编译项目在项目的target目录生成项目 jar 包 mvn install 然后通过java命令来启动项目 java -jar xxx(项目名)-0.0.1-SNAPSHOT.jar 该命令也可加入参数表明启动的是正式包还是测试包 java -jar xxx(项目名)-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
-
注解的使用
注解 含义 @Controller 处理http请求 @RestController Spring4 之后新加入的注解,等于@Controller + @ResponseBody结合使用 @RequestMapping 配置url 映射 -
注意:单独 使用Controller则需要使用模板提供 html 文件 比如下面的 index文件,使用官方的thymeleaf
注解 含义 @PathVariable 获取url的数据,直接“/”后面加入要请求的参数获取 @RequestParam 获取请求参数的值,比较传统,请求地址后加入 ?id=xxx @PatchMapping 组合注解
//@RestController = @Controller + @ResponseBody
//@Controller //单独 使用Controller则需要使用模板提供 html 文件 比如下面的 index文件,使用官方的thymeleaf
//@ResponseBody
@RestController
@RequestMapping(value = "first") //整个controller类设置一个url
public class HelloWorldController {
//@RequestMapping(value = "/hello",method = RequestMethod.GET)
@GetMapping(value = "/hello")
//设置默认值 1
public String index(@RequestParam(value = "id",required = false,defaultValue = "1") Integer myID){
return "id:" + myID;
//return "index";
}
}
-
使用JPA组件和mysql组件
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
-
配置数据库,使用yml文件
application.yml 文件 spring: profiles: active: dev #配置当前打包的环境 datasource: driver-class-name: com.mysql.jdbc.Driver #数据库驱动 url: jdbc:mysql://127.0.0.1:3306/student #数据库地址和操作的表 username: root #数据库登录用户名 password: maoqitian #登录密码 jpa: hibernate: ddl-auto: update # create 表示自动创建表,每次重启都会删除旧表,重新生成新的表 update 则只是刷新不会重建 show-sql: true #日志显示 sql 语句 开发环境 application-dev.yml server: port: 8082 servlet: context-path: /mao 生产环境 application-prod.yml server: port: 8082 servlet: context-path: /mao
-
创建一个数据库服务接口继承JpaRepository,传入需要操作的对象
/** * @Author: mao.qitian * @Date: 2018/8/2 0002 17:56 * Student Dao */ public interface StudentRepository extends JpaRepository<Student,Integer>{ /** * @Author maoqitian * @Description 通过年龄查找学生 * @Date 2018/8/3 0003 11:14 * @Param [age] * @return 学生列表 **/ public List<Student> findByAge(Integer age); /** * @Author maoqitian * @Description 通过名字查找学生 * @Date 2018/8/3 0003 11:16 * @Param [name] * @return 查找到的学生 **/ public List<Student> findByName(String name); }
-
Controller中注入就可以使用它来操作数据库返回我们需要的信息,其他的操作spring-boot已经帮我们实现了
@Autowired private StudentRepository studentRepository;
- 将通用逻辑从业务逻辑中分离出来
<!--AOP 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
-
网络请求统一日志处理
/** * @Author: mao.qitian * @Date: 2018/8/6 0006 9:51 * @Description: 使用AOP 统一处理请求日志打印 */ @Aspect @Component // 该注解为注入spring-boot 容器 public class HttpAspect { private static final Logger logger= LoggerFactory.getLogger(HttpAspect.class); /** * @Author maoqitian * @Description 公共的处理方法,定位拦截的类和方法 * @Date 2018/8/6 0006 10:04 * @Param [] * @return void **/ @Pointcut("execution(public * com.mao.springdemo.demo.controller.StudentController.*(..))") //所以方法都有拦截http网络日志 public void log(){ } @Before("log()") public void doBefore(JoinPoint joinPoint){ ServletRequestAttributes servletRequestAttributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = servletRequestAttributes.getRequest(); //IP logger.info("url={}",request.getRemoteAddr()); //url logger.info("url={}",request.getRequestURL()); //method logger.info("method={}",request.getMethod()); //请求类的方法 logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName()); //参数 logger.info("args={}",joinPoint.getArgs().toString()); } @After("log()") public void doAfter(){ logger.info("方法走完"); } //打印返回参数 @AfterReturning(returning = "object",pointcut = "log()") public void doAfterReturning(Object object){ //logger.info("response={}",object.toString()); } }
-
首先创建我们需要返回的数据统一格式类对象
/** * @Author: mao.qitian * @Date: 2018/8/6 0006 15:55 * @Description: 统一 返回 对象 */ public class Result<T>{ /*返回数据*/ private T data; /*返回信息*/ private String message; /*错误码*/ private int code; public T getData() { return data; } public void setData(T data) { this.data = data; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } }
-
创建枚举类,对返回的数据信息和状态码做统一配置处理
/** * @Author: mao.qitian * @Date: 2018/8/6 0006 17:31 * @Description: 自定义返回信息枚举 */ public enum ResultEnum { UNKNOW_ERROR(-1,"未知错误"), FAIL(1,"数据获取失败"), SUCCESS(0,"数据获取成功"), PRIMARY_SCHOOL(100,"你是小学生,无法进行注册"), MIDDLE_SCHOOL(101,"你是中学生,无法进行注册") ; private Integer code; private String message; ResultEnum(Integer code, String message){ this.code=code; this.message=message; } public Integer getCode() { return code; } public String getMessage() { return message; } }
-
出现异常,我们也希望能打印一样的数据格式,所以我们可以写自己的异常类,并且继承运行时异常,这样spring-boot才能捕获异常
/** * @Author: mao.qitian * @Date: 2018/8/6 0006 16:26 * @Description: 自定义异常类 */ public class StudentException extends RuntimeException{ private int code; public StudentException(ResultEnum resultEnum){ super(resultEnum.getMessage()); this.code= resultEnum.getCode(); } public void setCode(int code) { this.code = code; } public int getCode() { return code; } }
-
捕获异常类
/** * @Author: [email protected] * @Date: 2018/8/6 0006 16:19 * @Description: 异常捕获类 */ @ControllerAdvice public class MyExceptionHandle { private static final Logger logger= LoggerFactory.getLogger(HttpAspect.class); @ExceptionHandler(value = Exception.class) @ResponseBody public Result handle(Exception e){ if(e instanceof StudentException){ StudentException studentException=(StudentException)e; return ResultUtils.error(studentException.getMessage(),ResultEnum.FAIL); }else { logger.error("【系统异常】",e); return ResultUtils.error("未知错误",ResultEnum.UNKNOW_ERROR); } } }
-
最后是数据统一返回的工具类
/** * @Author: [email protected] * @Date: 2018/8/6 0006 16:03 * @Description: 数据返回处理工具类 */ public class ResultUtils { public static Result success(Object obj, ResultEnum resultEnum){ Result result=new Result(); result.setCode(resultEnum.getCode()); result.setMessage(resultEnum.getMessage()); result.setData(obj); return result; } //没有返回数据的情况 public static Result success(){ return success(null,ResultEnum.SUCCESS); } public static Result error(String message,ResultEnum resultEnum){ Result result=new Result(); result.setMessage(message); result.setCode(resultEnum.getCode()); return result; } }
-
如何使用
成功的返回 ResultUtils.success(studentRepository.save(student), ResultEnum.SUCCESS); 获取数据失败 ResultUtils.error(bindingResult.getFieldError().getDefaultMessage(),ResultEnum.FAIL); 服务器出现异常直接使用自定义异常类抛出 throw new StudentException(ResultEnum.PRIMARY_SCHOOL);