mybatis代码生成器:Mybatis逆向工程,TK通用mapper,Mybatis Plus代码生成器

mybatis代码生成器:Mybatis逆向工程,TK通用mapper,Mybatis Plus代码生成器

前言:

释放双手,从持久层开始。只要我代码生成得足够快,就能摸最多的鱼(滑稽)
完整代码Gitee: https://gitee.com/BiMon/mybatis-generate.git
喜欢的话,请给个小星星⭐⭐⭐

注意:
1:本文章采用druid连接池,方便企业中实际项目开发(能更快速的使用CV大法)
2:原生Mybaits,TK通用mapper采用maven插件生成代码,优点是即使程序报错,也不影响代码生成。缺点是对eclipse不友好(不会eclipse工具,IDEA真香)

1.Mybatis逆向工程

1.1 导入依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

 <dependencies>
        <!-- web启动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 测试启动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!-- 数据库相关的 -->
        <!--mybatis启动-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency>
        <!-- 分页助手启动器 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!--mysql启动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc的启动器,默认使用HikariCP连接池-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- Druid连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.14</version>
        </dependency>

        <!-- lombok插件 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>

            <plugin>
                <!-- mybatis-generator 自动代码插件 -->
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <!-- 配置文件 -->
                    <configurationFile>${basedir}/src/main/resources/generate/mybatis-generator.xml</configurationFile>
                    <!-- 允许移动和修改 -->
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <!-- jdbc 依赖 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <!-- 插件版本应和上面导入的jar包版本一致:8.0.16 -->
                        <version>8.0.16</version>
                    </dependency>
                    <dependency>
                        <groupId>com.itfsw</groupId>
                        <artifactId>mybatis-generator-plugin</artifactId>
                        <version>1.3.8</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

</project>

1.2 配置文件

1.2.1 配置文件目录

在这里插入图片描述

1.2.2 mybatis-generator.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC
        "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
    <properties resource="generate/generator.properties"/>

    <!--targetRuntime="MyBatis3" 目标环境
      MyBatis3:豪华版,复杂多条件查询
      MyBatis3Simple:helloWorld -->
    <context id="MysqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>

        <!-- Lombok插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.LombokPlugin">
            <!-- @Data 默认开启,同时插件会对子类自动附加@EqualsAndHashCode(callSuper = true),@ToString(callSuper = true) -->
            <property name="@Data" value="true"/>
            <!-- @Builder 必须在 Lombok 版本 >= 1.18.2 的情况下开启,对存在继承关系的类自动替换成@SuperBuilder -->
            <property name="@Builder" value="true"/>
            <!-- @NoArgsConstructor 和 @AllArgsConstructor 使用规则和Lombok一致 -->
            <property name="@AllArgsConstructor" value="true"/>
            <property name="@NoArgsConstructor" value="true"/>
            <!-- @Getter、@Setter、@Accessors 等使用规则参见官方文档 -->
            <property name="@Accessors(chain = true)" value="true"/>
            <!-- 临时解决IDEA工具对@SuperBuilder的不支持问题,开启后(默认未开启)插件在遇到@SuperBuilder注解时会调用ModelBuilderPlugin来生成相应的builder代码 -->
            <property name="supportSuperBuilderForIdea" value="false"/>
        </plugin>

        <!-- 查询单条数据插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.SelectOneByExamplePlugin"/>


        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <jdbcConnection driverClass="${jdbc.driverClass}"
                        connectionURL="${jdbc.url}"
                        userId="${jdbc.user}"
                        password="${jdbc.password}">
            <!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
            <property name="nullCatalogMeansCurrent" value="true"/>
            <property name="useInformationSchema" value="true"/>
        </jdbcConnection>
        <!--oracle配置-->
        <!--
            <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
            connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:test"
                userId="root"
                password="root">
            </jdbcConnection>
        -->

        <!-- 默认false,把JDBC DECIMALNUMERIC 类型解析为 Integer,为 true时把JDBC DECIMALNUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="true"/>
        </javaTypeResolver>

        <!-- 对于生成的entity所在包 -->
        <javaModelGenerator targetPackage="com.example.generate.entity" targetProject="src\main\java"/>

        <!-- 对于生成的mapper所在目录 -->
        <sqlMapGenerator targetPackage="com.example.generate.mapper" targetProject="src\main\resources"/>

        <!-- 配置mapper对应的java映射 -->
        <javaClientGenerator targetPackage="com.example.generate.mapper" targetProject="src\main\java"
                             type="XMLMAPPER"/>

        <!--生成全部表tableName设为%-->
        <table tableName="${tableName}">
            <generatedKey column="id" sqlStatement="MySql" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

1.2.2 generator.properties文件
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.cj.jdbc.Driver

#哪一张表 生成全部表tableName设为%
tableName=sys_role

1.2.3 application.yml文件
server:
  port: 8089

# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      username: root
      password: root
      # 初始连接数
      initialSize: 5
      # 最小连接池数量
      minIdle: 10
      # 最大连接池数量
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 配置一个连接在池中最大生存的时间,单位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # 配置检测连接是否有效  Oracle: select 1 from dual    MySql: select 1
      validationQuery: SELECT 1
      # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      testWhileIdle: true
      # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      testOnBorrow: false
      # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # 设置白名单,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # 控制台管理用户名和密码
        login-username: admin
        login-password: admin
      filter:
        stat:
          enabled: true
          # 慢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
logging:
  level:
    root: info
    com.example: debug


1.2.3 Application启动类
@SpringBootApplication
//mapper目录
@MapperScan("com.example.generate.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

1.3 功能示范

1.3.1 双击maven插件生成代码及最终效果

在这里插入图片描述

1.3.2 代码测试

在这里插入图片描述

1.4 注意事项及扩展功能

1.4.1 插件报错Cannot instantiate object of type com.itfsw.mybatis.generator.plugins.xxx

在这里插入图片描述
解决:插入mybatis-generator-plugin即可
在这里插入图片描述

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>

            <plugin>
                <!-- mybatis-generator 自动代码插件 -->
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <!-- 配置文件 -->
                    <configurationFile>${basedir}/src/main/resources/generate/mybatis-generator.xml</configurationFile>
                    <!-- 允许移动和修改 -->
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <!-- jdbc 依赖 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <!-- 插件版本应和上面导入的jar包版本一致:8.0.16 -->
                        <version>8.0.16</version>
                    </dependency>
                    <dependency>
                        <groupId>com.itfsw</groupId>
                        <artifactId>mybatis-generator-plugin</artifactId>
                        <version>1.3.8</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
1.4.2 关于数据库text字段,只能插入无法查询的问题
1.4.2.1 bug重现
1.4.2.1.1 数据库表中对应的text字段

在这里插入图片描述

1.4.2.1.2 查询结果,content字段为null

在这里插入图片描述

1.4.2.1.3 插入,能保留结果

在这里插入图片描述

1.4.2.1.4 原因分析:代码生成xml对应的类型有问题,查询无法匹配

在这里插入图片描述

1.4.2.1.5 解决方案:插件生成代码时,修改为varchar类型。生成完毕后,再改回text类型即可

在这里插入图片描述
测试结果:显示正确
在这里插入图片描述

1.5 功能点评

以下观点带有强烈个人使用情感
优点:
1:最早接触的代码生成器,打开了新世界的大门
2:相比手写实体类,mapper,和xml。这代码生成器的确简化了很多代码
不足:
1:代码生成器会把整个表格生成,不能去表明前缀。如SysRole不能自动生成Role
2:生成代码没有作者注释
3:生成代码没有整合swagger注解(这个我不会)
4:缺少service层代码
5:查询不能和构造者模式完美结合
6:对应text字段,查询会为null无法得出正确结果
7:开发时,数据表字段经常变更的情况,每次都要重新生成代码。操作极不友好。

插件参考地址:https://github.com/itfsw/mybatis-generator-plugin

2.TK通用mapper

1.1 导入依赖

完成依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    
        <dependencies>
        <!-- web启动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 测试启动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!-- 数据库相关的 -->
        <!-- tk通用mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>
        <!-- 分页助手启动器 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!--mysql启动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc的启动器,默认使用HikariCP连接池-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- Druid连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.14</version>
        </dependency>
        
        <!-- lombok插件 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <configurationFile>
                        ${basedir}/src/main/resources/generator/generatorConfig.xml
                    </configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <!-- 驱动版本选择,和上面的一致 -->
                        <version>8.0.16</version>
                    </dependency>
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.1.5</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

1.2 配置文件

1.2.1 generatorConfig.xml配置文件

文件存放位置!
generatorConfig.xml文件

<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!-- 配置文件属性 -->
    <properties resource="generator/config.properties"/>

    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
            <property name="caseSensitive" value="true"/>
            <property name="lombok" value="Getter,Setter,ToString"/>
        </plugin>

        <jdbcConnection driverClass="${jdbc.driverClass}"
                        connectionURL="${jdbc.url}"
                        userId="${jdbc.user}"
                        password="${jdbc.password}">
        </jdbcConnection>

        <!-- 实体类 -->
        <javaModelGenerator targetPackage="com.example.entity"
                            targetProject="src/main/java"/>

        <!-- mapper.xml文件 -->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject="src/main/resources"/>

        <!-- mapper接口 -->
        <javaClientGenerator targetPackage="com.example.mapper"
                             targetProject="src/main/java"
                             type="XMLMAPPER"/>

        <!-- 数据库哪一张表 -->
        <table tableName="${tableName}">
            <!-- 会自动扫描表中的主键已经  字段名为id的字段。
                注意:如果id不存在,不需要理。会自动扫码表中id
                      如果id存在,且不是主键。会出现主键查询失败!
             -->
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>

    </context>
</generatorConfiguration>
1.2.2 config.properties配置文件

config.properties配置文件

jdbc.url=jdbc:mysql://127.0.0.1:3306/test?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.cj.jdbc.Driver

#生成哪一张表
tableName=sys_role
1.2.3 application.yml配置文件
server:
  port: 8090

# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      username: root
      password: root
      # 初始连接数
      initialSize: 5
      # 最小连接池数量
      minIdle: 10
      # 最大连接池数量
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 配置一个连接在池中最大生存的时间,单位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # 配置检测连接是否有效  Oracle: select 1 from dual    MySql: select 1
      validationQuery: SELECT 1
      # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      testWhileIdle: true
      # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      testOnBorrow: false
      # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # 设置白名单,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # 控制台管理用户名和密码
        login-username: admin
        login-password: admin
      filter:
        stat:
          enabled: true
          # 慢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
logging:
  level:
    root: info
    com.example: debug

1.3 功能示范

1.3.1 双击maven插件生成代码

插件使用

1.3.2 最终效果

在这里插入图片描述

1.3.3 代码测试

1.启动类:@MapperScan注解需要用tk包下的
在这里插入图片描述
2: 测试结果
在这里插入图片描述

1.4 注意事项及扩展功能

1.4.1 MySql连接驱动选择 及错误提示(Cannot obtain primary key information from the database, generated objects may be incomplete)

1.插件的驱动选择应和导入Jar依赖一致
在这里插入图片描述
2: MySql驱动8.x版本的问题 (官方开发文档案例是5.1.29)
2.1 问题:代码生成实体类缺少主键映射,生成提示(Cannot obtain primary key information from the database, generated objects may be incomplete)
在这里插入图片描述
2.2 解决方案 jdbc.url加上nullCatalogMeansCurrent=true属性即可
config.properties下的完整jdbc.url

jdbc.url=jdbc:mysql://127.0.0.1:3306/test?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8

1.4.2 配合lombok插件构造者模式

在这里插入图片描述
1:实体类注解

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "sys_role")
public class SysRole {
。。。
}

2:案例Demo
在这里插入图片描述

1.4.3 application.xml映射xml文件,扫描实体类和开始驼峰命名

1:application.xml 添加以下配置

mybatis:
  #实体类扫描
  type-aliases-package: com.example.entity
  # xml配置文件
  mapper-locations: classpath:mapper/*.xml
  # 开始驼峰命名
  configuration:
    map-underscore-to-camel-case: true

2:编写测试方法
2.1 编写自定义sql
在这里插入图片描述
2.2 测试结果
在这里插入图片描述
2.3 application.xml映射xml文件优点
当数据库表格新增字段或删除字段时候,只需要修改实体类即可,不需要对应的xml修改resultMap属性
以下配置不需要修改,直接删除即可

  <resultMap id="BaseResultMap" type="com.example.entity.SysRole">
    <!--
      WARNING - @mbg.generated
    -->
    <id column="role_id" jdbcType="INTEGER" property="roleId" />
    <result column="role_name" jdbcType="VARCHAR" property="roleName" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
    <result column="delete_status" jdbcType="VARCHAR" property="deleteStatus" />
  </resultMap>

1.5 功能点评

以下观点带有强烈个人使用情感
优点:
1: tk通用mapper配置lombok插件构造者模式,极大方便代码持久层操作
2: 通过配置application.xml映射xml文件,数据库表格字段新增或删除时,只需要修改实体类即可。方便数据库表格字段经常变更(设计表格阶段)
不足:
1:代码生成器会把整个表格生成,不能去表明前缀。如SysRole不能自动生成Role
2:生成代码没有作者注释
3:生成代码没有整合swagger注解
4:缺少service层代码

3.Mybatis Plus 代码生成器

1.1 导入依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- web启动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 测试启动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!-- mybatis-plus启动器 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- Druid连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <!-- 最新版本 -->
            <version>1.1.23</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- lombok插件 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- 代码生成器 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
        </dependency>

        <!-- swagger接口 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.8.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1.2 插件配置

1.2.1 代码生成器CodeGenerator配置类
package com.example;


import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * @Description: 演示例子
 * @Author: wenzizheng
 * @Create: 2020-09-16 21:17
 * @Version: 1.0
 **/
public class CodeGenerator {

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        //todo 路径
//        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setOutputDir(projectPath + "/mybatis-plus/src/main/java");
        //todo 作者
        gc.setAuthor("wenzizheng");
        //是否支持AR模式
        gc.setActiveRecord(true);
        //生成后是否打开
        gc.setOpen(false);
        //todo 实体属性 Swagger2 注解
        gc.setSwagger2(true);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.example.mybatis.plus");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setController("controller");
        pc.setMapper("mapper");

        // 关闭xml生成
        TemplateConfig tc = new TemplateConfig();
        tc.setXml(null);
        mpg.setTemplate(tc);
        mpg.setPackageInfo(pc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //是否使用lombok插件
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        //todo  表名,多个以,逗号分隔
        strategy.setInclude("sys_role".split(","));
        strategy.setControllerMappingHyphenStyle(true);
        //todo 去除前缀
        strategy.setTablePrefix("sys_");


        mpg.setStrategy(strategy);
        mpg.execute();
    }

}

1.2.2 application.yml配置文件
server:
  port: 8091

# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      username: root
      password: root
      # 初始连接数
      initialSize: 5
      # 最小连接池数量
      minIdle: 10
      # 最大连接池数量
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 配置一个连接在池中最大生存的时间,单位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # 配置检测连接是否有效  Oracle: select 1 from dual    MySql: select 1
      validationQuery: SELECT 1
      # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      testWhileIdle: true
      # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      testOnBorrow: false
      # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # 设置白名单,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # 控制台管理用户名和密码
        login-username: admin
        login-password: admin
      filter:
        stat:
          enabled: true
          # 慢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
logging:
  level:
    root: info
    com.example: debug

1.2.3 SpringBoot启动类
@SpringBootApplication
@MapperScan("com.example.mybatis.plus.mapper")
public class MybatisPlusApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class);
    }
}

1.3 功能示范

1.3.1 代码生成 CodeGenerator类直接main启动即可

在这里插入图片描述

1.3.2 功能测试

1:实体类AR模式

    /**
     * 实体类AR模式
     */
    @Test
    public void selectByAR() {
        Role role = new Role();
        List<Role> roleList = role.selectAll();
        roleList.forEach(System.out::println);
    }

2:mapper测试


    @Autowired
    private RoleMapper roleMapper;

    /**
     * mapper层测试
     */
    @Test
    public void selectByMapper() {
        List<Role> roleList = this.roleMapper.selectList(null);
        roleList.forEach(System.out::println);
    }

3:service测试

    @Autowired
    private IRoleService roleService;

    /**
     * service层测试
     */
    @Test
    public void selectByService() {
        List<Role> roleList = this.roleService.list();
        roleList.forEach(System.out::println);
    }

在这里插入图片描述

1.4 注意事项及扩展功能

1.4.1 生成器细节
1.4.1.1 目录结构
        //todo 路径
        // 非聚合工程,直接这条即可
//      gc.setOutputDir(projectPath + "/src/main/java");
		// 本项目为聚合工程,子模块需要加对应目录mybatis-plus
        gc.setOutputDir(projectPath + "/mybatis-plus/src/main/java");
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.example.mybatis.plus");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setController("controller");
        pc.setMapper("mapper");
1.4.1.2 数据库连接及对应表代码生成
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        mpg.setDataSource(dsc);
        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //是否使用lombok插件
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        //todo  表名,多个以,逗号分隔
        strategy.setInclude("sys_role".split(","));
        strategy.setControllerMappingHyphenStyle(true);
        //todo 去除前缀
        strategy.setTablePrefix("sys_");
1.4.2 lombok构造者模式

1:在实体类上加上 @Builder @NoArgsConstructor @AllArgsConstructor注解即可

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@TableName("sys_role")
@ApiModel(value="Role对象", description="后台角色表")
public class Role extends Model<Role> {
。。。
}

2:测试Demo
在这里插入图片描述

1.4.3 错误Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column ‘create_time’ from result set. Cause: java.sql.SQLFeatureNotSupportedException

在这里插入图片描述

1.4.3.1原因

代码生成器生成实体类时间为Java8的LocalDateTime,低版本duird连接不支持Java8的时间LocalDateTime
在这里插入图片描述

1.4.3.2 解决方法

把druid连接池升级到1.1.21版本以上即可

1.4.3.3 详情参考

链接: link.

1.5 功能点评

1.5.1 点评

优点:Mybatis-Plus(简称MP)极大的简化了代码操作,能做到这程度,还能有啥要求。能用MP就尽量用MP。
缺点:相见恨晚,公司有的项目还在用原生Mybatis!!!

1.5.2 学习推荐

官网(入门不推荐,只推荐进阶学习):https://baomidou.com/guide/

视频学习(推荐慕课网)
入门: https://www.imooc.com/learn/1130
晋级: https://www.imooc.com/learn/1171

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值