创建项目
配置SpringBoot默认Tomcat的端口号和项目路径
server:
port: 8888
servlet:
context-path: /girl
配置文件中内容
girl:
cupSize: B
age: 18
与配置文件对应的Bean
需要@Component 和 @ConfigurationProperties(prefix="")注解
@Component
@ConfigurationProperties(prefix = "girl")
public class GirlProperties {
private String cupSize;
private Integer age;
public String getCupSize() {
return cupSize;
}
public void setCupSize(String cupSize) {
this.cupSize = cupSize;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
在其他类中使用
//@RestController是@Controller和@ResponseBody的组合注解
@RestController
public class HelloController {
// 通过注解直接使用配置文件属性
// @Value("${cupSize}")
// private String cupSize;
// @Value("${age}")
// private Integer age;
// @Value("${context}")
// private String context;
@Autowired
private GirlProperties girl;
//@GetMapping 和 @PostMapping 都是组合注解
//@RequestMapping(value="/hello",method = RequestMethod.GET)
@GetMapping(value = "/hello")
public String say(){
return girl.getCupSize();
}
}
设置使用默认配置文件
spring:
profiles:
active: dev
@RestController
@Controller
方法注解
@RequestMapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@ResponseBody 表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用
@RequestMapping、@ResponseBody、@RequestBody的区别
https://blog.csdn.net/ff906317011/article/details/78552426
参数列表注解
@PathVariable("") 获取请求路径(url )中的动态参数
@RequestParam 自动匹配表单key-value
@Valid 自动根据表单提交的key-value匹配对应的bean
参数注解
@Autowired
Controller实例
@RestController
public class GirlController {
private final static Logger logger = LoggerFactory.getLogger(GirlController.class);
@Autowired
private GirlService girlService;
@Autowired
private GirlRepository girlRepository;
/**
* @功能:添加
* @参数:cupSize
* @参数:age
* @return: com.whw.domain.Result
* @时间:2018/7/24 18:37
*/
@PostMapping(value = "/addGirl")
public Result addGirl(@Valid Girl girl, BindingResult bindingResult) {
Result result = new Result();
if (bindingResult.hasErrors()) {
return ResultUtil.errror(1,bindingResult.getFieldError().getDefaultMessage());
}
girl.setCupSize(girl.getCupSize());
girl.setAge(girl.getAge());
return ResultUtil.success(girlRepository.save(girl));
}
// public Girl addGirl(@RequestParam("cupSize") String cupSize, @RequestParam("age") Integer age) {
// Girl girl = new Girl();
// girl.setAge(age);
// girl.setCupSize(cupSize);
// return girlRepository.save(girl);
// }
/**
* @功能:通过id查询
* @参数:id
* @return: java.util.Optional
* @时间:2018/7/25 12:57
*/
@GetMapping(value = "/selectGirl/{id}")
public Optional selectGirl(@PathVariable("id") Integer id) {
return girlRepository.findById(id);
}
/**
* @功能:更新
* @参数:id
* @参数:cupSize
* @参数:age
* @return: com.whw.enitiy.Girl
* @时间:2018/7/25 12:58
*/
@PutMapping(value = "/updateGirl/{id}")
public Girl updateGirl(@PathVariable("id") Integer id, @RequestParam String cupSize, @RequestParam Integer age) {
Girl girl = new Girl();
girl.setId(id);
girl.setCupSize(cupSize);
girl.setAge(age);
return girlRepository.save(girl);
}
/**
* @功能:删除
* @参数:id
* @return: void
* @时间:2018/7/25 12:59
*/
//public void deleteGirl(@RequestParam(value = "id",required = false,defaultValue = "0")Integer id)
@DeleteMapping(value = "/deleteGirl/{id}")
public void deleteGirl(@PathVariable("id") Integer id) {
girlRepository.deleteById(id);
}
}
方法注解
@Query
自定义sql实例
public interface GroupesStuRepository extends JpaRepository{
@Query("select u from User u where u.uName like '%?1%'")
List queryByUname(String name);
@Query("select gs from GroupesStu gs join gs.groupes groupes where groupes.gId=?1")
List queryByGid(Integer gid);
@Query("select gs from GroupesStu gs join gs.stu user where user.uId=?1")
List queryByUid(Integer uid);
@Query("select gs from GroupesStu gs join gs.stu user join gs.groupes groupes where user.uId=?1 and groupes.gId=?2")
GroupesStu queryByUGid(Integer uid,Integer gid);
}
文件目录
类注解
@Service
实例
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private GroupesRepository groupesRepository;
@Autowired
private TopicRepository topicRepository;
@Autowired
private GroupesStuRepository groupesStuRepository;
/**
*@功能:查询用户是否存在--登录
*@参数:user
*@return: com.tjrac.exam.domain.User
*@时间:2018/9/3 10:27
*/
@Override
public User logOn(User user){
User user1 = userRepository.findOne(user.getuId());
String password = new MD5Util().getMD5(user.getPassword());
if (password.equals(user1.getPassword())) {
return user1;
} else {
throw new UserException(UserEnums.QUERY_FAILURE);
}
}
/**
*@功能:新建用户
*@参数:user
*@return: com.tjrac.exam.domain.User
*@时间:2018/9/3 10:27
*/
@Override
public User createUser(User user){
user.setPassword(new MD5Util().getMD5(user.getPassword()));
User user1 = userRepository.save(user);
if(user1==null){
throw new UserException(UserEnums.INSERT_FAILURE);
}else{
return user1;
}
}
/**
*@功能:查询所有用户
*@参数:
*@return: java.util.List
*@时间:2018/9/3 10:25
*/
@Override
public List queryByUname(String uName) {
List userList = userRepository.queryByUname(uName);
return userList;
}
/**
*@功能:查询所有学生
*@参数:
*@return: java.util.List
*@时间:2018/9/4 19:36
*/
@Override
public List queryStuList() {
List userList = userRepository.findAllStu(3);
return userList;
}
/**
*@功能:查询所有用户
*@参数:
*@return: java.util.List
*@时间:2018/9/4 19:36
*/
@Override
public List queryList() {
List userList = userRepository.findAll();
return userList;
}
/**
*@功能:查询用户
*@参数:uid
*@return: com.tjrac.exam.domain.User
*@时间:2018/9/3 16:57
*/
@Override
public User queryByUid(Integer uid) {
return userRepository.findOne(uid);
}
/**
*@功能:删除用户
*@参数:
*@return: java.util.List
*@时间:2018/9/3 10:25
*/
@Override
@Transactional
public void deleteUser(Integer id){
User user = userRepository.findOne(id);
if(user.getAuthority()==2){ //教师
//查询该教师下所有考题组
List groupeList = groupesRepository.queryByUid(id);
for(Groupes g:groupeList){ //遍历该教师所有考题组
//查询考题组下所有题目
List topicList = topicRepository.queryByGid(g.getgId());
topicRepository.delete(topicList);
//查询考题组下所有考题组-学生关系
List groupesStuList = groupesStuRepository.queryByGid(g.getgId());
groupesStuRepository.delete(groupesStuList);
}
groupesRepository.delete(groupeList);
}else if(user.getAuthority()==3){
//查询考题组下所有考题组-学生关系
List groupesStuList = groupesStuRepository.queryByUid(user.getuId());
groupesStuRepository.delete(groupesStuList);
}
userRepository.delete(id);
}
}
需要再pom.xml中加入依赖
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
类注解
@Entity 实体类注解
参数注解
@Id 主键注解
@GeneratedValue 自增注解
@Min(value = 18,message = "") 设置参数最小值注解
实例
@Entity
public class Girl {
@Id //主键
@GeneratedValue //自增注解
private Integer id;
private String cupSize;
@Min(value = 18,message = "未成年少女禁止入内")
private Integer age;
public Girl() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCupSize() {
return cupSize;
}
public void setCupSize(String cupSize) {
this.cupSize = cupSize;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Girl{" +
"id=" + id +
", cupSize='" + cupSize + '\'' +
", age=" + age +
'}';
}
}
AOP示意图
在pom.xml中添加AOP依赖
org.springframework.boot
spring-boot-starter-aop
类注解
@Aspect
@Component
方法注解
@Before 拦截的方法之前执行
@After 拦截的方法执行之后
@AfterReturning 拦截的方法执行之后返回值处理
@Pointcut 拦截点 定义在公共的方法上 用于规划统一的拦截地址
AOP日志切面示例
@Aspect
@Component
public class HttpAspect {
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class); // import org.slf4j.Logger;
//拦截getGirls方法 com.whw.controller.GirlController.*所有方法 (..)不管什么参数
@Pointcut("execution(public * com.whw.controller.GirlController.getGirls(..))")
public void log(){
}
@Before("log()")
public void doBefore(JoinPoint joinPoint){
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//url
logger.info("url:{}",request.getRequestURL());
//method
logger.info("method:{}",request.getMethod());
//ip
logger.info("ip:{}",request.getRemoteAddr());
//类方法
logger.info("class_method:{}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
//参数
logger.info("args:{}",joinPoint.getArgs());
}
@After("log()")
public void doAfter(){
logger.info("22222222222222222222222");
}
@AfterReturning(returning = "object",pointcut = "log()")
public void doAfterReturning(Object object){
logger.info("response:{}",object.toString());
}
}
异常捕获处理实例
@ControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e){
if(e instanceof GirlException){
GirlException girlException = (GirlException)e;
logger.error("系统异常:{}",girlException);
return ResultUtil.errror(girlException.getCode(),girlException.getMessage());
}else{
logger.error("系统异常:{}",e);
return ResultUtil.errror(-1,"未知错误");
}
}
}
自定义异常
自定义异常类继承RuntimeException(继承Exception 不会进行事务回滚)
异常数据字典(枚举)
public enum ResultEnum {
UNKNOW_ERROR(-1,"未知错误"),
SUCCESS(0,"成功"),
PRIMARY_SCHOOL(100,"你可能在上小学"),
MIDDLE_SCHOOL(101,"你可能在上初中"),
COLLAGE(102,"你可能在上大学");
private Integer code;
private String msg;
ResultEnum(Integer code,String msg){
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
需要再pom.xml中加入依赖
javax.xml.bind
jaxb-api
2.2.12
在配置文件(yml或者xml)中加入
yml:
spring:
jpa:
properties:
hibernate:
enable_lazy_load_no_trans: true
xml:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
类注解
@RunWith(SpringRunner.class)
@SpringBootTest
maven打包时跳过单元测试命令
mvn clean package -Dmaven.test.skip=true
文件目录:
poml依赖:
org.springframework.boot
spring-boot-starter-thymeleaf
HTML:
Bootstrap:
thymeleaf:
严格遵守html格式
https://blog.csdn.net/qq_32923745/article/details/78257686