Spring-Boot添加MyBatis:自动生成代码方式

版权声明:本文为博主原创文章,未经博主允许不得用于任何商业用途,转载请注明出处。 https://blog.csdn.net/fyyyr/article/details/83620847

Spring-Boot中使用MyBatis,通常要针对数据库的表来写对应的实体类,然后写dao层接口,并实现mapper的xml映射。也就是说,一个表,至少对应3个文件。

实际上,这3个文件的代码都可以借助maven插件来自动生成。

 

创建了一个MySQL数据库,并添加了一张表:

 

在以下添加过程中,由于pom.xml是最后修改的,所以在全部添加完成之前,IDEA会有错误提示。当顺序执行以下步骤直到pom.xml修改完成后,错误提示就会消失。

以下所有涉及到路径的配置,需要根据自己的项目来进行调整

一.   在src/mian/java/com/template目录下,创建3个文件夹:modeldaomapper。分别用于存放即将生成的实体类、dao层代码、xml映射文件。

二.   在程序入口文件application类前添加注解:

@MapperScan("com.template.dao")

在后面修改完pom.xml后,这里需要导入MapperScan的类。

三.   在src/main/resources目录下,添加一个mybatis文件夹,在其下添加一个mybatis-config.xml文件。

打开mybatis-config.xml,将内容修改为:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer" />
        <typeAlias alias="Long" type="java.lang.Long" />
        <typeAlias alias="HashMap" type="java.util.HashMap" />
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
        <typeAlias alias="ArrayList" type="java.util.ArrayList" />
        <typeAlias alias="LinkedList" type="java.util.LinkedList" />
    </typeAliases>
</configuration>

这样就为常用的数据类型定义了别名。

四.   在src/main/resources目录下,添加两个文件:generator.propertiesgeneratorConfig.xml

generator.properties是为了给generatorConfig.xml提供数据库信息使用的。若直接将数据库信息写到generatorConfig.xml中,则generator.properties可以不用创建。但考虑到字符转义的问题,推荐使用generator.properties。

关于generator.propertiesgeneratorConfig.xml的配置,见附录。

五.   在application.properites中添加配置项来指定配置文件和数据库。

mybatis.config-location = classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations = classpath:mapper/*.xml

spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 123456

这些配置项的key都是固定的,只需要修改后面的值。

其中classpath指向target/classes文件夹。只有java-resource类型文件夹才会将自身的子文件复制到classes下。工程默认的java-resource类型文件夹只有一个,那就是src/main/resources。由于每个表对应的xml会生成在src/main/java/com/template/mapper文件夹下,不属于src/resources文件夹,所以后面会在pom.xml中使用Resource Plugin来将该目录下的资源文件复制到classes文件夹下。因此这里可以用:

mybatis.mapper-locations = classpath:mapper/*.xml

来引用xml文件。其中mapper是classes的子文件夹。

注意区别于3中添加的generator.properties。虽然二者配置相似,但generator.properties仅仅是提供给generatorConfig.xml使用的,而application.properites中的数据库配置则是提供给mybatis使用的。

六.   打开pom.xml,对其进行以下3项修改。

添加依赖库:

<!-- 添加mybatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

<!-- 添加mysql驱动 -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
</dependency>

添加xml文件的映射路径和properties文件路径:

<build>
   <resources>
      <resource>
         <directory>src/main/java/com/template/mapper</directory>
         <targetPath>mapper</targetPath>
      </resource>

      <resource>
          <directory>src/main/resources</directory>
      </resource>
   </resources>
...
</build>

添加自动生成插件

<plugins>   
   <plugin>
      <groupId>org.mybatis.generator</groupId>
      <artifactId>mybatis-generator-maven-plugin</artifactId>
      <version>1.3.5</version>
      <configuration>
         <verbose>true</verbose>
         <overwrite>true</overwrite>
      </configuration>
      <dependencies>
         <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
         </dependency>
         <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
         </dependency>
      </dependencies>
   </plugin>
...
</plugins>
其中:
  1. 使用<resources>来将目标文件夹下的资源文件复制到classes/mapper文件夹下。
  2. 自动生成插件中mysql的版本号就是本机的mysql版本号。

    可以使用命令查看mysql的版本号:

    会看到mysql的版本为8.0.13。

  3. pom.xml修改后,IDEA的右下角会弹出提示:

    点击其中的Import Changes来导入改动。

七.   为IDEA添加配置项工具

打开菜单:Run→Edit Configurations:

点击Run/Debug Configurations对话框左上角的+号,在弹出对话框中选Maven:

然后填写右侧的name和Command line信息,其中name即新添加的配置项工具名,可自定义;Command line为命令行,填写:mybatis-generator:generate -e

确定,即可在右上角看到添加的配置项工具:

八.   选中6中添加的配置项工具Generator,点运行

这样,就会执行自动生成:


这样,当需要自动生成新的表相关代码时,只要在generatorConfig.xml中添加一个<table>标签,并重新运行一次配置项工具即可。

 

特别注意:执行自动生成之前,务必检查要生成的xml是否已存在。若是,则先将该文件删除。这是因为当前版本的自动生成的逻辑为:若文件已存在,则将内容直接追加到文件末尾。因此若目标xml文件已存在的情况下进行了重复的生成操作,会导致文件中出现重复内容,从而报错。

 

附录
  • generator.properties配置:

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
jdbc.userId=root
jdbc.password=123456

generator.properties指定了具体的数据库信息。其中serverTimezone=GMT%2B8参数用于设置时区,否则会出现The server time zone value '???ú±ê×??±??' is unrecognized or represents......的错误。

另外这里的driverClass用的是com.mysql.cj.jdbc.Driver,这是因为mysql版本较高。若是低版本的mysql,使用的是com.mysql.jdbc.Driver

  • generatorConfig.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="generator.properties" />
    <context id="default" targetRuntime="MyBatis3">
        <!-- optional,旨在创建class时,对注释进行控制 -->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--jdbc的数据库连接 ,这些参数是对应于刚刚建立的generator.properties 文件中的内容-->
        <jdbcConnection
                driverClass="${jdbc.driverClass}"
                connectionURL="${jdbc.connectionURL}"
                userId="${jdbc.userId}"
                password="${jdbc.password}">
        </jdbcConnection>

        <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
            targetPackage     指定生成的model生成所在的包名
            targetProject     指定在该项目下所在的路径
        -->
        <javaModelGenerator targetPackage="com.template.model"
                            targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!--Mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 -->
        <sqlMapGenerator targetPackage="com.template.mapper"
                         targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
                type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
                type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
                type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
        -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.template.dao"
                             targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <table tableName="student" domainObjectName="Student"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false"><!--在这里,设置从数据库到实体类的对应关系名。且还可以设置是否生成增删查改方法-->
        </table>
    </context>
</generatorConfiguration>

generatorConfig.xml是具体的生成配置,指定了生成所需要的各种信息。需要根据实际工程来调整。

<javaModelGenerator>对应实体类的目录model。

<sqlMapGenerator>对应xml映射文件所在目录mapper。
<javaClientGenerator>对应dao目录。注意里面的type参数,可以生成基于注解的dao或基于xml的dao。这里设置为基于xml的dao。
去掉以上任何一项,对应的文件便不会生成。

最后的<table>标签指定了要生成的表。若要生成多张表,可以配置多个<table>标签。

特别注意在该文件中导入了generator.properties,这是为了获取数据库信息。可以选择不导入,而直接将数据库信息写在该文件中,这样就可以不用创建generator.properties文件。

就像:

<jdbcConnection
        driverClass=" com.mysql.cj.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost:3306/mytest?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT%2B8"
        userId="root"
        password="123456">
</jdbcConnection>

但需要注意的一点就是在xml中无法直接使用&符号,需要进行转义:&amp;

猜你喜欢

转载自blog.csdn.net/fyyyr/article/details/83620847