基于我分享的springboot集成GMB(mybatis代码生成工具)后,再次加入tk.mybatis生成通用mapper,按需生成xml文件。在实际项目开发中,我们经常会遇到添加字段的情况,一旦增加一个字段,我们就需要重新生成相关代码文件,就需要对比当前生成的和前期写的代码,比较麻;用了tk.mybatis生成通用的mapper代码文件,和基本的xml文件,当再次修改表字段时候,由于以前xml的方法都对应到了通用的mapper接口中,我们只需要修改生成的表对应的实体类,反而mapper通用接口中还有更多的方法供使用,另外这样生成的entity实体类可以更好的适应spring data jpa(都需要加注解,且类似)
1.项目结构
2.pom.xml加入依赖
<!-- mybatis 生成工具依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!-- tk.mybatis 插件依赖-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
<!-- 插件配置-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- mybatis generator自动生成代码 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<!-- 此处的依赖在当你使用mybatis工具类(main方法)启动的时候,不需要添加;
当你使用idea中的右侧插件启动的时候,则需要添加-->
<dependencies>
<dependency>
<groupId> mysql</groupId>
<artifactId> mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.5.2</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<!--允许移动生成的文件 -->
<verbose>true</verbose>
<!-- 是否覆盖 -->
<overwrite>true</overwrite>
<!-- 自动生成的配置 -->
<configurationFile>
src/main/resources/generatorConfig.xml</configurationFile>
</configuration>
</plugin>
</plugins>
3.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> <context id="Tables" targetRuntime="MyBatis3"> <!-- 使用tk.mybatis插件 --> <plugin type="tk.mybatis.mapper.generator.MapperPlugin"> <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/> <!-- caseSensitive默认false,当数据库表名区分大小写时,可以将该属性设置为true --> <property name="caseSensitive" value="true"/> </plugin> <!--数据库连接 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://10.10.10.10:3306/Test?useSSL=false" userId="root" password="root"> </jdbcConnection> <!--默认false Java type resolver will always use java.math.BigDecimal if the database column is of type DECIMAL or NUMERIC. --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!--生成实体类 指定包名 以及生成的地址 (可以自定义地址,但是路径不存在不会自动创建 使用Maven生成在target目录下,会自动创建) --> <javaModelGenerator targetPackage="com.example.entity.test" targetProject="src/main/java"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> <property name="constructorBased" value="false" /> <property name="immutable" value="false" /> </javaModelGenerator> <!--生成SQLMAP文件 --> <sqlMapGenerator targetPackage="mappers.test" targetProject="src/main/resources"> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!--生成Dao文件 可以配置 type="XMLMAPPER"生成xml的dao实现 context id="DB2Tables" 修改targetRuntime="MyBatis3" --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.dao.test" targetProject="src/main/java"> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!--对应数据库表 mysql可以加入主键自增 字段命名 忽略某字段等 --> <!-- XXByExample false 控制实体类,如menuExample辅助类的生成 --> <table tableName="dim_menu" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" > <property name="useActualColumnNames" value="false" /> <!-- 需要插入时返回主键值,请将此属性打开,column值为主键的列明 --> <generatedKey column="id" sqlStatement="MySql" identity="true" /> </table> </context> </generatorConfiguration> 4.配置启动类 这里说一下,如果你在pom.xml文件中的插件中配置依赖(详细见上面的依赖配置),可以直接点击idea右侧的插件,直接运行;我这里配置的启动类指的是使用运行main方法的方式来生成。
package com.example.config; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.exception.InvalidConfigurationException; import org.mybatis.generator.exception.XMLParserException; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.File; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class MyBatisGeneratorUtil { public static void main(String[] args) { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; String genCfg = "/generatorConfig.xml"; File configFile = new File(MyBatisGeneratorUtil.class.getResource(genCfg).getFile()); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = null; try { config = cp.parseConfiguration(configFile); } catch (IOException e) { e.printStackTrace(); } catch (XMLParserException e) { e.printStackTrace(); } DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = null; try { myBatisGenerator = new MyBatisGenerator(config, callback, warnings); } catch (InvalidConfigurationException e) { e.printStackTrace(); } try { myBatisGenerator.generate(null); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
5.运行生成后的文件,也解释一下
entity类中:可以把字段注释也带出来,另外一个重要的就是生成的会有注解,那么使用过spring data jpa 的朋友就知道了,我们也是需要自己把数据库表的对应关系按照这样来做注解,所以如果你也集成了jpa,那么就又少了一点事。
@Table(name = "dim_menu") public class DimMenu { /** * id */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; /** * 菜单名称 */ private String name; }
xml文件:这里生成的xml文件就不会像MBG生成的那样多内容,实现的方法都在mapper接口当中了,所以当我们xml里面写了自己的sql方法,增加字段也不需要重新生成了。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.dao.test.DimMenuMapper"> <resultMap id="BaseResultMap" type="com.example.entity.test.DimMenu"> <!-- WARNING - @mbg.generated --> <id column="id" jdbcType="INTEGER" property="id" /> <result column="name" jdbcType="VARCHAR" property="name" /> </resultMap> </mapper>
mapper接口:这里面集成了通用的mapper,采用反射等可以实现以前通过MBG生成的接口了
package com.example.dao.mapper.test; import com.example.entity.test.DimMenu ; import tk.mybatis.mapper.common.Mapper; public interface DimMenuMapper extends Mapper<DimMenu> { }
6.小结一下
这些做完了,实际上你还不能正常的运行项目,会报错,报错一般都是指的生成的mapper接口不能被注入或者是没有被注入,所以这里还需要把生成的类交给spring容器来管理。这里我也遇到过大坑,都是网上查询的结果,处理方法如下
启动类DemoApplication加入注解 @SpringBootApplication @MapperScan(basePackages = {"com.example.dao.mapper"}) @ComponentScan(basePackages = {"com.example.dao.mapper"}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
或者在mapper类上加上@Mapper注解。
但是博主是测试过程中,方法一不起作用,方法二加了之后,但是还需要屏蔽pom.xml的mapper依赖才能正常运行。具体还没有完全找到原因。