当前位置: 首页 > article >正文

后端MVC三层架构,Mybatis ,雪花算法生成唯一id

一.MVC

MVC(Model View Controller),它是一种思想,他把软件系统分为 以下三部分:

Model(模型):用来处理程序中数据逻辑的部分(service,dao层)

View(视图):在应用程序中,专门和浏览器进行交互,展示数据的资源(前端)

Contreller(控制器):可以理解成是一个分发器,来决定对于视图发来的请求,需要用哪一个模型来处理,以及处理完后需要跳回到哪一个视图,也就是用来连接视图和模型的(收请求,返回响应)

这里的项目结构清晰明了,controller层接受到前端发来的请求,然后进行处理调用service层中的方法,进行执行业务逻辑(进行操作数据库的访问),最后返回controller层,进行返回对象状态(数据或则状态)

二.mybatis框架执行数据库操作(首先需要配置号mybatis的xml)

使用一个mapper映射,在接口中进行定义数据库中的执行方法,并通过注解进行操作数据库

1:需要将mapper配置文件进行储存到同一目录,并且名字要相同。

(mybatis中可以使用注解或者利用xml文件进行操作数据库)

2.在mapper映射文件中进行操作数据库(利用注解)

 三.雪花算法进行计算唯一uid

这里包装了一个工具类

package com.csdn.util;

public class UIDGenerator {

    // Snowflake 算法参数
    private final static long twepoch = 1288834974657L;
    private final static long workerIdBits = 5L;
    private final static long datacenterIdBits = 5L;
    private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);
    private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
    private final static long sequenceBits = 12L;

    private final static long workerIdShift = sequenceBits;
    private final static long datacenterIdShift = sequenceBits + workerIdBits;
    private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
    private final static long sequenceMask = -1L ^ (-1L << sequenceBits);

    private long workerId;
    private long datacenterId;
    private long sequence = 0L;
    private long lastTimestamp = -1L;

    // 单例模式,确保工具类只有一个实例
    private static UIDGenerator instance;

    private UIDGenerator(long workerId, long datacenterId) {
        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
        }
        if (datacenterId > maxDatacenterId || datacenterId < 0) {
            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
        }
        this.workerId = workerId;
        this.datacenterId = datacenterId;
    }

    // 获取唯一实例
    public static synchronized UIDGenerator getInstance() {
        if (instance == null) {
            // 在初始化时指定workerId和datacenterId,这里默认都设置为1
            instance = new UIDGenerator(1, 1);
        }
        return instance;
    }

    // 生成唯一ID
    private synchronized long nextId() {
        long timestamp = timeGen();

        if (timestamp < lastTimestamp) {
            throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
        }

        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & sequenceMask;
            if (sequence == 0) {
                timestamp = tilNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0L;
        }

        lastTimestamp = timestamp;

        return ((timestamp - twepoch) << timestampLeftShift) |
               (datacenterId << datacenterIdShift) |
               (workerId << workerIdShift) |
               sequence;
    }

    private long tilNextMillis(long lastTimestamp) {
        long timestamp = timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = timeGen();
        }
        return timestamp;
    }

    private long timeGen() {
        return System.currentTimeMillis();
    }

    // 公共方法:生成并返回8位数字的唯一UID
    public String generateUID() {
        long id = nextId();
        return String.format("%08d", id % 100000000);
    }
}


http://www.kler.cn/news/289289.html

相关文章:

  • 『功能项目』销毁怪物蛋的Shaders消融特效【17】
  • SpringDataJPA系列(5)@Query应该怎么用?
  • QT connect的使用
  • 算法练习题11:单词出现次数
  • Android kotlin使用Netty网络框架实践(客户端、服务端)
  • 新版Pycharm的Available Packages里面为空,新版没有Manage Repositories功能,如何解决
  • OpenGL/GLUT实践:弹簧-质量-阻尼系统模拟摆动的绳子和布料的物理行为(电子科技大学信软图形与动画Ⅱ实验)
  • 《React Hooks:让你的组件更灵活》
  • Android之电量优化
  • 【论文笔记】Multi-Task Learning as a Bargaining Game
  • 4.3 python 编辑单元格
  • 惠中科技:开启综合光伏清洗新征程
  • 文件包含所用协议实战
  • sql-labs56-60通关攻略
  • 设计模式结构型模式之适配器模式
  • vue3子组件修改父组件传来的值
  • 普元Devops-在云主机上拉取harbor的docker镜像并部署
  • 2017年系统架构师案例分析试题五
  • JVM理论篇(一)
  • Flask的secret_key作用
  • Nginx负载均衡数据流分析
  • ES6 类-总结
  • C#——扩展方法
  • 【微信小程序】全局数据共享 - MobX
  • xxxSendMessageBSM函数分析
  • HarmonyOS NEXT应用开发: 常用页面模板
  • 使用docker compose一键部署 Openldap
  • el-table中文排序-前端
  • Java 输入与输出之 NIO.2【AIO】【内存映射文件】【自动资源管理】探索之【四】
  • java-URLDNS 链条审计