spring boot 版本: 2.0.6.RELEASE
mybatis-plus 3.1.2
Druid 1.1.10
oracle 11g
网上的文章都是说怎样在mysql环境下集成的。我在oracle环境下集成uidgenerator。
第一步:建表
CREATE TABLE WORKER_NODE ( ID number(9) NOT NULL , HOST_NAME VARCHAR(64) NOT NULL , PORT VARCHAR(64) NOT NULL , TYPE INT NOT NULL , LAUNCH_DATE DATE , MODIFIED TIMESTAMP NOT NULL , CREATED TIMESTAMP NOT NULL, PRIMARY KEY(ID) );
--创建同义词,自已更改所属用户,这里用的his_ext用户
create or replace public synonym WORKER_NODE for his_ext.WORKER_NODE
-- 创建序列 WorkerNodeId -- create sequence WorkerNodeId_Seq increment by 1 start with 1 minvalue 1 maxvalue 999999999;
创建触发器.让ID列自增
create or replace trigger WORKER_NODE_trigger before insert on WORKER_NODE for each row when (new.ID is null) begin select WorkerNodeId_Seq.nextval into:new.ID from dual; end;
第二步:从官方网站下载uid-generator
官方代码地址:https://github.com/baidu/uid-generator
打包后 ,安装到本地的仓库里。这里给你一个命令参考。
mvn install:install-file -Dfile=E:\uid-generator\target\uid-generator-1.0.0-SNAPSHOT.jar -DgroupId=com.baidu.fsg -DartifactId=uid-generator -Dversion=1.0.0-SNAPSHOT -Dpackaging=jar
第三步:在项目里集成打包的jar.在pom.xml中增加依赖。
<dependency>
<groupId>com.baidu.fsg</groupId>
<artifactId>uid-generator</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
第四步:用mybatis-plus 的code -generator 自动生成 WORKER_NODE表的映射文件,
如何使用自动生成工具,可以到mybatis-plus官网上学习。https://mp.baomidou.com/
注意,如果生成了WorkerNodeEntity 更改为WorkerNodePlusEntity 避免与com.baidu.fsg.uid.worker.entity.WorkerNodeEntity冲突。
第五步:修改生成的WorkerNodeMapper.xml 内容, 注意修改命名空间
注意:ID的类型在mysql里对应BIGINT ,useGeneratedKeys="false" ,oracle不支持自增长列.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.InsurMutilStation.pubbiz.WorkerNode.mapper.WorkerNodeMapper">
<resultMap id="workerNodeRes"
type="com.baidu.fsg.uid.worker.entity.WorkerNodeEntity">
<id column="ID" jdbcType="NUMERIC" property="id" />
<result column="HOST_NAME" jdbcType="VARCHAR" property="hostName" />
<result column="PORT" jdbcType="VARCHAR" property="port" />
<result column="TYPE" jdbcType="INTEGER" property="type" />
<result column="LAUNCH_DATE" jdbcType="DATE" property="launchDate" />
<result column="MODIFIED" jdbcType="TIMESTAMP" property="modified" />
<result column="CREATED" jdbcType="TIMESTAMP" property="created" />
</resultMap>
<insert id="addWorkerNode" useGeneratedKeys="false" keyProperty="id"
parameterType="com.baidu.fsg.uid.worker.entity.WorkerNodeEntity">
INSERT INTO WORKER_NODE
(HOST_NAME,
PORT,
TYPE,
LAUNCH_DATE,
MODIFIED,
CREATED)
VALUES (
#{hostName},
#{port},
#{type},
#{launchDate},
systimestamp,
systimestamp)
</insert>
<select id="getWorkerNodeByHostPort" resultMap="workerNodeRes">
SELECT
ID,
HOST_NAME,
PORT,
TYPE,
LAUNCH_DATE,
MODIFIED,
CREATED
FROM
WORKER_NODE
WHERE
HOST_NAME = #{host} AND PORT = #{port}
</select>
</mapper>
第六步:修改 WorkerNodeMapper 接口文件 ,增加接口
@Repository
public interface WorkerNodeMapper extends BaseMapper<WorkerNodePlusEntity> {
/**
* Get {@link WorkerNodeEntity} by node host
*
* @param host
* @param port
* @return
*/
WorkerNodeEntity getWorkerNodeByHostPort(@Param("host") String host, @Param("port") String port);
/**
* Add {@link WorkerNodeEntity}
*
* @param workerNodeEntity
*/
void addWorkerNode(WorkerNodeEntity workerNodeEntity);
}
第七步:复制源码DisposableWorkerIdAssigner.java到项目里。修改注入的WorkerNodeDAO为WorkerNodeMapper。
第八步:创建配置类:
package com.InsurMutilStation.pubbiz.WorkerNode.service;
import com.baidu.fsg.uid.UidGenerator;
import com.baidu.fsg.uid.impl.CachedUidGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
//xml配置的方式
//@ImportResource(locations = {"classpath:config/cached-uid-spring.xml"})
public class IdGeneratorConfiguration {
@Bean(name = "disposableWorkerIdAssigner")
public DisposableWorkerIdAssigner disposableWorkerIdAssigner(){
DisposableWorkerIdAssigner disposableWorkerIdAssigner = new DisposableWorkerIdAssigner();
return disposableWorkerIdAssigner;
}
@Bean(name="cachedUidGenerator")
public UidGenerator cachedUidGenerator(DisposableWorkerIdAssigner disposableWorkerIdAssigner){
CachedUidGenerator cachedUidGenerator = new CachedUidGenerator();
cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner);
return cachedUidGenerator;
}
}
第九步:增加注解
@EnableAsync(proxyTargetClass = true)
在主类上增加该注解。这里很少有人提到。否则无法注入类。强制使用cglib来做spring动态代理。
第十步:使用该类生成全局ID
public class WorkerNodeServiceImpl extends BaseServiceImpl<WorkerNodeMapper, WorkerNodePlusEntity> implements WorkerNodeService {
@Autowired
private UidGenerator uidGenerator;
@Override
public UidGeneratorReturnIdVo getUidGeneratorId() throws Exception {
UidGeneratorReturnIdVo idVo = new UidGeneratorReturnIdVo();
long uid = uidGenerator.getUID();
String sUid = Convert.toStr(uid);
idVo.setUid(sUid);
return idVo;
}
}
本文详细介绍了在Oracle数据库环境中,如何通过SpringBoot、MyBatis-Plus和Druid等技术,集成百度的UIDGenerator组件,实现全局唯一ID的生成。包括数据库建表、序列和触发器创建,以及代码生成、配置类编写等关键步骤。

被折叠的 条评论
为什么被折叠?



