MyBatis 基础(一)

62 阅读1分钟

创建Spring Web项目

相关依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.38</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.12</version>
        </dependency>
        <!--	代码生成器相关	-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.12</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.34</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.6.16</version>
        </dependency>
        <!--	代码生成器相关	-->
    </dependencies>

代码生成器

public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/db_test?useSSL=false", "root", "123456")
                .globalConfig(builder -> {
                    builder.author("yonsh") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir(Paths.get(System.getProperty("user.dir")) + "/src/main/java") // 指定输出目录
                            .commentDate("yyyy-MM-dd");
                })
                .dataSourceConfig(builder ->
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            if (typeCode == Types.SMALLINT) {
                                // 自定义类型转换
                                return DbColumnType.INTEGER;
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                .packageConfig(builder ->
                        builder.parent("com.example.mybatis") // 设置父包名
                                .entity("entity")
                                .mapper("mapper")
                                .service("service")
                                .serviceImpl("service.impl")
                                .xml("mapper.xml")
                                .pathInfo(Collections.singletonMap(OutputFile.xml, Paths.get(System.getProperty("user.dir")) + "/src/main/resources/mapper")) // 设置mapperXml生成路径
                )
                .strategyConfig(builder ->
                        builder.addInclude("user") // 设置需要生成的表名
                                .addTablePrefix("t_", "c_") // 设置过滤表前缀
                )
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }

常用功能分析

自增ID配置

  • 在创建实体类时,id字段没有额外增加注解,mybatisplus默认的ID生成方式是IdType.ASSIGN_ID,即使用默认的ID生成器DefaultIdentifierGenerator生成
  • 填充ID的位置在com.baomidou.mybatisplus.core.MybatisParameterHandler#populateKeys
  • DefaultIdentifierGenerator
    • 使用雪花算法生成ID
    • ID包括4部分内容:时间戳 + 数据中心标识 + 机器标识 + 序列号部分
    • 生成过程:
      • 获取当前时间,如当前时间 < 上次ID生成时间,可能产生了时钟回退,等待重试获取当前时间
      • 如当前时间 = 上次ID生成时间,同一毫秒内多次获取,序列号自增;否则生成1-2内的随机数作为序列号
      • 更新上次ID生成时间
      • 计算ID:时间戳部分 | 数据中心部分 | 机器标识部分 | 序列号部分