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; } }