看代码所学3

1、随机数:RandomUtils.nextInt(起点,终点);   Int可更改
 
2、为什么使用uuid作为主键而不是使用自增id,因为可能存在分库,不能控制每个分库中id的自增点,每个库中的id会重复;然后id会增长到什么规模都不知道,所以使用uuid是个比较好的选择。
        uuid生成:UUIDUtils.createUuid(x -> lessonGroupDao.getUuid(x) != null)
        createUuid中存放的是一个断言式接口。
          原始的生成方式:将”—“都替换成”"
         UUID.randomUUID().toString().replaceAll("-", "”);
 
3、怎么在mybatis中插入了自增主键之后还要能够取出这个主键
        在insert或update的配置中加入 useGeneratedKeys=“true” , keyProperty="主键名"
        <insert msgId”>
 
4、rocketmq
        消息顺序性:生产者先生产消息m1,m2到mqserver,然后,为了保证m1先于m2被消费,则让mqserver先发送m1,当消费者接收到后将应答信号发送到mqserver,如果mqserver接受失败就重新发送m1到消费者,知道成功;当mqserver接受应答信号成功就发送m2。但是,有可能m1已经被消费了,但是应答信号发送失败,这就产生了消息重复发送的可能。
        消息重复性:这个就设计到了等幂性了:不同消息在同一个系统上的响应一致。可以在消费端设置一个去重的日志表,将同样id的消息失效,但是会影响性能,所以rocketmq的去重需要在业务中进行。
 
5、MultipartFile file   前端传来的是一个文件
    MultipartHttpServletRequest request 前端传来的是一个request请求(其中可能包含多文件)
    
    request.getFileNames——>获取传输的多个文件的文件名
    Iterator<String> it = request.getFileNames();
    While(it.hasNext()){
          MultipartFile file = request.getFile(it.next);
    }
   
    file.getName——>获取表单对应名称(不是文件名称)
    file.getOriginalFileName——>获取文件名字
文件后缀获取方法:
String fileExt = StringUtils.isBlank(originalName) ?
        ContentTypeUtils.getFileExt(contentType) :
        "." + originalName.substring(originalName.lastIndexOf('.') + 1);
这个后缀获取需要解释几个地方:
    1、由于我们使用contentType,然后参考MIME文件的话是不靠谱的,因此我们还是尽量使用自带的文件尾缀,使用contentType只是为了兜底
    2、而当我们使用substring的时候我们没有用文件自带的“.”,而是我们自己加一个”.”,因为极端情况下,文件名是啥都没有的,连.都没有,我们用lastIndexOf(’.’)就会返回-1,+1为了截取.后面的内容(也是为了防止报错,很细节这个地方),然后我们给这个前面加上个自己做的“.”