Spring-Boot中使用MyBatis,通常要针对数据库的表来写对应的实体类,然后写dao层接口,并实现mapper的xml映射。也就是说,一个表,至少对应3个文件。
实际上,这3个文件的代码都可以借助maven插件来自动生成。
创建了一个MySQL数据库,并添加了一张表:
在以下添加过程中,由于pom.xml是最后修改的,所以在全部添加完成之前,IDEA会有错误提示。当顺序执行以下步骤直到pom.xml修改完成后,错误提示就会消失。
以下所有涉及到路径的配置,需要根据自己的项目来进行调整。
一. 在src/mian/java/com/template目录下,创建3个文件夹:model,dao,mapper。分别用于存放即将生成的实体类、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.properties和generatorConfig.xml。
generator.properties是为了给generatorConfig.xml提供数据库信息使用的。若直接将数据库信息写到generatorConfig.xml中,则generator.properties可以不用创建。但考虑到字符转义的问题,推荐使用generator.properties。
关于generator.properties和generatorConfig.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>
其中:
- 使用<resources>来将目标文件夹下的资源文件复制到classes/mapper文件夹下。
- 自动生成插件中mysql的版本号就是本机的mysql版本号。 可以使用命令查看mysql的版本号:
会看到mysql的版本为8.0.13。
- 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&characterEncoding=utf-8&serverTimezone=GMT%2B8"
userId="root"
password="123456">
</jdbcConnection>
但需要注意的一点就是在xml中无法直接使用&符号,需要进行转义:&。