2023.05.31培训
task1:MybatisPlus的使用
task2:SpringMVC常用接口开发
task3:JSON、接口测试
task4:SpringMVC拦截器与过滤器
目录
一、MybatisPlus
1.1DO类
1.2Mapper接口
1.3编写测试类测试
1.4Mybatis和MybatisPlus
二、SpringMVC常用开发
2.1项目结构
2.2 ProductController
2.2.1基础接口测试
2.2.2使用BaseMapper操作数据
2.2.3通过浏览器传入参数操作数据
2.2.4手写Mybatis语句操作数据
三、Post请求与JSON
3.1使用Post请求
3.2将请求转化为对象并返回
四、SpringMVC拦截器与过滤器
4.1创建拦截器
4.1.1第一个拦截器
4.1.2第二个拦截器
一、MybatisPlus
1.1DO类
在ProductDO类上加上@TableName(“t_ykx_product”)注解,否则启动会报找不到表的错误
1.2Mapper接口
用Mapper接口继承BaseMapper
public interface ProductMapper extends BaseMapper<ProductDO>
1.3编写测试类测试
单一查询
@Component
public class TestClass {
@Autowired
private ProductMapper productMapper;
@PostConstruct
private void init(){
ProductDO productDO = productMapper.selectById(1);
System.out.println("查询结果:" + productDO);
}
}
查询结果:
批量查询
需要使用LambdaQueryWrapper 实例 lqw
lqw添加查询的条件(eq() 是 添加 = 条件)
若不添加查询条件则查询表中的所有数据
将lqw传入selectList()中
@PostConstruct
private void init(){
LambdaQueryWrapper<ProductDO> lqw = new LambdaQueryWrapper<>();
lqw.eq(ProductDO::getType, "book"); //添加 = 条件 where type = "book"
List<ProductDO> productDOS = productMapper.selectList(lqw);
for (ProductDO productDO : productDOS) {
System.out.println("product:" + productDO);
}
}
查询结果:
1.4Mybatis和MybatisPlus
BaseMapper里对数据库操作的方法都是封装好了的,使用起来很方便,但是有时候不能满足实际需求,也就是不灵活,无法灵活添加注解,所以不能一味地使用BaseMapper。
尽量手写Mybatis语句
二、SpringMVC常用开发
2.1项目结构
system下新建product包,在里面建三个平级的包adapter、application、domain
adapter是适配器的意思,在里面新建controller包
application建service包
domain建reader、wirter包
2.2 ProductController
controller包内新建ProductController类,标注@Controller注解和@ResponseBody注解
@Controller //标记这个类是Spring的一个组件,用于向外提供接口 @ResponseBody //强制将所有接口的返回值变为String
2.2.1基础接口测试
编写ProductController类,在浏览器输入http://127.0.0.1:8000/product/getStr
获取结果
//@Controller //标记这个类是Spring的一个组件,用于向外提供接口
//@ResponseBody //强制将所有接口的返回值变为String(本质上转化为JSON)
@RestController //这个相当于上面俩
@RequestMapping(value = "/product")
public class ProductController {
@GetMapping("/getMsg")
public double getMsg(){
System.out.println("getMsg正在执行~~~");
return Math.random();
}
@GetMapping("/getStr")
public String getStr(){
return "test~";
}
}
2.2.2使用BaseMapper操作数据
getAll返回product表内所有数据,在浏览器显示
@RestController
@RequestMapping(value = "/product")
public class ProductController {
@Autowired
private ProductMapper productMapper;
@GetMapping("/getAll")
public List<ProductDO> getAllProductInfo(){
LambdaQueryWrapper<ProductDO> lqw = new LambdaQueryWrapper<>();
List<ProductDO> productDOS = productMapper.selectList(lqw);
return productDOS;
}
}
2.2.3通过浏览器传入参数操作数据
还是在ProductController类进行操作
1)在方法内设置参数,加上@RequestParam注解 能够绑定参数
)在浏览器输入对应路径 并加上参数(用 ?id=1 传递参数)
@GetMapping("/getProductById")
public List<ProductDO> getProductById(@RequestParam("id") String id){
//@RequestParam注解 绑定参数
LambdaQueryWrapper<ProductDO> lqw = new LambdaQueryWrapper<>();
lqw.eq(ProductDO::getId,id);
List<ProductDO> productDOS = productMapper.selectList(lqw);
return productDOS;
}
2.2.4手写Mybatis语句操作数据
1)ProductMapper类里使用Mybatis语句
@Select("select *from t_ykx_product where id = #{id};") ProductDO[] selectProduct(@Param("id") String id);
2)ProductController类写相应的方法
@RestController
@RequestMapping(value = "/product")
public class ProductController {
@Autowired
private ProductMapper productMapper;
@GetMapping("/getProductById")
public ProductDO[] getProductById(@RequestParam("id") String id){
ProductDO[] productDOS = productMapper.selectProduct(id);
return productDOS;
}
}
三、Post请求与JSON
3.1使用Post请求
@PostMapping用法和GetMapping用法相同
使用@RequestBody注解可以在方法形参处获取body
public class ProductController {
@Autowired
private ProductMapper productMapper;
//Post请求的使用
@PostMapping("/postTest")
public void postTest(@RequestBody String str){
System.out.println(str);
}
}
使用Postman访问 并将body返回
返回结果打印在控制台上
3.2将请求转化为对象并返回
使用Post发送ProductDO类的JSON,获取转化为ProductDO的对象的id,并使用Mybatis进行查询,最后返回查询结果
1)post请求的方法稍作修改
//Post请求的使用
@PostMapping("/returnProduct")
public ProductDO[] postTest(@RequestBody ProductDO pDO){
//获取传过来的JSON的ID
int id = pDO.getId();
//使用ID进行查询并返回结果
ProductDO[] productDOS = productMapper.selectProduct(id);
System.out.println(productDOS);
return productDOS;
}
3)传递JSON(自动绑定),并获取结果
四、SpringMVC拦截器与过滤器
4.1创建拦截器
4.1.1第一个拦截器
1)该类需要实现HandlerInterceptor接口
2)重写三个方法
public class AccessTokenInterceptor implements HandlerInterceptor {
//在业务执行之前就执行
//如果返回false 请求就被打回
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String accessToken = request.getHeader("accessToken");
if(accessToken == null || "".equals(accessToken)){
System.out.println("前置没有找到AccessToken,不可以访问哦~");
return false;
}else{
System.out.println("找到AccessToken!");
return true;
}
}
//在业务执行之后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
//在流程完成之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
3)在ProductController类里修改方法
@RestController //这个相当于上面俩
@RequestMapping(value = "/product")
public class ProductController {
@Autowired
private ProductMapper productMapper;
@GetMapping("/getMsg")
public void getMsg(){
System.out.println("getMsg 业务 执行");
}
}
注:此时使用浏览器进行访问,并没有执行拦截器里的方法
解决上述问题:
在web包下创建一个WebConfig 作为配置类,加上@Configuration注解,实现WebMvcConfigurer接口,重写addInterceptors方法
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//给拦截器注册器添加新的拦截器
registry.addInterceptor(new AccessTokenInterceptor())
.addPathPatterns("/**");//添加路径匹配,匹配上了才会拦截
}
}
再次执行,因为没有accessToken的值,所以被拦截了。
在Postman里设置一个accessToken值,成功执行
4.1.2第二个拦截器
同第一个拦截器一样,需要实现接口,重写方法
public class IPLimitInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String ip = request.getHeader("IP");
if(ip == null || "".equals(ip) || !"1.1.1.1".equals(ip)){
System.out.println("前置 IP不对!!!");
return false;
}else{
System.out.println("前置 IP正确~~~");
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("IPLimitInterceptor 后置");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("IPLimitInterceptor 最终");
}
}
同样需要在WebConfig配置里添加拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//给拦截器注册器添加新的拦截器
registry.addInterceptor(new AccessTokenInterceptor())
.addPathPatterns("/**");//添加路径匹配,匹配上了才会拦截
registry.addInterceptor(new IPLimitInterceptor())
.addPathPatterns("/**");
}
}
最后在Postman里添加键就能成功执行了
三个区域的执行顺序如下