一、简介
1.简化Spring环境搭建和开发
具体为:
2.项目结构:
二、 SpringBoot 项目属性配置
在application.properties中进行配置:
说明:
1.server.context-path为启动项目时,端口后的名称
2.自定义属性的使用:
3.多属性的自定义可以用封装类的方法(记得写get,set方法):
注:prefix是表示每个属性前加一个字符串(不加就不用写)
使用:
三、 SpringBoot 之 MVC 支持
1.@RequestMapping 配置 url 映射和@Controller 处理 http 请求
例子:
注意:helloWorld 可以直接在templates中建freemaker模板(不用配置路径)
2.@RestController 处理 ajax 请求
下面两种写法等同(可直接输出到页面上):
1.
2.
注意:如果前天要接收json格式数据可用:(或者用其他json框架)
3.@PathVariable 获取 url 参数
例子:
访问:
4.@RequestParam 获取请求参数(post 或 get 都可以)
例子:
注意:加一个required ,当参数为空也可以。
四、SpringBoot SpringDataJpa 支持
注意:需要加入jpa 和 mysql 的支持
1、基本的crud例子:(通过创建实体类,运行自动生成数据库表)
1.先配置
2.写实体类
3.对表进行增删改查(Book 为操作的表的实体,Integer为主键类型)
先继承 jpa 接口
再使用其相关内置方法:
- 查找所有书籍
- 添加图书(method 可以指定只接受post方式提交,也可直接用P@PostMapping)
上面等同于
@PostMapping("/add")
2、自定义查询@Query(原生sql 和 hql)
例子:
注意:nativeQuery=true :意思是,默认为hql ,加上这个代表使用的是原生sql
3、动态查询 Specification 使用(动态sql 可以拼接sql )
-
还要实现下面的接口:
-
使用:
/** * 根据条件动态查询 * @param book * @return */ @RequestMapping("/list2") public ModelAndView list2(Book book){ ModelAndView mav=new ModelAndView(); List<Book> bookList=bookDao.findAll(new Specification<Book>() { // root 为 book 对象, query 为高级查询(这里不用 ),cb为条件构造器 @Override public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate predicate=cb.conjunction(); if(book!=null){ if(book.getName()!=null && !"".equals(book.getName())){ predicate.getExpressions().add(cb.like(root.get("name"), "%"+book.getName()+"%")); } if(book.getAuthor()!=null && !"".equals(book.getAuthor())){ predicate.getExpressions().add(cb.like(root.get("author"), "%"+book.getAuthor()+"%")); } } return predicate; } }); mav.addObject("bookList", bookList); mav.setViewName("bookList"); return mav; }
五、SpringBoot 之事务管理
直接在需要使用的方法上添加 @Transactional:
六、 SpringBoot 之表单验证
- 先在实体类上 添加 注解
- 使用:
如果错误,bindingResult 就会有错误信息,再通过if 判断即可
七、SpringBoot 之切面 AOP
实例:
@Aspect
@Component
public class RequestAspect {
private Logger logger=Logger.getLogger(RequestAspect.class);
//先定义一个切点,下面定义方法在切点的前、后、返回值等
@Pointcut("execution(public * com.java1234.controller.*.*(..))")
public void log(){
}
@Before("log()")
public void doBefore(JoinPoint joinPoint){
logger.info("方法执行前...");
//通过joinPoint 可以获取一些值(ip 、方法名、参数、等等)
ServletRequestAttributes sra=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request=sra.getRequest();
logger.info("url:"+request.getRequestURI());
logger.info("ip:"+request.getRemoteHost());
logger.info("method:"+request.getMethod());
logger.info("class_method:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
logger.info("args:"+joinPoint.getArgs());
Student student=(Student) joinPoint.getArgs()[0];
System.out.println(student);
}
@After("log()")
public void doAfter(JoinPoint joinPoint){
logger.info("方法执行后...");
}
@AfterReturning(returning="result",pointcut="log()")
public void doAfterReturning(Object result){
logger.info("方法返回值:"+result);
}
}