{"id":28314655,"url":"https://github.com/julxxy/dtt-spring-boot-parent","last_synced_at":"2025-09-10T10:40:25.181Z","repository":{"id":46140784,"uuid":"513494210","full_name":"julxxy/dtt-spring-boot-parent","owner":"julxxy","description":"DTT is an object-oriented Java framework that enables developers to automatically create database tables based on domain models through annotation-driven development, increasing productivity for developers. The core concept of DTT is domain-driven table, which makes you focus more on domain objects rather than database tables.","archived":false,"fork":false,"pushed_at":"2025-06-19T17:22:50.000Z","size":4800,"stargazers_count":252,"open_issues_count":0,"forks_count":23,"subscribers_count":13,"default_branch":"main","last_synced_at":"2025-07-22T14:20:45.880Z","etag":null,"topics":["ddd-architecture","domain-driven-table","domain-to-table","dtt","java","javabean-to-table","mybatis","spring-boot","spring-boot-starter","springboot","table"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/julxxy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-07-13T11:27:58.000Z","updated_at":"2025-06-21T14:15:24.000Z","dependencies_parsed_at":"2025-06-19T22:49:31.374Z","dependency_job_id":"60c53de8-fd37-453b-912f-b10c1f69cad6","html_url":"https://github.com/julxxy/dtt-spring-boot-parent","commit_stats":{"total_commits":299,"total_committers":3,"mean_commits":99.66666666666667,"dds":"0.026755852842809347","last_synced_commit":"bc75cb1c767f127aa8a946635d572c0bb3c07c07"},"previous_names":["weasley-j/mydtt-plus-spring-boot-starter","julxxy/dtt-spring-boot-parent","weasley-j/dtt-spring-boot-parent"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/julxxy/dtt-spring-boot-parent","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julxxy%2Fdtt-spring-boot-parent","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julxxy%2Fdtt-spring-boot-parent/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julxxy%2Fdtt-spring-boot-parent/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julxxy%2Fdtt-spring-boot-parent/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/julxxy","download_url":"https://codeload.github.com/julxxy/dtt-spring-boot-parent/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julxxy%2Fdtt-spring-boot-parent/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274447885,"owners_count":25287115,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-10T02:00:12.551Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ddd-architecture","domain-driven-table","domain-to-table","dtt","java","javabean-to-table","mybatis","spring-boot","spring-boot-starter","springboot","table"],"created_at":"2025-05-24T19:10:36.774Z","updated_at":"2025-09-10T10:40:25.171Z","avatar_url":"https://github.com/julxxy.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dtt-spring-boot-starter\n\n## [![Maven Central](https://img.shields.io/maven-central/v/io.github.weasley-j/dtt-spring-boot-starter)](https://search.maven.org/artifact/io.github.weasley-j/dtt-spring-boot-starter)|[中文文档](https://github.com/Weasley-J/dtt-spring-boot-parent/blob/main/README_zh.md)\n\n`DTT` is an object-oriented Java framework that enables developers to automatically create database tables based on domain models through annotation-driven development, increasing productivity for developers. The core concept of `DTT` is domain-driven table, which makes you focus more on domain objects rather than database tables.\n\n\u003e - What can DTT do?\n\u003e\n\u003e Tips: Read about DDT's features to learn more.\n\u003e \n\u003e(a) Converts your Java domain object to `RDB` table `DDL` statements and auto create them.\n\u003e \n\u003e(b) Supports the ability for `mybatis` to create table lazily on demand just like `hibernate` and `spring-data-jpa`  can do.\n\u003e \n\u003e(c) Exports an `all-in-one` DDL statements for all tables as local file.\n\u003e \n\u003e(d) Retains comments for columns of data tables for the Java developers who is non-native English speaker.\n\u003e \n\u003ehere is an example for the way of `0-code` injection to parse Java document to a table DDL statements.\n\u003e \n\u003e- Chinese developer\n\u003e \n\u003e1. Java domain\n\u003e \n\u003e```java\n\u003e import com.example.enums.MemberType;\n\u003eimport lombok.AllArgsConstructor;\n\u003e import lombok.Builder;\n\u003eimport lombok.Data;\n\u003e import lombok.NoArgsConstructor;\n\u003e import lombok.experimental.Accessors;\n\u003e \n\u003e import java.io.Serializable;\n\u003e import java.math.BigDecimal;\n\u003e import java.time.LocalDate;\n\u003e import java.time.LocalDateTime;\n\u003e import java.time.LocalTime;\n\u003e \n\u003e /**\n\u003e  * 用户信息\n\u003e  */\n\u003e @Data\n\u003e @Builder\n\u003e @AllArgsConstructor\n\u003e @NoArgsConstructor\n\u003e @Accessors(chain = true)\n\u003e public class DttMember implements Serializable {\n\u003e     private static final long serialVersionUID = 1L;\n\u003e     /**\n\u003e      * 主键id\n\u003e      */\n\u003e     private Long id;\n\u003e     /**\n\u003e      * 用户openId\n\u003e      */\n\u003e     private String openId;\n\u003e     /**\n\u003e      * 用户昵称\n\u003e      */\n\u003e     private String nickname;\n\u003e     /**\n\u003e      * 是否启用, 默认：1\n\u003e      */\n\u003e     private Boolean isEnable = true;\n\u003e     /**\n\u003e      * 用户积分余额, 默认：0.00\n\u003e      */\n\u003e     private BigDecimal balance = BigDecimal.valueOf(0L, 2);\n\u003e     /**\n\u003e      * 出生日期，格式：yyyy-MM-dd HH:mm:ss\n\u003e      */\n\u003e     private LocalDateTime birthday;\n\u003e     /**\n\u003e      * 会员类型，默认：ORDINARY\n\u003e      */\n\u003e     private MemberType memberType = MemberType.ORDINARY;\n\u003e     /**\n\u003e      * 用户状态；0 正常(默认)，1 已冻结，2 账号已封，3 账号异常\n\u003e      */\n\u003e     private Integer status = 3;\n\u003e     /**\n\u003e      * 账户注销状态；0 未注销（默认），1 已销户\n\u003e      */\n\u003e     private Integer deleted = 0;\n\u003e     /**\n\u003e      * 注册时间，格式: yyyy-MM-dd\n\u003e      */\n\u003e     private LocalDate registrarDate;\n\u003e     /**\n\u003e      * 会员加速开始时间, 格式：HH:mm:ss\n\u003e      */\n\u003e     private LocalTime accelerateBeginTime;\n\u003e     /**\n\u003e      * 会员加速结束时间, 格式：HH:mm:ss\n\u003e      */\n\u003e     private LocalTime accelerateEndTime;\n\u003e     /**\n\u003e      * 修改时间\n\u003e      */\n\u003e     private LocalDateTime updateTime;\n\u003e }\n\u003e ```\n\u003e \n\u003e 2. Table statements\n\u003e \n\u003e ```mysql\n\u003e DROP TABLE IF EXISTS `db_demo`.`dtt_member`;\n\u003eCREATE TABLE IF NOT EXISTS `db_demo`.`dtt_member`\n\u003e (\n\u003e    `id`                    bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',\n\u003e     `status`                int                                                                                                                               DEFAULT 3 COMMENT '用户状态；0 正常(默认)，1 已冻结，2 账号已封，3 账号异常',\n\u003e     `deleted`               int                                                                                                                               DEFAULT 0 COMMENT '账户注销状态；0 未注销（默认），1 已销户',\n\u003e     `open_id`               varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci                                                                      DEFAULT NULL COMMENT '用户openId',\n\u003e     `balance`               decimal                                                                                                                           DEFAULT 0.00 COMMENT '用户积分余额, 默认：0.00',\n\u003e     `accelerate_begin_time` time                                                                                                                              DEFAULT NULL COMMENT '会员加速开始时间, 格式：HH:mm:ss',\n\u003e     `nickname`              varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci                                                                      DEFAULT NULL COMMENT '用户昵称',\n\u003e     `birthday`              datetime                                                                                                                          DEFAULT NULL COMMENT '出生日期，格式：yyyy-MM-dd HH:mm:ss',\n\u003e     `member_type`           enum ('ORDINARY','STUDENT','GUNMETAL','SILVER','GOLD','DIAMOND','SPORTS','PLUS') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'ORDINARY' COMMENT '会员类型，默认：ORDINARY',\n\u003e     `is_enable`             tinyint                                                                                                                           DEFAULT true COMMENT '是否启用, 默认：1',\n\u003e     `registrar_date`        date                                                                                                                              DEFAULT NULL COMMENT '注册时间，格式: yyyy-MM-dd',\n\u003e     `accelerate_end_time`   time                                                                                                                              DEFAULT NULL COMMENT '会员加速结束时间, 格式：HH:mm:ss',\n\u003e     `update_time`           datetime                                                                                                                          DEFAULT NULL COMMENT '修改时间',\n\u003e     PRIMARY KEY (`id`)\n\u003e ) ENGINE = InnoDB\n\u003e   DEFAULT CHARSET = utf8mb4\n\u003e   COLLATE = utf8mb4_general_ci COMMENT ='用户信息';\n\u003e ```\n\u003e \n\u003e 3.  As you can see，In your DB:\n\u003e \n\u003e ![image-20220713190051773](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/image-20220713190051773.png)\n\u003e \n\u003e\n\u003e \n\u003e- Korean developer\n\u003e \n\u003e1. Java domain\n\u003e \n\u003e```java\n\u003e import com.example.enums.MemberType;\n\u003eimport lombok.AllArgsConstructor;\n\u003e import lombok.Builder;\n\u003eimport lombok.Data;\n\u003e import lombok.NoArgsConstructor;\n\u003e import lombok.experimental.Accessors;\n\u003e \n\u003e import java.io.Serializable;\n\u003e import java.math.BigDecimal;\n\u003e import java.time.LocalDate;\n\u003e import java.time.LocalDateTime;\n\u003e import java.time.LocalTime;\n\u003e \n\u003e /**\n\u003e  * 사용자 정보\n\u003e  */\n\u003e @Data\n\u003e @Builder\n\u003e @AllArgsConstructor\n\u003e @NoArgsConstructor\n\u003e @Accessors(chain = true)\n\u003e public class DttMember implements Serializable {\n\u003e     private static final long serialVersionUID = 1L;\n\u003e     /**\n\u003e      * 기본 키 ID\n\u003e      */\n\u003e     private Long id;\n\u003e     /**\n\u003e      * 사용자 openId\n\u003e      */\n\u003e     private String openId;\n\u003e     /**\n\u003e      * 사용자 닉네임 사용자 닉네임\n\u003e      */\n\u003e     private String nickname;\n\u003e     /**\n\u003e      * 활성화 여부, 기본값: 1\n\u003e      */\n\u003e     private Boolean isEnable = true;\n\u003e     /**\n\u003e      * 사용자 신용 잔액, 기본값: 0.00\n\u003e      */\n\u003e     private BigDecimal balance = BigDecimal.valueOf(0L, 2);\n\u003e     /**\n\u003e      * 생년월일, 형식: yyyy-MM-dd HH:mm:ss\n\u003e      */\n\u003e     private LocalDateTime birthday;\n\u003e     /**\n\u003e      * 회원 유형, 기본값: ORDINARY\n\u003e      */\n\u003e     private MemberType memberType = MemberType.ORDINARY;\n\u003e     /**\n\u003e      * 사용자 상태: 0 정상(기본값), 1 동결, 2 계정 차단, 3 계정 비정상\n\u003e      */\n\u003e     private Integer status = 3;\n\u003e     /**\n\u003e      * 계정 취소 상태, 0은 취소되지 않음(기본값), 1은 취소됨\n\u003e      */\n\u003e     private Integer deleted = 0;\n\u003e     /**\n\u003e      * 등록 시간, 형식: yyyy-MM-dd\n\u003e      */\n\u003e     private LocalDate registrarDate;\n\u003e     /**\n\u003e      * 회원 가속 시작 시간, 형식: HH:mm:ss\n\u003e      */\n\u003e     private LocalTime accelerateBeginTime;\n\u003e     /**\n\u003e      * 회원 가속 종료 시간, 형식: HH:mm:ss\n\u003e      */\n\u003e     private LocalTime accelerateEndTime;\n\u003e     /**\n\u003e      * 시간 변경\n\u003e      */\n\u003e     private LocalDateTime updateTime;\n\u003e }\n\u003e ```\n\u003e \n\u003e 2. DB table\n\u003e \n\u003e ```mysql\n\u003e DROP TABLE IF EXISTS `db_demo`.`dtt_member`;\n\u003eCREATE TABLE IF NOT EXISTS `db_demo`.`dtt_member`\n\u003e (\n\u003e    `id`  bigint NOT NULL AUTO_INCREMENT COMMENT '기본 키 ID',\n\u003e     `status`  int                                                  DEFAULT 3 COMMENT '사용자 상태: 0 정상(기본값), 1 동결, 2 계정 차단, 3 계정 비정상',\n\u003e     `is_enable`  tinyint                                                  DEFAULT true COMMENT '활성화 여부, 기본값: 1',\n\u003e     `nickname`  varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL  COMMENT '사용자 닉네임 사용자 닉네임',\n\u003e     `birthday`  datetime                                                  DEFAULT NULL COMMENT '생년월일, 형식: yyyy-MM-dd HH:mm:ss',\n\u003e     `member_type`  enum('ORDINARY','STUDENT','GUNMETAL','SILVER','GOLD','DIAMOND','SPORTS','PLUS') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'ORDINARY' COMMENT '회원 유형, 기본값: ORDINARY',\n\u003e     `registrar_date`  date                                                  DEFAULT NULL COMMENT '등록 시간, 형식: yyyy-MM-dd',\n\u003e     `accelerate_begin_time`  time                                                  DEFAULT NULL COMMENT '회원 가속 시작 시간, 형식: HH:mm:ss',\n\u003e     `accelerate_end_time`  time                                                  DEFAULT NULL COMMENT '회원 가속 종료 시간, 형식: HH:mm:ss',\n\u003e     `update_time`  datetime                                                  DEFAULT NULL COMMENT '시간 변경',\n\u003e     `deleted`  int                                                  DEFAULT 0 COMMENT '계정 취소 상태, 0은 취소되지 않음(기본값), 1은 취소됨',\n\u003e     `open_id`  varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL  COMMENT '사용자 openId',\n\u003e     `balance`  decimal                                                  DEFAULT 0.00 COMMENT '사용자 신용 잔액, 기본값: 0.00',\n\u003e PRIMARY KEY (`id`)\n\u003e ) ENGINE = InnoDB\n\u003e DEFAULT CHARSET = utf8mb4\n\u003e COLLATE = utf8mb4_general_ci COMMENT ='사용자 정보';\n\u003e ```\n\u003e \n\u003e \n\u003e \n\u003e It's easily to use DTT to integrate with Spring's ecosystem (mybatis-plus, mybatis, ... ) and enhance\n\u003e them，For [mybatis-plus](https://github.com/baomidou/mybatis-plus)  can be `0-Code` .\n\u003e\n\u003e\n\n## Architecture\n\n![DTT架构图](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/DTT%E6%9E%B6%E6%9E%84%E5%9B%BE-1005672.png)\n\n## Quick Start\n\n- Add maven dependencies to your `pom.xml`\n\n```xml\n\n\u003cdependencies\u003e\n  \u003c!-- dtt-spring-boot-starter --\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003eio.github.weasley-j\u003c/groupId\u003e\n    \u003cartifactId\u003edtt-spring-boot-starter\u003c/artifactId\u003e\n    \u003cversion\u003e1.4.1\u003c/version\u003e\n  \u003c/dependency\u003e\n  \u003c!-- javadoc-scribe start  --\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.therapi\u003c/groupId\u003e\n    \u003cartifactId\u003etherapi-runtime-javadoc-scribe\u003c/artifactId\u003e\n    \u003cversion\u003e0.15.0\u003c/version\u003e\n    \u003cscope\u003eprovided\u003c/scope\u003e\n  \u003c/dependency\u003e\n  \u003c!-- javadoc-scribe end  --\u003e\n\u003c/dependencies\u003e\n```\n\n\n\n**OR**\n\n- Clone this project into your dir.\n\n```bash\ngit clone https://github.com/Weasley-J/dtt-spring-boot-parent.git\n```\n\n- `CD` to your work `DIR` then you can run this maven command to install DTT and use it in you projects.\n\nTips: For this step, I mean your `JDK` and `MAVEN` environment are set correctly.\n\n```shell\nmvn clean install -pl :dtt-spring-boot-starter -am\n```\n\n- Add maven dependencies into your `pom.xml `(The pom's parent must be\n  extends `org.springframework.boot:spring-boot-starter-parent`)\n\n**Tips**: `domain` model must be in the same `src` folder with `pom.xml`\n\n```xml\n\u003cdependencies\u003e\n        \u003c!-- dtt-spring-boot-starter --\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003eio.github.weasley-j\u003c/groupId\u003e\n          \u003cartifactId\u003edtt-spring-boot-starter\u003c/artifactId\u003e\n          \u003cversion\u003e1.4.1\u003c/version\u003e\n        \u003c/dependency\u003e\n        \u003c!-- javadoc-scribe start  --\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003ecom.github.therapi\u003c/groupId\u003e\n          \u003cartifactId\u003etherapi-runtime-javadoc-scribe\u003c/artifactId\u003e\n          \u003cversion\u003e0.15.0\u003c/version\u003e\n          \u003cscope\u003eprovided\u003c/scope\u003e\n        \u003c/dependency\u003e\n        \u003c!-- javadoc-scribe end  --\u003e\n\u003c/dependencies\u003e\n\n```\n\n- Configure your projects datasource in `application.yml`, e.g\n\n```yaml\nspring:\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    url: jdbc:mysql://your_ip:3306/your_db?serverTimezone=Asia/Shanghai\u0026useSSL=false\u0026allowPublicKeyRetrieval=true\u0026autoReconnect=true\u0026allowMultiQueries=true\n    username: your_username\n    password: your_password\n```\n\n- Using Java annotation `@EnableDtt` to enable DTT to your projects Main class, As follow:\n\n```java\nimport cn.alphahub.dtt.plus.enums.ParserType;\nimport cn.alphahub.dtt.plus.framework.annotations.EnableDtt;\nimport com.example.domain.dtt.DttMember;\nimport com.example.domain.dtt.DttPerson;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * MyDtt-Plus Testing  Application\n */\n@SpringBootApplication\n@EnableDtt(\n        scanBasePackages = {\n                \"com.example.i18n.korean\",\n                \"com.example.domain.dtt\",\n                \"com.example.domain.oms\", \"com.example.domain.order\", \"com.example.domain.payment\",\n                \"com.example.domain.promotion\", \"com.example.domain.shop\", \"com.example.domain.user\",\n        },\n        parserType = ParserType.JAVA_DOC,\n        dropTableBeforeCreate = true,\n        scanBaseClasses = {\n                DttPerson.class,\n                DttMember.class,\n        }\n)\n@MapperScan(basePackages = {\"com.example.mapper\"})\npublic class MydttPlusTestsApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(MydttPlusTestsApplication.class, args);\n    }\n}\n```\n\nYou can enable the required functions as needed. When your application started. You'll be see like this console log in your IDE:\n\n```\n\n2022-07-17 22:15:13.894  INFO 12961 --- [           main] c.a.dtt.plus.framework.InitDttHandler    : Auto created '1' tables for '0' seconds. detail: {\"dttStartTime\":\"2022-07-17 22:15:13\",\"dttEndTime\":\"2022-07-17 22:15:13\"}, location: /Users/weasley/Development/IdeaProjects/dtt-spring-boot-parent/ALL_IN_ONE.SQL\n\n```\n\n- Generate business source code with `DTT` through yaml configuration\n\nHere is the example of `application.yml`:\n\n```yaml\nalphahub:\n  dtt:\n    code-generator:\n      is-enable: off\n      show-code: false\n      override-exists: false\n      module-name: dtt\n      module-package: com.example\n      module-path: /Users/weasley/Development/IdeaProjects/dtt-spring-boot-parent/dtt-spring-boot-tests/dtt-spring-boot-3-x\n      base-package: com.example.domain.dtt\n      base-classes: \"\"\n```\n\n[Full meta data for `code-generator` configuration](https://github.com/Weasley-J/dtt-spring-boot-parent/blob/main/dtt-spring-boot-starter/src/main/java/cn/alphahub/dtt/plus/config/DttProperties.java#L122-L121)\n，the classes of `Service`,  `Mapper interface`, `Mapper.xml`, The directory structure is as follows:\n\n![image-20220729171604994](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/image-20220729171604994.png)\n\nNext, you can use the generated code in some controller class，i.e:\n\n```java\n/**\n * Some controller\n */\n@RestController\n@RequestMapping(\"/api/member\")\npublic class SomeController {\n    @Autowired\n    private DttMemberService memberService;\n\n    @PostMapping(\"/save\")\n    @Transactional(rollbackFor = {Exception.class})\n    public ResponseEntity\u003cBoolean\u003e save(@RequestBody DttMember member) {\n        boolean save = memberService.save(member);\n        return ResponseEntity.ok(save);\n    }\n\n    @PutMapping(\"/update\")\n    @Transactional(rollbackFor = {Exception.class})\n    public ResponseEntity\u003cBoolean\u003e update(@RequestBody DttMember member) {\n        boolean updated = memberService.updateById(member);\n        return ResponseEntity.ok(updated);\n    }\n\n    @GetMapping(\"/info/{id}\")\n    public ResponseEntity\u003cDttMember\u003e info(@PathVariable Long id) {\n        DttMember dttMember = memberService.getById(id);\n        return ResponseEntity.ok(dttMember);\n    }\n\n    @GetMapping(\"/list/{ids}\")\n    public ResponseEntity\u003cList\u003cDttMember\u003e\u003e list(@PathVariable Long[] ids) {\n        List\u003cDttMember\u003e list = memberService.listByIds(Arrays.asList(ids));\n        return ResponseEntity.ok(list);\n    }\n\n    @DeleteMapping(\"/delete/{ids}\")\n    @Transactional(rollbackFor = {Exception.class})\n    public ResponseEntity\u003cBoolean\u003e delete(@PathVariable Long[] ids) {\n        boolean removed = memberService.removeByIds(Arrays.asList(ids));\n        return ResponseEntity.ok(removed);\n    }\n}\n```\n\nThat's the overview for `DTT` quick start.\n\n### Annotation Metadata\n\n- `EnableDtt`\n\nTo enable DTT support your application，annotate on you main class.\n\n| property                | type         | desc                                        | remark                                                       |\n| :---------------------- | ------------ | ------------------------------------------- | ------------------------------------------------------------ |\n| `scanBasePackages`      | `String[]`   | The model classes be given                  | The package permissions are as small as possible. If the scope is too large, DTT will scan all classes in subpackages. |\n| `scanBaseClasses`       | `Class\u003c?\u003e[]` | base classes to scan，optional              | You want to specify which model class files generate database tables |\n| `ParserType`            | `ParserType` | Enum，`JAVA_DOC`,`ANNOTATION`               | Which parser you want to choose to parse model, default is set to:`ParserType.JAVA_DOC`, Particularly，if your application is run with type of `jar`,`war`,`JAVA_DOC` will do nothing for this opt. Java doc has advantage of `0-Code` injection for your project src. |\n| `dropTableBeforeCreate` | `boolean`    | Drop oraginal table before create new table | If true, the table created will be drop from database        |\n\n- `@Dtt`\n\nWhich can annotate on you Java modle class or property of modle，Usually used in combination with `ParserType=ParserType.ANNOTATION`.\n\n| property       | type    | desc                                                         | remark |\n| -------------- | ------- | ------------------------------------------------------------ | ------ |\n| `value`        | String  | when annotated on model class, can be as the commen of table, annotated on model property，can be as the comment of table column |        |\n| `isPrimaryKey` | boolean | Mark whether the current column is the primary key, the default is `false` |        |\n| `dbDataType`   | String  | DB data type, i.e（MySQL）: `varchar(64)`                    |        |\n| `defaultValue` | String  | default value of current property，mapping to table column   |        |\n\n### Yaml configuration\n\nYou can easily use in prefix of `alphahub.tt` in your porject，Here the fully yaml property with default maybe you can\nreference it. you can override in you `application.yml` if you don't need one of them. i.e:\n\n[Or refere to source code](https://github.com/Weasley-J/dtt-spring-boot-parent/blob/main/dtt-spring-boot-starter/src/main/resources/META-INF/ddt-data-mapper.yml#L1-L512)\n\nParticularly. when `all-in-one-table` set enbled, DTT'll export a file with `all-in-one` type table DDL statements to\nthe destination you set in your `application.yml` file.\n\n\n\n## Develop Environment\n\n### 1. Requirments\n\n| items      | requirments                           | remark |\n| ---------- | ------------------------------------- | ------ |\n| JDK        | JDK1.8 or latest                      |        |\n| SpringBoot | 2.2.0.RELEASE  \u003c= version \u003c= 3.0.0-M3 |        |\n| IDE        | IDEA、Eclipse...                      |        |\n| Maven      | v3.6.5 or latest                      |        |\n\n## Features of DTT\n\n### 1 Good partner for RDB data migration\n\nYou can easily complete the creation of the target database in the RDB database that `DTT` has been adapted to without\nmodifying any source code, and can retain the remark information of each metadata of the old database. The whole process\ntakes about 20 seconds.\n\n### 2 Create tables with the type of `0-code` injection\n\nWhich means DTT do nothing for your source code, you can specify `parserType = ParserType.JAVA_DOC` in `EnableDtt`\nannotation. you can also make `parserType = ParserType.ANNOTATION` optional.\n\n### 3 Export `SQL` for table's `DDL`  statement to local filesystem\n\n`DTT` can Export `SQL` for table's `DDL`  statement to local file thorough yaml configuration optional that you can\nmodify those DLL statements.\n\n### 4 Preserve all meta comments for database tables\n\nDTT's parser support parsing the Java documentation also.\n\n### 5 Specifies the character length of the metadata\n\nYou can configure for your configuration yaml like this, [Here is the link](https://github.com/Weasley-J/dtt-spring-boot-parent/blob/main/dtt-spring-boot-starter/src/main/resources/META-INF/ddt-data-mapper.yml#L130)\n\nExample:\n\n```yaml\nalphahub:\n  dtt:\n    string-length-mapper:\n      - database-type: MYSQL\n        default-text-type: varchar\n        default-text-length: 256\n        length-configs:\n          - text: phone,_tel,telephone,_user,_size\n            length: 16\n          - text: _id,_no,number,name,code,_code,_name\n            length: 64\n          - text: link,url,_url,_link\n            length: 128\n          - text: _msg,message,remark\n            length: 512\n          - text: request,response,body,text,content\n            length: 768\n```\n\nExplanation：\n\nWhich means when your database is `MySQL`, A column contains filed of  `phone`, `_tel`, ... will be defined as type\nof `varchar(16)`,if the `alphahub.dttstring-length-mapper.length-configs` list is not configured, the data type of the\ncolumn will be defined as: `varchar(256)`;\n\n### 6 Infer default values automatically for database table columns\n\ni.e:\n\n- An enum type to illustrate DTT infer default values.\n\n```java\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\n/**\n * 会员类型枚举\n *\n * @author weasley\n * @version 1.0\n * @date 2022/7/9\n */\n@Getter\n@AllArgsConstructor\npublic enum MemberType {\n    ORDINARY(\"普通会员\"),\n    STUDENT(\"学生会员\"),\n    GUNMETAL(\"青铜会员\"),\n    SILVER(\"白银会员\"),\n    GOLD(\"黄金会员\"),\n    DIAMOND(\"钻石会员\"),\n    SPORTS(\"体育会员\"),\n    PLUS(\"plus会员\");\n\n    /**\n     * 会员描述\n     */\n    private final String desc;\n}\n```\n\n- A domain class to infer diffrent table structure between `DTT` supported `RDB`\n\n```java\n/**\n * 用户信息-DttMember\n */\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\n@Accessors(chain = true)\npublic class DttMember implements Serializable {\n    private static final long serialVersionUID = 1L;\n    /**\n     * 主键id\n     */\n    private Long id;\n    /**\n     * 用户openId\n     */\n    private String openId;\n    /**\n     * 用户昵称\n     */\n    private String nickname;\n    /**\n     * 是否启用, 默认：1\n     */\n    private Boolean isEnable = true;\n    /**\n     * 用户积分余额, 默认：0.00\n     */\n    private BigDecimal balance = BigDecimal.valueOf(0L, 2);\n    /**\n     * 出生日期，格式：yyyy-MM-dd HH:mm:ss\n     */\n    private LocalDateTime birthday;\n    /**\n     * 会员类型，默认：ORDINARY\n     */\n    private MemberType memberType = MemberType.ORDINARY;\n    /**\n     * 用户状态；0 正常(默认)，1 已冻结，2 账号已封，3 账号异常\n     */\n    private Integer status = 3;\n    /**\n     * 账户注销状态；0 未注销（默认），1 已销户\n     */\n    private Integer deleted = 0;\n    /**\n     * 注册时间，格式: yyyy-MM-dd\n     */\n    private LocalDate registrarDate;\n    /**\n     * 会员加速开始时间, 格式：HH:mm:ss\n     */\n    private LocalTime accelerateBeginTime;\n    /**\n     * 会员加速结束时间, 格式：HH:mm:ss\n     */\n    private LocalTime accelerateEndTime;\n    /**\n     * 修改时间\n     */\n    private LocalDateTime updateTime;\n}\n```\n\n- For those properties which specified default value，`DTT` can infer the default value for different `RDB` which `DTT`\n  has supported as follow:\n\n```java\n/**\n * 用户信息-DttMember\n */\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\n@Accessors(chain = true)\npublic class DttMember implements Serializable {\n    private static final long serialVersionUID = 1L;\n    /**\n     * 是否启用, 默认：1\n     */\n    private Boolean isEnable = true;\n    /**\n     * 用户积分余额, 默认：0.00\n     */\n    private BigDecimal balance = BigDecimal.valueOf(0L, 2);\n    /**\n     * 会员类型，默认：ORDINARY\n     */\n    private MemberType memberType = MemberType.ORDINARY;\n    /**\n     * 用户状态；0 正常(默认)，1 已冻结，2 账号已封，3 账号异常\n     */\n    private Integer status = 3;\n    /**\n     * 账户注销状态；0 未注销（默认），1 已销户\n     */\n    private Integer deleted = 0;\n}\n```\n\n**As you can see the default value specified by `DTT`  in the table DDL statement demonstrate the given 3 types RDB.**\n\n#### (a) DB2\n\n```sql\nCREATE TABLE \"TESTDB\".\"DTT_MEMBER\"\n(\n    \"ID\"    BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),\n    \"OPEN_ID\"    VARCHAR(64) DEFAULT NULL,\n    \"NICKNAME\"    VARCHAR(64) DEFAULT NULL,\n    \"IS_ENABLE\"    BOOLEAN DEFAULT true,\n    \"BALANCE\"    DECIMAL DEFAULT 0.00,\n    \"BIRTHDAY\"    TIMESTAMP DEFAULT NULL,\n    \"MEMBER_TYPE\"    VARCHAR(256) DEFAULT 'ORDINARY',\n    \"STATUS\"    INTEGER DEFAULT 3,\n    \"DELETED\"    INTEGER DEFAULT 0,\n    \"REGISTRAR_DATE\"    DATE DEFAULT NULL,\n    \"ACCELERATE_BEGIN_TIME\"    TIME DEFAULT NULL,\n    \"ACCELERATE_END_TIME\"    TIME DEFAULT NULL,\n    \"UPDATE_TIME\"    TIMESTAMP(6) DEFAULT CURRENT TIMESTAMP,\n    PRIMARY KEY (\"ID\")\n);\nCOMMENT ON TABLE \"TESTDB\".\"DTT_MEMBER\" IS '用户信息';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"ID\" IS '主键id';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"OPEN_ID\" IS '用户openId';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"NICKNAME\" IS '用户昵称';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"IS_ENABLE\" IS '是否启用, 默认：1';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"BALANCE\" IS '用户积分余额, 默认：0.00';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"BIRTHDAY\" IS '出生日期，格式：yyyy-MM-dd HH:mm:ss';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"MEMBER_TYPE\" IS '会员类型，默认：ORDINARY, Enum type:ORDINARY,STUDENT,GUNMETAL,SILVER,GOLD,DIAMOND,SPORTS,PLUS';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"STATUS\" IS '用户状态；0 正常(默认)，1 已冻结，2 账号已封，3 账号异常';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"DELETED\" IS '账户注销状态；0 未注销（默认），1 已销户';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"REGISTRAR_DATE\" IS '注册时间，格式: yyyy-MM-dd';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"ACCELERATE_BEGIN_TIME\" IS '会员加速开始时间, 格式：HH:mm:ss';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"ACCELERATE_END_TIME\" IS '会员加速结束时间, 格式：HH:mm:ss';\nCOMMENT ON COLUMN \"TESTDB\".\"DTT_MEMBER\".\"UPDATE_TIME\" IS '修改时间';\n```\n\n#### (b) SQL server\n\n```sql\nCREATE TABLE [dbo].[dtt_member]\n(\n    [id]    bigint PRIMARY KEY NOT NULL,\n    [open_id]    varchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT    NULL,\n    [nickname]    varchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT    NULL,\n    [is_enable]    tinyint DEFAULT 1,\n    [balance]    money DEFAULT 0.00,\n    [birthday]    datetime2 DEFAULT NULL,\n    [member_type]    varchar(256) DEFAULT 'ORDINARY',\n    [status]    int DEFAULT 3,\n    [deleted]    int DEFAULT 0,\n    [registrar_date]    date DEFAULT NULL,\n    [accelerate_begin_time]    time DEFAULT NULL,\n    [accelerate_end_time]    time DEFAULT NULL,\n    [update_time]    datetime2 DEFAULT NULL\n)\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'用户信息',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'主键id',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'id'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'用户openId',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'open_id'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'用户昵称',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'nickname'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'是否启用, 默认：1',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'is_enable'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'用户积分余额, 默认：0.00',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'balance'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'出生日期，格式：yyyy-MM-dd HH:mm:ss',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'birthday'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'会员类型，默认：ORDINARY, Enum type:ORDINARY,STUDENT,GUNMETAL,SILVER,GOLD,DIAMOND,SPORTS,PLUS',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'member_type'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'用户状态；0 正常(默认)，1 已冻结，2 账号已封，3 账号异常',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'status'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'账户注销状态；0 未注销（默认），1 已销户',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'deleted'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'注册时间，格式: yyyy-MM-dd',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'registrar_date'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'会员加速开始时间, 格式：HH:mm:ss',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'accelerate_begin_time'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'会员加速结束时间, 格式：HH:mm:ss',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'accelerate_end_time'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'修改时间',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'update_time'\nGO\n```\n\n#### (c) MySQL\n\n```mysql\nCREATE TABLE IF NOT EXISTS `db_demo`.`dtt_member`\n(\n  `id`                    bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `open_id`               varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci                                                                     DEFAULT NULL  COMMENT '用户openId',\n  `nickname`              varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci                                                                     DEFAULT NULL  COMMENT '用户昵称',\n  `is_enable`             tinyint                                                                                                                          DEFAULT true COMMENT '是否启用, 默认：1',\n  `balance`               decimal                                                                                                                          DEFAULT 0.00 COMMENT '用户积分余额, 默认：0.00',\n  `birthday`              datetime                                                                                                                         DEFAULT NULL COMMENT '出生日期，格式：yyyy-MM-dd HH:mm:ss',\n  `member_type`           enum('ORDINARY','STUDENT','GUNMETAL','SILVER','GOLD','DIAMOND','SPORTS','PLUS') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'ORDINARY' COMMENT '会员类型，默认：ORDINARY',\n  `status`                int                                                                                                                              DEFAULT 3 COMMENT '用户状态；0 正常(默认)，1 已冻结，2 账号已封，3 账号异常',\n  `deleted`               int                                                                                                                              DEFAULT 0 COMMENT '账户注销状态；0 未注销（默认），1 已销户',\n  `registrar_date`        date                                                                                                                             DEFAULT NULL COMMENT '注册时间，格式: yyyy-MM-dd',\n  `accelerate_begin_time` time                                                                                                                             DEFAULT NULL COMMENT '会员加速开始时间, 格式：HH:mm:ss',\n  `accelerate_end_time`   time                                                                                                                             DEFAULT NULL COMMENT '会员加速结束时间, 格式：HH:mm:ss',\n  `update_time`           datetime                                                                                                                         DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  PRIMARY KEY (`id`)\n) ENGINE = InnoDB\n  DEFAULT CHARSET = utf8mb4\n  COLLATE = utf8mb4_general_ci COMMENT ='用户信息-DttMember';\n```\n\n### 7 Configure precision for high precision data types\n\n- [Here is the complete configurations](https://github.com/Weasley-J/dtt-spring-boot-parent/blob/main/dtt-spring-boot-starter/src/main/resources/META-INF/ddt-data-mapper.yml#L248)\n- The following is an example of the default configuration built into DTT:\n\n```yaml\nalphahub:\n  dtt:\n    high-precision-data-mapper:\n      high-precision-data-type: BigDecimal #The high precision data types of Java\n      default-integer-length: 10 #The default length of the integer part\n      default-decimal-length: 6 #The default length of fractional part\n      precision-configs:\n        - text: price,amount #The possible fields that need to be inferred, separated by \",\"(case insensitive)\n          integer-length: 10 #The length of the integer part of the field\n          decimal-length: 2 #The length of the fractional part\n```\n\n- Inference description, take the `h2` database as an example:\n\nWhen the fields of the database table mapped by the private properties of your `Java` object contain `price`, `amount`\nfields (case-insensitive), the data type of the column will be defined as: `NUMERIC(10,2 )`, if\nthe `alphahub.dtt.precision-configs` list is not configured, the data type of the column will be defined\nas: `NUMERIC(10,6)`;\n\nGenerally, a high-precision data type is used to define the data type of currency. The default configuration of\nDTT's `alphahub.dtt.precision-configs` includes `price`, `amount`, the fields is only applicable to the currency data\nprecision of `CNY` , If the developer is using the currency unit of other countries, I strongly recommend that the\ndeveloper configure the data precision that matches the business type in their own application to override the default\ndata precision configuration of `DTT` built in.\n\n### 8 Integrate multi-mybatis framework with `0-Code`\n\n1. `mybatis`: https://github.com/mybatis/spring-boot-starter\n2. `mybatis-plus`: https://github.com/baomidou/mybatis-plus\n3. `tk.mybatis`: https://search.maven.org/artifact/tk.mybatis/mapper-spring-boot-starter\n4. `pagehelper`: https://search.maven.org/artifact/com.github.pagehelper/pagehelper\n\n### 9 Built-in mybatis-plus code generator\n\n`DTT` can help you build an enterprise development framework quickly, you can configure it in your project configuration\nyaml file,\n\ni.e:\n\n```yaml\nalphahub:\n  dtt:\n    code-generator:\n      is-enable: on\n      show-code: false\n      override-exists: false\n      module-name: dtt\n      module-package: com.example\n      module-path: /Users/weasley/Development/IdeaProjects/dtt-spring-boot-parent/dtt-spring-boot-tests/dtt-spring-boot-3-x\n      base-package: com.example.domain.dtt\n      base-classes: \"\"\n```\n\n[Here is the explaination for configuration meta-data](https://github.com/Weasley-J/dtt-spring-boot-parent/blob/main/dtt-spring-boot-starter/src/main/java/cn/alphahub/dtt/plus/config/DttProperties.java#L122-L121)\n\n### 10 Support `mybatis` create table automatically\n\n- **This feature only available for supported `RDB`**\n\n- This feature depends on your `springboot` main class or configuration class annotated by `@EnableDtt`, you don't need\n  to specify any properties of `@EnableDtt`, and you can set the `enabled` status to `disabled` through `yaml`\n  configuration in different environment of your application（Default status is enabled）.\n- Example of disabled `yaml` configuration\n\n```yaml\nalphahub:\n  dtt:\n    mybatis-orm-support:\n      is-enable: false #Disable DTT to create table during execution SQL lifecycle of mybatis\n```\n\n- It is recommended to\n  use [Dtt](https://github.com/Weasley-J/dtt-spring-boot-parent/blob/main/dtt-spring-boot-starter/src/main/java/cn/alphahub/dtt/plus/annotations/Dtt.java#L1-L64)\n  annotation to annotate your domain model if your are none native English speaker, the domain model is\n  missing [Dtt](https://github.com/Weasley-J/dtt-spring-boot-parent/blob/main/dtt-spring-boot-starter/src/main/java/cn/alphahub/dtt/plus/annotations/Dtt.java#L1-L64)\n  annotation will cause the table to be created without column metadata comments like `Hibernate` created without\n  comments. If your English is so well and you know the meaning of each metadata, it is fine not to add them.\n\n  Here is an example of using a domain object using `@Dtt`:\n\n```java\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\n/**\n * 会员类型枚举\n *\n * @author weasley\n * @version 1.0\n * @date 2022/7/9\n */\n@Getter\n@AllArgsConstructor\npublic enum MemberType {\n  ORDINARY(\"普通会员\"),\n  STUDENT(\"学生会员\"),\n  GUNMETAL(\"青铜会员\"),\n  PLUS(\"plus会员\");\n\n  /**\n   * 会员描述\n   */\n  private final String desc;\n}\n```\n\n```java\nimport cn.alphahub.dtt.plus.annotations.Dtt;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport lombok.experimental.Accessors;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.LocalTime;\n\n/**\n * 用户信息-DttPerson\n */\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\n@Accessors(chain = true)\n@Dtt(\"用户信息\")\npublic class DttMember implements Serializable {\n  private static final long serialVersionUID = 1L;\n\n  @Dtt(value = \"主键id\")\n  private Long id;\n\n  @Dtt(value = \"用户openId\")\n  private String openId;\n\n  @Dtt(value = \"用户昵称\")\n  private String nickname;\n\n  @Dtt(value = \"是否启用, 默认：1\")\n  private Boolean isEnable = true;\n\n  @Dtt(value = \"用户积分余额, 默认：0.00\")\n  private BigDecimal balance = BigDecimal.valueOf(0L, 2);\n\n  @Dtt(value = \"出生日期，格式：yyyy-MM-dd HH:mm:ss\")\n  private LocalDateTime birthday;\n\n  @Dtt(value = \"会员类型，默认：ORDINARY\")\n  private MemberType memberType = MemberType.ORDINARY;\n\n  @Dtt(value = \"用户状态；0 正常(默认)，1 已冻结，2 账号已封，3 账号异常\")\n  private Integer status = 0;\n\n  @Dtt(value = \"账户注销状态；0 未注销（默认），1 已销户\")\n  private Integer deleted = 0;\n\n  @Dtt(value = \"注册时间，格式: yyyy-MM-dd\")\n  private LocalDate registrarDate;\n\n  @Dtt(value = \"会员加速开始时间, 格式：HH:mm:ss\")\n  private LocalTime accelerateBeginTime;\n\n  @Dtt(value = \"会员加速结束时间, 格式：HH:mm:ss\")\n  private LocalTime accelerateEndTime;\n\n  @Dtt(value = \"修改时间\")\n  private LocalDateTime updateTime;\n}\n```\n\nEnd of this feature introduction, I want to note that in the development environment, the remarks of the data table can\nbe obtained by parsing `Java documentation`. In the environment of  `Jar`、 `war`，DTT doesn't support parsing `Java`\ndocuments, so the comments for the created table are missing. If you want to synchronize the table structure\nfor `production environment` from `Dev environment` which created by `DTT`, then you can ignore to use`@Dtt`annotations\nto annotate your domain objects，you can you some `RDB` tools.\n\n### 11 Support calling API to create table\n\n`API`: [cn.alphahub.dtt.plus.framework.miscellaneous.DttDefaultConditionalService#manualCreate](https://github.com/Weasley-J/dtt-spring-boot-parent/blob/main/dtt-spring-boot-starter/src/main/java/cn/alphahub/dtt/plus/framework/miscellaneous/DttDefaultConditionalService.java)\n\n```java\n/**\n * Manually specify a collection of fully qualified Class names to create database tables\n *\n * @param request The request data for dtt manual automatically create database tables\n * @return The list of 'DttManualActEntity'\n */\npublic List\u003cDttManualActEntity\u003e manualCreate(DttManualActRequest request){}\n```\n\n- Add the annotation `@EnableDtt` to the startup class of your `spring-boot` application, i.e:\n\n```java\nimport cn.alphahub.dtt.plus.entity.DttManualActEntity;\nimport cn.alphahub.dtt.plus.entity.DttManualActRequest;\nimport cn.alphahub.dtt.plus.framework.annotations.EnableDtt;\nimport cn.alphahub.dtt.plus.framework.miscellaneous.DttDefaultConditionalService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.List;\n\n/**\n * Some Application\n */\n@EnableDtt\n@SpringBootApplication\npublic class SomeApplication {\n  public static void main(String[] args) {\n    SpringApplication.run(SomeApplication.class, args);\n  }\n\n  /**\n   * Some controller\n   */\n  @RestController\n  @RequestMapping(\"/api/member\")\n  public static class SomeController {\n    @Autowired\n    private DttDefaultConditionalService defaultConditionalService;\n\n    @PostMapping(\"/manual/act\")\n    public List\u003cDttManualActEntity\u003e manualCreateTable(@RequestBody DttManualActRequest request) {\n      return this.defaultConditionalService.manualCreate(request);\n    }\n  }\n}\n```\n\n## Supported `RDB` type\n\n| database     | version             | adaptation |\n| ------------ | ------------------- | ---------- |\n| `mysql`      | `5.7+` or latest    | ✅          |\n| `oracle`     | `11.2.x`  or latest | ✅          |\n| `db2`        | `11.x`  or latest   | ✅          |\n| `sqlserver`  | `14.x` or latest    | ✅          |\n| `mariadb`    | `10.x `or latest    | ✅          |\n| `postgresql` | `v9.x` or latest    | ✅          |\n| `h2`         | -                   | ✅          |\n| `hsql`       | -                   | ✅          |\n| `derby`      | -                   | ✅          |\n\n## Performance\n\nDTT support `either create table lazily on demand`（depends on mybatis framework） or` eagerly on startup`. this chapter\nwill explore the impact of enabling `DTT` on application performance from two\nperspectives. [Here is the tests project](https://github.com/Weasley-J/dtt-spring-boot-parent/tree/main/dtt-spring-boot-tests/dtt-spring-boot-2-x)\n\n### Test platform \u0026 environment\n\n| item                        | value             | remark                                                       |\n| --------------------------- | ----------------- | ------------------------------------------------------------ |\n| Computer System             | Mac OS X          | MacBook Pro 14 (2021)                                        |\n| Architecture                | aarch64           |                                                              |\n| OS Version                  | 12.5.1            |                                                              |\n| RAM                         | 32G               |                                                              |\n| RDB                         | SQL Server        | version: 14.00.3451                                          |\n| JDK                         | 1.8.0_342 (arm64) | [\"Azul Systems, Inc.\" - \"Zulu 8.64.0.15\"](https://www.azul.com/downloads/?version=java-8-lts\u0026os=macos\u0026architecture=arm-64-bit\u0026package=jdk) |\n| Apache Maven                | 3.8.6             | https://maven.apache.org/download.cgi                        |\n| DTT                         | 1.3.5             | https://search.maven.org/artifact/io.github.weasley-j/dtt-spring-boot-starter |\n| spring-boot                 | 2.7.3             | https://search.maven.org/artifact/org.springframework.boot/spring-boot-starter-parent/2.7.3/pom |\n| mybatis-plus-boot-starter   | 3.5.2             | https://search.maven.org/artifact/com.baomidou/mybatis-plus-boot-starter |\n| mybatis-spring-boot-starter | 2.2.2             | https://search.maven.org/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter |\n| pagehelper-spring-boot      | 1.4.3             | https://search.maven.org/artifact/com.github.pagehelper/pagehelper-spring-boot |\n| mapper-spring-boot-starter  | 4.2.1             | https://search.maven.org/artifact/tk.mybatis/mapper-spring-boot-starter |\n\n### **Create table eagerly on startup**\n\n1. Enable DTT for your application\n\n- [x] Main class of application\n\n```java\nimport cn.alphahub.dtt.plus.enums.ParserType;\nimport cn.alphahub.dtt.plus.framework.annotations.EnableDtt;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@EnableDtt(\n        scanBasePackages = {\n                \"com.example.domain.dtt\", \"com.example.domain.order\"\n        },\n        scanBaseClasses = {},\n        parserType = ParserType.JAVA_DOC,\n        dropTableBeforeCreate = true\n)\n@SpringBootApplication\n@MapperScan(basePackages = {\"com.example.mapper\"})\npublic class MydttPlus2xTestApp {\n  public static void main(String[] args) {\n    SpringApplication.run(MydttPlusTestApplication.class, args);\n  }\n}\n```\n\n```yaml\n# The application.yml of sqlserver\nspring:\n  datasource:\n    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver\n    url: jdbc:sqlserver://192.168.31.23:1433;databaseName=dtt_demo;integratedSecurity=false;encrypt=false;\n    username: SA\n    password: weasley@dtt123\n\nmybatis-plus:\n  mapper-locations: classpath:mapper/**/*Mapper.xml,mapper/**/*Dao.xml\n  type-aliases-package: com.example.domain.dtt,com.example.domain.order\n  configuration:\n    map-underscore-to-camel-case: true\n    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n\nalphahub:\n  dtt:\n    show-sql: false\n    all-in-one-table:\n      enable: true\n      filename: AllInOne.sql\n      filepath: /Users/weasley/Downloads\n    code-generator:\n      is-enable: on\n      base-package: com.example.domain.order\n      module-package: com.example\n      module-name: order\n      module-path: /Users/weasley/Development/IdeaProjects/dtt-spring-boot-parent/dtt-spring-boot-tests/dtt-spring-boot-2-x\n```\n\nNote: The property `scanBasePackages`'s value of `@EnableDtt` is the same as the value\nof `mybatis-plus.type-aliases-package` or `mybatis.type-aliases-package` . Those classes are mapped to your database\ntable.\n\n- [x] Start application with Enabling `DTT`\n\nAs we can see from the image:\n\n![image-20220819170348473](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/image-20220819170348473.png)\n\n```log\n2022-08-19 16:56:24.609  INFO 8331 --- [           main] com.example.MydttPlusTestApplication     : Started MydttPlusTestApplication in 2.132 seconds (JVM running for 2.598)\n\n2022-08-19 16:56:26.845  INFO 8331 --- [           main] c.a.dtt.plus.framework.InitDttHandler    : Auto created tables for '2' seconds. detail: {\"dttStartTime\":\"2022-08-19 16:56:24\",\"dttEndTime\":\"2022-08-19 16:56:26\"}, location: /Users/weasley/Downloads/AllInOne.sql\n```\n\nDTT has done two things in the logger:\n\n(a) Generate `Service`, `Mapper`, `Mapper.xml` source code\n\n![image-20220819171137271](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/image-20220819171137271.png)\n\n(b) created `63` tables based on your domain objects\n\n![image-20220819171207065](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/image-20220819171207065.png)\n\n`DTT` takes `2` seconds to do what it's supposed to do, which means to use `DTT` based on your domain objects you just\nneed to write some `Controller` to satisfy your business interface, for\nexample: [SomeController](https://github.com/Weasley-J/dtt-spring-boot-parent/blob/main/dtt-spring-boot-tests/dtt-spring-boot-2-x/src/main/java/com/example/controller/SomeController.java)\n\n2. Disable DTT for your application\n\n- [x] Main class\n\n```java\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n\n@SpringBootApplication\n@MapperScan(basePackages = {\"com.example.mapper\"})\npublic class MydttPlus2xTestApp {\n  public static void main(String[] args) {\n    SpringApplication.run(MydttPlusTestApplication.class, args);\n  }\n}\n```\n\n![image-20220819172757581](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/image-20220819172757581.png)\n\n```log\n2022-08-19 17:27:42.829  INFO 21286 --- [           main] MydttPlus2xTestApp     : Started MydttPlus2xTestApp in 2.122 seconds (JVM running for 2.381)\n```\n\nStarted MydttPlusTestApplication in 2.122 seconds without `DTT`.\n\n3. Compare\n\n| APP                | Loading type       | DTT  | Time                 |\n| ------------------ | ------------------ | ---- | -------------------- |\n| MydttPlus2xTestApp | default            | NO   | 2.122s               |\n| MydttPlus2xTestApp | eagerly on startup | YES  | 2.132s + 2s = 4.132s |\n\n### Create table lazily on demand\n\n`Create table lazily on demand` means that when mybatis executes `DDL` or `DQL` statements, if there is no corresponding\ntable in the database, DTT will be created, and the cache design is used here.\n\nFor this step, delete the test table from your SQL server database, clear your console of IDE,\n\n`com.example.domain.dtt.DttMember` -\u003e `dtt_member`\n\n(1) Main class\n\n```java\nimport cn.alphahub.dtt.plus.framework.annotations.EnableDtt;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@EnableDtt\n@SpringBootApplication\n@MapperScan(basePackages = {\"com.example.mapper\"})\npublic class MydttPlus2xTestApp {\n  public static void main(String[] args) {\n    SpringApplication.run(MydttPlus2xTestApp.class, args);\n  }\n}\n```\n\n(2) application.yml\n\n```yaml\nlogging:\n  level:\n    org.springframework.jdbc.core.JdbcTemplate: debug\n    jdbc.sqltiming: debug\n\nspring:\n  datasource:\n    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver\n    url: jdbc:sqlserver://192.168.31.23:1433;databaseName=dtt_demo;integratedSecurity=false;encrypt=false;\n    username: SA\n    password: weasley@dtt123\n\nmybatis-plus:\n  mapper-locations: classpath:mapper/**/*Mapper.xml,mapper/**/*Dao.xml\n  type-aliases-package: com.example.domain.dtt,com.example.domain.order\n  configuration:\n    map-underscore-to-camel-case: true\n    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n\nalphahub:\n  dtt:\n    code-generator:\n      is-enable: on\n      base-classes:\n        - com.example.domain.dtt.DttMember\n      module-name: dtt\n      module-package: com.example\n      module-path: /Users/weasley/Development/IdeaProjects/dtt-spring-boot-parent/dtt-spring-boot-tests/dtt-spring-boot-2-x\n\n```\n\n- [x] Here is the console for step `(2)`.\n\n![image-20220819175802755](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/image-20220819175802755.png)\n\n```log\n2022-08-19 17:57:41.708  INFO 33463 --- [           main] com.example.DttPlus2xAnnotationTest           : Started MydttPlus2xTestApp in 1.873 seconds (JVM running for 2.129)\n```\n\nAccess the same interface twice, simulating DTT to build tables on demand, Here is the API\nurl: http://localhost:8080/api/member/save/no/params\n\n**(a) 1st logger:**\n\nCreate table if donest exists, The concrete DDL implementation delegates to the RDB implementation class.\n\n```log\n-08-19 18:10:12.339  INFO 38516 --- [           main] com.example.DttPlus2xAnnotationTest           : Started MydttPlus2xTestApp in 2.448 seconds (JVM running for 2.707)\n2022-08-19 18:10:12.344  WARN 38516 --- [           main] c.a.dtt.plus.framework.InitDttHandler    : Data model is empty. DTT cannot parse.\n2022-08-19 18:10:21.078  INFO 38516 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'\n2022-08-19 18:10:21.078  INFO 38516 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'\n2022-08-19 18:10:21.079  INFO 38516 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms\nCreating a new SqlSession\nRegistering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab15e2a]\nJDBC Connection [HikariProxyConnection@1139253693 wrapping ConnectionID:2 ClientConnectionId: f2679647-4094-4f20-a812-ee941a778b4a] will be managed by Spring\n2022-08-19 18:10:21.183  INFO 38516 --- [nio-8080-exec-1] c.a.d.p.f.i.DefaultDttMybatisInterceptor : Table of 'dtt_member' not exists, DTT will help you to create it automatically.\n2022-08-19 18:10:21.183  INFO 38516 --- [nio-8080-exec-1] c.a.d.p.f.core.DefaultJavaDocParser      : Parse Java Doc comments for data table structure information，class 'com.example.domain.dtt.DttMember'\n2022-08-19 18:10:21.215  INFO 38516 --- [nio-8080-exec-1] c.a.d.p.f.c.DefaultSqlserverTableHandler : 使用sqlserver默认建表实现 {\"databaseName\":\"dtt_demo\",\"modelName\":\"dtt_member\",\"modelComment\":\"用户信息\",\"details\":[{\"isPrimaryKey\":true,\"databaseDataType\":\"bigint\",\"javaDataType\":\"Long\",\"filedName\":\"id\",\"filedComment\":\"主键id\",\"initialValue\":\"NULL\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"varchar(64)\",\"javaDataType\":\"String\",\"filedName\":\"open_id\",\"filedComment\":\"用户openId\",\"initialValue\":\"NULL\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"varchar(64)\",\"javaDataType\":\"String\",\"filedName\":\"nickname\",\"filedComment\":\"用户昵称\",\"initialValue\":\"NULL\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"tinyint\",\"javaDataType\":\"Boolean\",\"filedName\":\"is_enable\",\"filedComment\":\"是否启用, 默认：1\",\"initialValue\":\"true\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"money\",\"javaDataType\":\"BigDecimal\",\"filedName\":\"balance\",\"filedComment\":\"用户积分余额, 默认：0.00\",\"initialValue\":\"0.00\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"datetime2\",\"javaDataType\":\"LocalDateTime\",\"filedName\":\"birthday\",\"filedComment\":\"出生日期，格式：yyyy-MM-dd HH:mm:ss\",\"initialValue\":\"NULL\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"varchar('ORDINARY','STUDENT','GUNMETAL','SILVER','GOLD','DIAMOND','SPORTS','PLUS')\",\"javaDataType\":\"Enum\",\"filedName\":\"member_type\",\"filedComment\":\"会员类型，默认：ORDINARY\",\"initialValue\":\"ORDINARY\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"int\",\"javaDataType\":\"Integer\",\"filedName\":\"status\",\"filedComment\":\"用户状态；0 正常(默认)，1 已冻结，2 账号已封，3 账号异常\",\"initialValue\":\"3\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"int\",\"javaDataType\":\"Integer\",\"filedName\":\"deleted\",\"filedComment\":\"账户注销状态；0 未注销（默认），1 已销户\",\"initialValue\":\"0\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"date\",\"javaDataType\":\"LocalDate\",\"filedName\":\"registrar_date\",\"filedComment\":\"注册时间，格式: yyyy-MM-dd\",\"initialValue\":\"NULL\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"time\",\"javaDataType\":\"LocalTime\",\"filedName\":\"accelerate_begin_time\",\"filedComment\":\"会员加速开始时间, 格式：HH:mm:ss\",\"initialValue\":\"NULL\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"time\",\"javaDataType\":\"LocalTime\",\"filedName\":\"accelerate_end_time\",\"filedComment\":\"会员加速结束时间, 格式：HH:mm:ss\",\"initialValue\":\"NULL\"},{\"isPrimaryKey\":false,\"databaseDataType\":\"datetime2\",\"javaDataType\":\"LocalDateTime\",\"filedName\":\"update_time\",\"filedComment\":\"修改时间\",\"initialValue\":\"NULL\"}]}\n2022-08-19 18:10:21.229  INFO 38516 --- [nio-8080-exec-1] c.a.d.p.f.core.DefaultTemplateResolver   : 数据库建表语句: \nCREATE TABLE [dbo].[dtt_member]\n(\n    [id]    bigint PRIMARY KEY NOT NULL,\n    [open_id]    varchar(64) COLLATE Chinese_PRC_CI_AS DEFAULT NULL,\n    [nickname]    varchar(64) COLLATE Chinese_PRC_CI_AS DEFAULT NULL,\n    [is_enable]    tinyint DEFAULT 1,\n    [balance]    money DEFAULT 0.00,\n    [birthday]    datetime2 DEFAULT NULL,\n    [member_type]    varchar(256) DEFAULT 'ORDINARY',\n    [status]    int DEFAULT 3,\n    [deleted]    int DEFAULT 0,\n    [registrar_date]    date DEFAULT NULL,\n    [accelerate_begin_time]    time DEFAULT NULL,\n    [accelerate_end_time]    time DEFAULT NULL,\n    [update_time]    datetime2 DEFAULT NULL\n)\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'用户信息',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'主键id',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'id'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'用户openId',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'open_id'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'用户昵称',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'nickname'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'是否启用, 默认：1',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'is_enable'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'用户积分余额, 默认：0.00',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'balance'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'出生日期，格式：yyyy-MM-dd HH:mm:ss',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'birthday'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'会员类型，默认：ORDINARY, Enum type:ORDINARY,STUDENT,GUNMETAL,SILVER,GOLD,DIAMOND,SPORTS,PLUS',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'member_type'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'用户状态；0 正常(默认)，1 已冻结，2 账号已封，3 账号异常',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'status'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'账户注销状态；0 未注销（默认），1 已销户',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'deleted'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'注册时间，格式: yyyy-MM-dd',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'registrar_date'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'会员加速开始时间, 格式：HH:mm:ss',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'accelerate_begin_time'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'会员加速结束时间, 格式：HH:mm:ss',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'accelerate_end_time'\nGO\nEXEC sp_addextendedproperty\n    'MS_Description', N'修改时间',\n    'SCHEMA', N'dbo',\n    'TABLE', N'dtt_member',\n    'COLUMN', N'update_time'\nGO\n\nTransaction synchronization suspending SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab15e2a]\n2022-08-19 18:10:21.343 DEBUG 38516 --- [nio-8080-exec-1] o.s.jdbc.core.JdbcTemplate               : Executing SQL batch update of 15 statements\nTransaction synchronization resuming SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab15e2a]\n==\u003e  Preparing: SELECT MAX(ID) id FROM dtt_member\n==\u003e Parameters: \n\u003c==    Columns: id\n\u003c==        Row: null\n\u003c==      Total: 1\nReleasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab15e2a]\nJDBC Connection [HikariProxyConnection@1139253693 wrapping ConnectionID:2 ClientConnectionId: f2679647-4094-4f20-a812-ee941a778b4a] will be managed by Spring\n==\u003e  Preparing: INSERT INTO dtt_member ( id, open_id, nickname, is_enable, balance, birthday, member_type, status, deleted, registrar_date, accelerate_begin_time, accelerate_end_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )\n==\u003e Parameters: 1560569852266041346(Long), fawezOE5sT(String), 蒋震南(String), true(Boolean), 865(BigDecimal), 2022-08-19T18:10:21.135(LocalDateTime), STUDENT(String), 0(Integer), 1(Integer), 2022-08-19(LocalDate), 18:10:21.135(LocalTime), 18:10:21.135(LocalTime), 2022-08-19T18:10:21.135(LocalDateTime)\n2022-08-19 18:10:21.449  INFO 38516 --- [nio-8080-exec-1] com.example.controller.SomeController    : {\"id\":1560569852266041346,\"openId\":\"fawezOE5sT\",\"nickname\":\"蒋震南\",\"isEnable\":true,\"balance\":865,\"birthday\":\"2022-08-19 18:10:21\",\"memberType\":\"STUDENT\",\"status\":0,\"deleted\":1,\"registrarDate\":\"2022-08-19\",\"accelerateBeginTime\":\"18:10:21\",\"accelerateEndTime\":\"18:10:21\",\"updateTime\":\"2022-08-19 18:10:21\"}\nTransaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab15e2a]\nTransaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab15e2a]\nTransaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab15e2a]\n```\n\n**(b) 2nd logger**\n\nCause by table exists, DTT does nothing.\n\n```log\n2022-08-19 18:10:21.449  INFO 38516 --- [nio-8080-exec-1] com.example.controller.SomeController    : {\"id\":1560569852266041346,\"openId\":\"fawezOE5sT\",\"nickname\":\"蒋震南\",\"isEnable\":true,\"balance\":865,\"birthday\":\"2022-08-19 18:10:21\",\"memberType\":\"STUDENT\",\"status\":0,\"deleted\":1,\"registrarDate\":\"2022-08-19\",\"accelerateBeginTime\":\"18:10:21\",\"accelerateEndTime\":\"18:10:21\",\"updateTime\":\"2022-08-19 18:10:21\"}\nTransaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab15e2a]\nTransaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab15e2a]\nTransaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab15e2a]\nCreating a new SqlSession\nRegistering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5167ea53]\nJDBC Connection [HikariProxyConnection@1537179939 wrapping ConnectionID:2 ClientConnectionId: f2679647-4094-4f20-a812-ee941a778b4a] will be managed by Spring\n==\u003e  Preparing: SELECT MAX(ID) id FROM dtt_member\n==\u003e Parameters: \n\u003c==    Columns: id\n\u003c==        Row: 1560569852266041346\n\u003c==      Total: 1\nReleasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5167ea53]\nJDBC Connection [HikariProxyConnection@1537179939 wrapping ConnectionID:2 ClientConnectionId: f2679647-4094-4f20-a812-ee941a778b4a] will be managed by Spring\n==\u003e  Preparing: INSERT INTO dtt_member ( id, open_id, nickname, is_enable, balance, birthday, member_type, status, deleted, registrar_date, accelerate_begin_time, accelerate_end_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )\n==\u003e Parameters: 1560569852266041347(Long), fawezOE5sT(String), 蒋震南(String), true(Boolean), 865(BigDecimal), 2022-08-19T18:13:45.066(LocalDateTime), STUDENT(String), 0(Integer), 1(Integer), 2022-08-19(LocalDate), 18:13:45.066(LocalTime), 18:13:45.066(LocalTime), 2022-08-19T18:13:45.066(LocalDateTime)\n2022-08-19 18:13:45.082  INFO 38516 --- [nio-8080-exec-3] com.example.controller.SomeController    : {\"id\":1560569852266041347,\"openId\":\"fawezOE5sT\",\"nickname\":\"蒋震南\",\"isEnable\":true,\"balance\":865,\"birthday\":\"2022-08-19 18:13:45\",\"memberType\":\"STUDENT\",\"status\":0,\"deleted\":1,\"registrarDate\":\"2022-08-19\",\"accelerateBeginTime\":\"18:13:45\",\"accelerateEndTime\":\"18:13:45\",\"updateTime\":\"2022-08-19 18:13:45\"}\nTransaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5167ea53]\nTransaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5167ea53]\nTransaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5167ea53]\n```\n\n- [x] Console of default（Without DTT）\n\n![image-20220819175658344](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/image-20220819175658344.png)\n\n`2022-08-19 17:52:56.045  INFO 31535 --- [           main] com.example.DttPlus2xAnnotationTest           : Started MydttPlus2xTestApp in 1.293 seconds (JVM running for 1.55)`\n\n(3) Compare\n\n| APP                | Loading type     | DTT  | Time   |\n| ------------------ | ---------------- | ---- | ------ |\n| MydttPlus2xTestApp | default          | NO   | 1.293s |\n| MydttPlus2xTestApp | lazily on demand | YES  | 1.873s |\n\nFrom the data comparison in the above table, it is easy to see that lazily on demand has little effect on performance.\n\n\u003e The test is made under the circumstances where personal energy and time are limited. Please forgive me if there are\n\u003e some inadequacies.\n\n## Contribute your code\n\ntodo\n\n## Question\u0026Answer\n\n- Those `ORM` frameworks which can be integrated `DTT` with `0-Code`?\n\n1. `mybatis`: https://github.com/mybatis/spring-boot-starter\n2. `mybatis-plus`: https://github.com/baomidou/mybatis-plus\n3. `tk.mybatis`: https://search.maven.org/artifact/tk.mybatis/mapper-spring-boot-starter\n4. `pagehelper`: https://search.maven.org/artifact/com.github.pagehelper/pagehelper\n\n## Source code quality\n\n![image-20220819122523273](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/image-20220819122523273.png)\n\n![image-20220819122621908](https://alphahub-test-bucket.oss-cn-shanghai.aliyuncs.com/image/image-20220819122621908.png)\n\n## Credits\n\n- Java document analyse\n\n[com.github.therapi:therapi-runtime-javadoc](https://github.com/dnault/therapi-runtime-javadoc)\n\n- Template engine language\n\n[org.apache.velocity:velocity-engine-core](https://search.maven.org/artifact/org.apache.velocity/velocity-engine-core/2.3/jar)\n\n- jsqlparser\n\n[com.github.jsqlparser:jsqlparser](https://search.maven.org/artifact/com.github.jsqlparser/jsqlparser)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulxxy%2Fdtt-spring-boot-parent","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjulxxy%2Fdtt-spring-boot-parent","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulxxy%2Fdtt-spring-boot-parent/lists"}