SpringBoot和JPA整合UidGenerator 生成器

开始

一、数据库文件

drop database if exists demo;
create database if not exists demo;
use demo;
DROP TABLE IF EXISTS WORKER_NODE;
CREATE TABLE WORKER_NODE
(
    ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
    HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name',
    PORT VARCHAR(64) NOT NULL COMMENT 'port',
    TYPE INT NOT NULL COMMENT 'node type: ACTUAL or CONTAINER',
    LAUNCH_DATE DATE NOT NULL COMMENT 'launch date',
    MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time',
    CREATED TIMESTAMP NOT NULL COMMENT 'created time',
    PRIMARY KEY(ID)
)
 COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;

二、依赖

 <!--web启动器-->
<dependency>
   	  <groupId>org.springframework.boot</groupId>
   	  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jpa 数据库框架 启动器-->
<dependency>
   	  <groupId>org.springframework.boot</groupId>
   	  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql jar包-->
<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
</dependency>
<!-- Apache Commons -->
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.2</version>
</dependency>
<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.xfvape.uid/uid-generator -->
<dependency>
    <groupId>com.xfvape.uid</groupId>
    <artifactId>uid-generator</artifactId>
    <version>0.0.4-RELEASE</version>
</dependency>

三、application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/demo?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&connectTimeout=0&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root

四、把 WorkerNodeEntity 实体类复制到自己的包(package)中,添加了两个注解

WorkerNodeEntity.java     源文件

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Entity //修改的地方
public class WorkerNodeEntity {
    @Id //修改的地方
    private long id;

    private String hostName;

    private String port;

    private int type;

    private Date launchDate = new Date();

    private Date created;

    private Date modified;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getHostName() {
        return hostName;
    }

    public void setHostName(String hostName) {
        this.hostName = hostName;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public Date getLaunchDate() {
        return launchDate;
    }

    public void setLaunchDate(Date launchDate) {
        this.launchDate = launchDate;
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    public Date getModified() {
        return modified;
    }

    public void setModified(Date modified) {
        this.modified = modified;
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }

}

注意 所有的 WorkerNodeEntity导入的是复制的类,而且要一致

五、Dao层
(1)base

@NoRepositoryBean
public interface SysBaseDao<T,ID extends Serializable> extends JpaRepository<T,ID>, JpaSpecificationExecutor<T> {
}

(2) extends

@Repository
public interface SysWorkerNodeDao extends SysBaseDao<WorkerNodeEntity,Long>, CrudRepository<WorkerNodeEntity,Long> {
    @Query(value = "select * from worker_node where HOST_NAME=:host and port=:port",nativeQuery = true)
    WorkerNodeEntity getWorkerNodeByHostPort(@Param("host") String host, @Param("port") String port);
    @Query(value = "insert into worker_node(ID, HOST_NAME, PORT, TYPE, LAUNCH_DATE, MODIFIED, CREATED)values(:#{#workerNodeEntity.id},:#{#workerNodeEntity.hostName},:#{#workerNodeEntity.port},:#{#workerNodeEntity.type},:#{#workerNodeEntity.launchDate},:#{#workerNodeEntity.modified},:#{#workerNodeEntity.created})",nativeQuery = true)
    @Modifying
    @Transactional
    void addWorkerNode(@Param("workerNodeEntity") WorkerNodeEntity workerNodeEntity);
}

六、自定义 WorkerIdAssigner

public class MyDisposableWorkerIdAssigner implements WorkerIdAssigner {
    @Autowired
    private SysWorkerNodeDao workerNodeDao;
    @Override
    @Transactional
    public long assignWorkerId() {
        // build worker node entity
		//别导入错了,导入刚才复制的WorkerNodeEntity类
        WorkerNodeEntity workerNodeEntity = buildWorkerNode();

        // add worker node for new (ignore the same IP + PORT)
        workerNodeDao.addWorkerNode(workerNodeEntity);

        return workerNodeEntity.getId();
    }
    private WorkerNodeEntity buildWorkerNode() {
        WorkerNodeEntity workerNodeEntity = new WorkerNodeEntity();
        if (DockerUtils.isDocker()) {
            workerNodeEntity.setType(WorkerNodeType.CONTAINER.value());
            workerNodeEntity.setHostName(DockerUtils.getDockerHost());
            workerNodeEntity.setPort(DockerUtils.getDockerPort());
        } else {
            workerNodeEntity.setType(WorkerNodeType.ACTUAL.value());
            workerNodeEntity.setHostName(NetUtils.getLocalAddress());
            workerNodeEntity.setPort(System.currentTimeMillis() + "-" + RandomUtils.nextInt(100000));
        }
        workerNodeEntity.setCreated(new Date());
        workerNodeEntity.setModified(new Date());
        workerNodeEntity.setLaunchDate(new Date());
        return workerNodeEntity;
    }
}

七、配置类

@Configuration
public class CachedUidGeneratorConfig {
    @Bean
    public MyDisposableWorkerIdAssigner disposableWorkerIdAssigner(){
        return new MyDisposableWorkerIdAssigner();
    }
    @Bean
    public CachedUidGenerator cachedUidGenerator(MyDisposableWorkerIdAssigner disposableWorkerIdAssigner){
        CachedUidGenerator cachedUidGenerator = new CachedUidGenerator();
        cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner);
        //以下为可选配置, 如未指定将采用默认值
        cachedUidGenerator.setTimeBits(29);
        cachedUidGenerator.setWorkerBits(21);
        cachedUidGenerator.setSeqBits(13);
        cachedUidGenerator.setEpochStr("2016-09-20");
        cachedUidGenerator.setBoostPower(3);
        cachedUidGenerator.setScheduleInterval(60L);
        return cachedUidGenerator;
    }
}

八、service

public interface UidGenService {
     long getUid();
}

九、impl

@Service
public class UidGenServiceImpl implements UidGenService {
    @Resource
    private UidGenerator uidGenerator;
    @Override
    public long getUid() {
        return uidGenerator.getUID();
    }
}

十、controller

@RestController
public class UidGenController {
    @Resource
    private UidGenService service;
    @RequestMapping("/uid")
    public Object getUid(){
        Map<String,Object> map = new LinkedHashMap<>();
        map.put("uid",service.getUid());
        return map;
    }
}

运行成功
在这里插入图片描述

结束

交流:2371778707@qq.com

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈增林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值