基於我分享的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依賴才能正常運行。具體還沒有完全找到原因。