1.使用IDEA新建一個項目,選擇左側的spring Initializr,選擇好jdk版本之後點擊下一步
2.然後idea會自動創建一個maven項目。之後點擊下一步
3.選擇項目所需要的依賴,如web,jpa,mysql等等
4.最後一步:給項目命名,選擇項目地址,就創建完成了。
項目的啓動入口
springboot項目創建完成會自動創建一個項目入口,直接運行就可以了,當然,項目中什麼都沒有訪問的話會報404錯誤。
使用JPA完成對數據庫的CRUD
1.首先將項目默認的application.properties文件改爲:application.yml文件(官方推薦)
jpa的配置:ddl-auto:create會是項目自動在數據庫中創建對應的表
2.首先創建一個pojo包,並創建一個javabean。
package com.tellhow.demo.pojo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.persistence.*;
import javax.validation.constraints.Min;
@Component//加入spring容器中
@Entity //映射數據庫中的表
@ConfigurationProperties(prefix = "user")//配置屬性bean,會將yml文件中的前綴爲user的屬性值映射到此bean中用來直接使用
public class User {
@Id
@GeneratedValue
private Integer id;
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
private String username;
@Min(value =12,message = "年齡不能小於12歲")//表單驗證
private int age;
private String cupSize;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCupSize() {
return cupSize;
}
public void setCupSize(String cupSize) {
this.cupSize = cupSize;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
", cupSize='" + cupSize + '\'' +
'}';
}
}
此時啓動項目,springboot就能根據yml裏的配置,和javabean上的@Entity註解,在數據庫中創建一張對應的表。
3.編寫repository接口,(即平常的Dao接口),繼承JPA的JPARepository接口。(裏面封裝了一些對數據庫的基本操作,類似於mybatis的通用mapper)
package com.tellhow.demo.repository;
import com.tellhow.demo.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User,Integer>{
}
4.編寫控制層(增刪改查rest接口)。
package com.tellhow.demo.controller;
import com.tellhow.demo.pojo.User;
import com.tellhow.demo.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RestController
@RequestMapping("/say")
public class UserController {
private static Logger logger= LoggerFactory.getLogger(UserController.class);
@Autowired
private UserRepository userRepository;
@Autowired
private User user;
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public Object sayHello(){
return user;
}
/**
* 查詢所有
* @return
*/
@GetMapping("/users")
public List<User> getUsers(){
return userRepository.findAll();
}
/**
* 新增
* @param user
* @return
*/
@PostMapping("/user")
public Object saveUser(@Valid User user, BindingResult result){
if (result.hasErrors()){
logger.info(result.getFieldError().getField(),result.getFieldError().getDefaultMessage());
return result.getFieldError().getDefaultMessage();
}
return userRepository.save(user);
}
/**
* 修改
* @param user
* @return
*/
@PutMapping("/user")
public User updateUser(User user){
return userRepository.save(user);
}
/**
* 刪除
* @param user
*/
@DeleteMapping("/user")
public void deleteUser(User user){
userRepository.delete(user);
}
}
項目統一異常處理
新建一個ExceptionHandle,使用@ControllerAdvice註解標識。
@ControllerAdvie是spring3.2之後出現的,常用來配合@ExceptionHandle做異常處理
package com.tellhow.demo.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 統一異常處理
*
*/
@ControllerAdvice//控制器增強,
// 配合@ExceptionHandler使用,
// 如果不用@ControllerAdvice,
// 則ExceptionHandler只能在當前出異常的controller裏使用,
// 使用controllerAdvice則可以接觸這個限制,
public class ExceptionHandle {
/**
* 此方法會對項目拋出的異常統一捕獲,然後將異常信息返回給客戶端
* @param e
* @return
*/
@ExceptionHandler//@ExceptionHandler(Exception.class) 括號裏可以可以指定異常類,也可以不指定,可以自動映射
@ResponseBody
public Object handle(Exception e){
//對各種異常進行判斷處理。
if(e instanceof NullPointerException){
//處理
}
//···
return e.getMessage();
}
}
這樣項目發生異常都會被handle方法捕獲並處理返回給客戶端。
AOP處理HTTP請求日誌
新建一個HttpAspect類,用@component+@Aspect註解標識。代表此類是一個切面。
package com.tellhow.demo.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component
public class HttpAspect {
private static Logger logger= LoggerFactory.getLogger(HttpAspect.class);
/**
* 此方法用來做表達式的,切入點表達式,即要增強哪些方法。
*/
@Pointcut("execution(public * com.tellhow.demo.controller.UserController.getUsers())")
public void log(){//
}
@Before("log()")
public void logBefore(){
logger.info("before........................");
}
@After("log()")
public void logAfter(){
logger.info("after***************************");
}
@After("log()")
public void logDetailAfter(JoinPoint point){
ServletRequestAttributes attributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request =attributes.getRequest();
//請求url
logger.info("url={}",request.getRequestURI());
//請求方法
logger.info("method={}",request.getMethod());
//請求ip
logger.info("ip={}",request.getRemoteAddr());
//類方法
logger.info("class_method={}",point.getSignature().getDeclaringType()+"."+point.getSignature().getName());
//參數
logger.info("args={}",point.getArgs());
}
@AfterReturning(returning = "object",pointcut = "log()")//獲得被增強方法的返回值。
public void doAfterReturning(Object object){
System.out.print(object.toString());
}
}
想要對哪些方法記錄日誌,直接寫切點的表達式內即可。
以上即一個完整的springboot項目,東西雖少,五臟俱全。