SpringBoot整合MybatisPlus3.X之Sequence(二)

本文介绍了一个使用H2数据库和MyBatis Plus的Spring Boot项目实例,包括数据库脚本、实体类定义、DAO层接口、配置类及测试类的详细实现,展示了如何在项目中实现序列主键生成。
  • 数据库脚本

    DELETE FROM user;
    ​
    INSERT INTO user (id, name, age, email) VALUES
    (1, 'Jone', 18, 'test1@baomidou.com'),
    (2, 'Jack', 20, 'test2@baomidou.com'),
    (3, 'Tom', 28, 'test3@baomidou.com'),
    (4, 'Sandy', 21, 'test4@baomidou.com'),
    (5, 'Billie', 24, 'test5@baomidou.com');
    ​
    DROP TABLE IF EXISTS user;
    ​
    CREATE TABLE user
    (
        id BIGINT(20) NOT NULL COMMENT '主键ID',
        name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
        age INT(11) NULL DEFAULT NULL COMMENT '年龄',
        email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
        PRIMARY KEY (id)
    );
    ​
    DROP SEQUENCE IF EXISTS SEQ_USER;
    CREATE SEQUENCE SEQ_USER START WITH 1000 INCREMENT BY 1;

     

  • pom.xml

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.2.0</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <scope>runtime</scope>
            </dependency><!-- for testing -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>

     

  • 启动类

    @SpringBootApplication
    @MapperScan("com.mq.sequence.mapper")
    public class SequenceApplication {
    ​
        public static void main(String[] args) {
            SpringApplication.run(SequenceApplication.class, args);
        }
    ​
    }
  • 实体类 注:Oralce这里也是INPUT,Mysql是AUTO

    @Data
    @KeySequence("SEQ_USER")
    public class User {
        
        @TableId(value = "id", type = IdType.INPUT)
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    ​

     

  • Dao层

    public interface UserMapper extends BaseMapper<User> {
    ​
    }
  • 配置类

    @Configuration
    public class MybatisPlusConfig {
    ​
        /**
         * sequence主键,需要配置一个主键生成器
         * 配合实体类注解 {@link KeySequence} + {@link TableId} type=INPUT
         * @return
         */
        @Bean
        public H2KeyGenerator h2KeyGenerator(){
            return new H2KeyGenerator();
        }
    ​
    }

    如果这里是Oracle的话也要注入,Mysql不要

    /**
         * 注册oracle的主键
         * @return
         */
        @Bean
        public OracleKeyGenerator oracleKeyGenerator(){
            return new OracleKeyGenerator();
        }
     
  • application.yml

    # DataSource Config
    spring:
      datasource:
        driver-class-name: org.h2.Driver
        url: jdbc:h2:tcp://192.168.180.115:19200/~/mem/test
        username: root
        password: test
    ​
    # Logger Config
    logging:
      level:
        com.mp.sequence: debug

     

  • 测试类

    @RunWith(SpringRunner.class)
    @SpringBootTest
    class SequenceApplicationTests {
    ​
    ​
        @Autowired(required = false)
        UserMapper userMapper;
    ​
        @Test
        public void testInsert() {
            User user = new User();
            user.setAge(18);
            user.setEmail("test@baomidou.com");
            user.setName("sequence");
            userMapper.insert(user);
            Long id1 = user.getId();
            System.out.println(id1);
            Assert.assertTrue("sequence start with 1000", id1 >= 1000);
            user = new User();
            user.setAge(19);
            user.setEmail("test2@baomidou.com");
            user.setName("sequence2");
            userMapper.insert(user);
            Long id2 = user.getId();
            Assert.assertTrue("squence increment by 1", id2 - id1 == 1);
        }
    ​
    }

     

  • 测试结果:

     

由于Spring Boot 3.5.3和Activiti 7.1.0.M4是较新的版本,整合时可能会遇到版本兼容性问题。以下是一个基于Spring Boot 3.x和Activiti 7.x的整合示例,但请注意,实际使用时可能需要根据具体版本进行调整。 ### 1. 创建Spring Boot项目 首先,创建一个新的Spring Boot项目,并添加必要的依赖。 #### pom.xml ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>activiti-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>activiti-demo</name> <description>Demo project for Spring Boot with Activiti</description> <properties> <java.version>17</java.version> <activiti.version>7.1.0.M4</activiti.version> </properties> <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Activiti Starter --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>${activiti.version}</version> </dependency> <!-- Database (H2 for simplicity) --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- Spring Boot Starter Test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> ``` ### 2. 配置Activiti 在`application.properties`或`application.yml`中配置Activiti。 #### application.properties ```properties # Spring Boot Actuator management.endpoints.web.exposure.include=* # Activiti spring.activiti.database-schema-update=true spring.activiti.history-level=full spring.activiti.db-history-used=true spring.activiti.check-process-definitions=true spring.activiti.process-definition-location-prefix=classpath:/processes/ spring.activiti.process-definition-location-suffixes=**.bpmn20.xml,**.bpmn ``` ### 3. 创建流程定义文件 在`src/main/resources/processes/`目录下创建一个简单的BPMN文件,例如`simple-process.bpmn20.xml`。 #### simple-process.bpmn20.xml ```xml <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.activiti.org/test"> <process id="simpleProcess" name="Simple Process"> <startEvent id="startEvent" name="Start"></startEvent> <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="task1"></sequenceFlow> <userTask id="task1" name="First Task" activiti:assignee="johnDoe"></userTask> <sequenceFlow id="flow2" sourceRef="task1" targetRef="endEvent"></sequenceFlow> <endEvent id="endEvent" name="End"></endEvent> </process> </definitions> ``` ### 4. 创建服务类 创建一个服务类来启动流程实例。 #### ProcessService.java ```java package com.example.activitidemo.service; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.task.Task; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ProcessService { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; public void startProcess() { runtimeService.startProcessInstanceByKey("simpleProcess"); } public void completeTask(String taskId) { taskService.complete(taskId); } public Task getTask(String assignee) { return taskService.createTaskQuery().taskAssignee(assignee).singleResult(); } } ``` ### 5. 创建控制器 创建一个控制器来暴露API以启动流程和完成任务。 #### ProcessController.java ```java package com.example.activitidemo.controller; import com.example.activitidemo.service.ProcessService; import org.activiti.engine.task.Task; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/process") public class ProcessController { @Autowired private ProcessService processService; @PostMapping("/start") public String startProcess() { processService.startProcess(); return "Process started successfully."; } @GetMapping("/task/{assignee}") public Task getTask(@PathVariable String assignee) { return processService.getTask(assignee); } @PostMapping("/complete/{taskId}") public String completeTask(@PathVariable String taskId) { processService.completeTask(taskId); return "Task completed successfully."; } } ``` ### 6. 主应用类 #### ActivitiDemoApplication.java ```java package com.example.activitidemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ActivitiDemoApplication { public static void main(String[] args) { SpringApplication.run(ActivitiDemoApplication.class, args); } } ``` ### 7. 运行和测试 启动应用程序后,可以通过以下API进行测试: 1. 启动流程: ``` POST http://localhost:8080/api/process/start ``` 2. 获取任务: ``` GET http://localhost:8080/api/process/task/johnDoe ``` 3. 完成任务: ``` POST http://localhost:8080/api/process/complete/{taskId} ``` ### 注意事项 1. **版本兼容性**:Spring Boot 3.x和Activiti 7.x的整合可能需要额外的配置或依赖调整。如果遇到问题,可以尝试使用更稳定的版本组合。 2. **数据库配置**:示例中使用的是H2内存数据库,生产环境中应配置为持久化数据库(如MySQL、PostgreSQL等)。 3. **安全性**:示例中未包含安全性配置,实际应用中应添加Spring Security等安全框架。 希望这个示例能帮助你整合Spring Boot 3.5.3和Activiti 7.1.0.M4。如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值