一.MBG介紹
MyBatis Generator(MBG)是一個Mybatis的代碼生成器,它可以用來生成可以訪問(多個)表的基礎對象。MBG解決了對數據庫操作有最大影響的一些簡單的CRUD(插入,查詢,更新,刪除)操作。MBG會生成:匹配表結構的Java POJO;MyBatis兼容SQL映射XML文件;Mapper接口類。
二.配置示例
MySQL數據庫創建用戶表(tb_user),建表語句
CREATE TABLE `spring`.`tb_user` ( `id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(45) NOT NULL, `password` VARCHAR(45) NOT NULL, PRIMARY KEY (`id`)) DEFAULT CHARACTER SET = utf8;
配置數據庫連接,創建resources/mybatis/db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://172.17.0.2:3306/spring
jdbc.username=root
jdbc.password=password
配置mybatis generator,創建resources/mybatis/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="mybatis/db.properties"/> <!-- 指定數據庫驅動jar地址,可以pom.xml中設置 --> <!--<classPathEntry location="${user.home}/.m2/repository/mysql/mysql-connector-java/5.1.44/mysql-connector-java-5.1.44.jar"/>--> <!-- 配置環境 defaultModelType:指定生成模型類型策略 1.conditional:這是默認值,這個模型和下面的hierarchical類似,除了如果那個單獨的類將只包含一個字段,將不會生成一個單獨的類。 因此,如果一個 表的主鍵只有一個字段,那么不會為該字段生成單獨的實體類,會將該字段合並到基本實體類中。 2.flat:該模型為每一張表只生成一個實體類。這個實體類包含表中的所有字段。 3.hierarchical:如果表有主鍵,那么該模型會產生一個單獨的主鍵實體類,如果表還有BLOB字段, 則會為表生成一個包含所有BLOB字段的單獨的實體類,然 后為所有其他的字段生成一個單獨的實體類。 MBG會在所有生成的實體類之間維護一個繼承關系。 --> <context id="mysql" defaultModelType="flat"> <!-- 是否取消注釋 --> <commentGenerator> <property name="suppressAllComments" value="true"/> </commentGenerator> <!-- jdbc連接 --> <jdbcConnection driverClass="${jdbc.driverClassName}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/> <!-- 生成實體類 --> <javaModelGenerator targetPackage="com.learn.spring.server.model" targetProject="src/main/java"/> <!-- 生成maper.xml文件 --> <sqlMapGenerator targetPackage="mybatis/mapper" targetProject="src/main/resources"/> <!-- 生成dao接口 --> <javaClientGenerator targetPackage="com.learn.spring.server.dao" targetProject="src/main/java" type="XMLMAPPER"/> <!-- 配置表信息,不生成幫助類examples--> <table schema="" tableName="tb_user" domainObjectName="UserDO" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"/> </context> </generatorConfiguration>
Maven配置MyBatis Generator,編輯pom.xml
<plugins> <!-- MyBatis Generator --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.5</version> <!-- 指定jdbc驅動,可以generatorConfig.xml中設置 --> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> </dependencies> <configuration> <!-- 打印執行過程 --> <verbose>true</verbose> <!-- 允許覆蓋生成的文件 --> <overwrite>true</overwrite> <!-- 配置文件路徑 --> <configurationFile>${basedir}/src/main/resources/mybatis/generatorConfig.xml</configurationFile> <!-- 生成部分mapper,指定table名字 --> <tableNames> tb_user </tableNames> </configuration> </plugin> </plugins>
三.執行驗證
執行mvn mybatis-generator:generate,生成UserDOMapper.java、UserDO.java、UserDOMapper.xml,插件執行成功。
四.<table>元素常用屬性
該元素至少要配置一個,可以配置多個,該元素用來配置要通過內省的表,只有配置的才會生成實體類和其他文件。
該元素有一個必選屬性:
tableName:指定要生成的表名,可以使用SQL通配符匹配多個表,如:<table tableName="%" />
該元素包含多個可選屬性:
schema:數據庫的schema,可以使用SQL通配符匹配。設置后,生成SQL的表名會變成如schema.tableName的形式。
catalog:數據庫的catalog,如果設置了該值,生成SQL的表名會變成如catalog.tableName的形式。
alias:如果指定,這個值會用在生成的select查詢SQL的表的別名和列名上,列名會被別名為alias_actualColumnName這種模式。
domainObjectName:生成對象的基本名稱,如果沒有指定,MBG會自動根據表名來生成名稱。
enableXXX:XXX代表多種SQL方法,該屬性用來指定是否生成對應的XXX語句。
modelType:和<context>的defaultModelType含義一樣,這里可以針對表進行配置,這里的配置會覆蓋<context>的defaultModelType配置。
escapeWildcards:這個屬性表示當查詢列,是否對schema和表名中的SQL通配符('_' and '%')進行轉義,默認false。
delimitIdentifiers:是否給標識符增加**分隔符**,默認false。當catalog,schema或tableName中包含空白時,默認true。
delimitAllColumns:是否對所有列添加**分隔符**,默認false。
除了<property>子元素外,<table>還包含以下子元素:
<generatedKey> (0個或1個):用來指定自動生成主鍵的屬性,如果指定這個元素,MBG在生成insert的SQL映射文件中插入一個<selectKey>元素。也就是數據庫自增后如果需要知道值,就用這個,這個是將自增結果回填到對象中。
<columnRenamingRule> (0個或1個):用來在MBG生成列之前,對列進行重命名。對於存在同一前綴的字段想在生成屬性名時去除前綴的表非常有用。
<columnOverride> (0個或多個):用來修改表中某個列的屬性(屬性名、數據類型),MBG會使用修改后的列來生成domain的屬性。
<ignoreColumn> (0個或多個):用來屏蔽不需要生成的列。