10/29-11/11(第五次)学习总结
spring boot开启声明式事务
- 在启动类上开启注解
@SpringBootApplication
@EnableTransactionManagement
public class goodsApp {
public static void main(String[] args) {
SpringApplication.run(goodsApp.class,args);
}
}
- 在serviceimpl 中假如注解
@Transactional
public ResponseResult goodTransaction(Integer goodId, Integer num) {
LambdaQueryWrapper<Good> queryWrapper = new LambdaQueryWrapper<>();
Map<String,Object> map = new HashMap<>();
queryWrapper.eq(Good::getGoodId,goodId);
int ii = 1 / 0;
Good good = goodMapper.selectById(goodId);
if (good.getGoodNums() < num){
return ResponseResult.errorResult(AppHttpCodeEnum.STOCK_INSUFFICIENCY);
}
if (good.getIsDeleted() == 1){
return ResponseResult.errorResult(AppHttpCodeEnum.HAVE_BEEN_DELETED);
}
// String lastTime = DateFormatUtils.format(good.getUpdateTime(),"yyyy-MM-dd HH:mm:ss.SSSSSS");
Date lastTime = good.getUpdateTime();
queryWrapper.clear();
queryWrapper.eq(Good::getGoodId,goodId);
good.setGoodNums(good.getGoodNums() - num);
for (int i = 0; i < 10; i++) {
good = goodMapper.selectById(goodId);
if (good.getGoodNums() < num){
return ResponseResult.errorResult(AppHttpCodeEnum.STOCK_INSUFFICIENCY);
}else {
good.setGoodNums(good.getGoodNums() - num);
}
lastTime = good.getUpdateTime();
good.setUpdateTime(new Date());
queryWrapper.eq(Good::getUpdateTime, lastTime);
final int updateRow = goodMapper.update(good, queryWrapper);
if (updateRow > 0) {
map.put("result", "success");
map.put("success_buy_nums", num);
map.put("good",good);
return ResponseResult.okResult(map);
}
}
return ResponseResult.errorResult(AppHttpCodeEnum.STOCK_INSUFFICIENCY);
}
@RequestBody中的小问题
在postman中进行调试的时候一定要加引号,否则会报错。
- 只能用raw,Json格式
@PostMapping("/checkMsgCode")
public ResponseResult checkMsgCode(
// @RequestParam(value = "tele") String tele,
// @RequestParam(value = "msgCode") String msgCode
@RequestBody Map<String,String>map
){
System.out.println(map);
log.info(map.toString());
String tele = map.get("tele");
String msgCode = map.get("msgCode");
return msgCodeService.checkMsgCode(tele,msgCode);
}
@RequestParam
在postman调试时可以选择的Body
类型有
- form-data
- x-www-form-urlencoded
- raw json格式会报错,不能使用
过滤器和拦截器的区别
多个拦截器的执行顺序
spring mvc 前后端分离响应过程
Restful 风格
操作 | 传统方式 | REST风格 |
---|---|---|
查询操作 | getUserById?id=1 | user/1–>get请求方式 |
保存操作 | saveUser | user–>post请求方式 |
删除操作 | deleteUser?id=1 | user/1–>delete请求方式 |
更新操作 | updateUser | user–>put请求方式 |
spring mvc 常用组件
- DispatcherServlet:前端控制器,不需要工程师开发,由框架提供
作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求
- HandlerMapping:处理器映射器,不需要工程师开发,由框架提供
作用:根据请求的url、method等信息查找Handler,即控制器方法
- Handler:处理器,需要工程师开发
作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理
- HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供
作用:通过HandlerAdapter对处理器(控制器方法)进行执行
- ViewResolver:视图解析器,不需要工程师开发,由框架提供
作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、
RedirectView
- View:视图
作用:将模型数据通过页面展示给用户
mybatis 开启日志输出 sql语句
Mybatis plus Service CRUD 接口
- 首先创建Mapper接口
public interface ApUserMapper extends BaseMapper<ApUser> {
}
- 创建service接口
在这里面可以实现自己的方法,并且一般的增删改查操作都会不需要再自己写,
public interface IApUserService extends IService<ApUser> {
ResponseResult login(LoginDto dto);
}
- 创建service实现类
*/
@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements IApUserService {
@Override
public ResponseResult login(LoginDto dto) {
/*
进行自定义方法的实现
*/
}
}
- controller中注入service
其中增删改查的方法见官网Service CRUD 接口 官方文档
@RestController
@RequestMapping("/api/v1/login")
public class LoginController {
@Autowired
private IApUserService userService;
@PostMapping("/login_auth")
public ResponseResult login(@RequestBody LoginDto dto){
return userService.login(dto);
}
}
逻辑删除
@TableField("is_deleted")
@TableLogic
private Integer isDeleted;
mybatis plus 会自动实现删除操作时将该字段名进行赋值为1的操作,并且查询时我们不需要添加条件 is_deleted = 1,mybatis plus 自动加上该条件。
条件构造器构造查询条件
mybatis 乐观锁
- @Version
- 加拦截器
多表查询
-
创建接口
2. 生成XML文件
-
编写xml中的sql代码
4. service进行调用
自动填充
- 在实体类中加上注解
2. 添加配置类
mybatis插件顺序
多个数据库进行查询
- 加入依赖
- yml进行配置
- 设置使用的是哪个数据库
mybatisx插件可以快速定位mapper.xml接口
可以生产sql代码、xml文件等