1、使用Mapper專用的MyBatis Generator插件
通用Mapper在1.0.0版本的時候增加了MyBatis Generator(以下簡稱MBG)插件,使用該插件可以很方便的生成實體類、Mapper接口以及對應的XML文件。
本篇文檔就是講述如何在MBG中使用該插件。
首先對MBG不太了解的可以先閱讀下面的文檔:MybatisGeneator詳解
2、使用通用Mapper插件
插件代碼在com.github.abel533.generator包下面,一共有如下兩個類:
- MapperCommentGenerator:該類用於生成數據庫備注字段的注釋,以及實體類字段的注解。
- MapperPlugin:插件的實現類,該類默認使用上面這個注釋生成器,插件屏蔽了一般的CRUD方法(保留了Example),插件可以生成實體的@Table注解。
- Maven中添加依賴:
1 <dependency> 2 <groupId>com.github.abel533</groupId> 3 <artifactId>mapper</artifactId> 4 <!-- 建議使用最新版本 --> 5 <version>x.x.x</version> 6 </dependency>
運行MBG有多種方法,這里只介紹兩種比較常見的方法。並且有關的內容會針對這樣的運行方式進行配置。
2.1. 使用Java編碼方式運行MBG
使用這種方式,首先下載MBG的Jar包(本項目[taotao]測試代碼中使用maven引入jar包,使用Java代碼運行)。
Java代碼很容易,和文檔中的一樣:
1 List<String> warnings = new ArrayList<String>(); 2 boolean overwrite = true; 3 ConfigurationParser cp = new ConfigurationParser(warnings); 4 Configuration config = cp.parseConfiguration( 5 Generator.class.getResourceAsStream("/generator/generatorConfig.xml")); 6 DefaultShellCallback callback = new DefaultShellCallback(overwrite); 7 MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); 8 myBatisGenerator.generate(null);
你只需要在你當前的項目中創建一個類,添加一個main方法,在main中寫上上面的代碼即可。
這段代碼容易,最主要的一個內容是"generatorConfig.xml",我們應該如何配置該類。
下面是一個generatorConfig.xml的例子:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE generatorConfiguration 3 PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" 4 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> 5 6 <generatorConfiguration> 7 <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"> 8 9 <!-- 通用Mapper的插件com.github.abel533.generator.MapperPlugin,該插件有一個必選的<property>屬性mappers,這里的mappers和通用Mapper中的mappers配置含義一樣,就是我們使用的通用Mapper接口,多個通用Mapper接口可以用逗號隔開 --> 10 <!-- 關於本插件,最重要的內容就是上面這個配置。下面要說的其他配置和普通的一致。 --> 11 <plugin type="com.github.abel533.generator.MapperPlugin"> 12 <property name="mappers" value="com.github.abel533.mapper.Mapper"/> 13 </plugin> 14 15 <!-- 數據庫配置信息,由於需要連接數據庫,需要保證項目的classpath下面有數據庫的JDBC驅動 --> 16 <jdbcConnection driverClass="com.mysql.jdbc.Driver" 17 connectionURL="jdbc:mysql://localhost:3306/test" 18 userId="root" 19 password=""> 20 </jdbcConnection> 21 22 <!-- 生成實體類的配置,是一個必須配置的內容 --> 23 <javaModelGenerator targetPackage="test.model" targetProject="G:\MyProject\src\main\java"/> 24 25 <!-- sqlMapGenerator是一個可選的配置,配置后可以生成Mapper接口對應的XML文件 --> 26 <sqlMapGenerator targetPackage="mapper" targetProject="G:\MyProject\src\main\resources"/> 27 28 <!-- 通用Mapper接口的配置,配置javaClientGenerator后會生成對應的接口文件,該接口會自動繼承前面配置的通用Mapper接口 --> 29 <javaClientGenerator targetPackage="test.mapper" targetProject="G:\MyProject\src\main\java" type="XMLMAPPER" /> 30 31 <!-- 最后一個配置table,這里使用SQL通配符%來匹配所有表。generatedKey意味着所有的表都有一個id自增的主鍵,在生成實體類的時候會根據該配置生成相應的注解 --> 32 <table tableName="%" > 33 <generatedKey column="id" sqlStatement="Mysql" identity="true"/> 34 </table> 35 </context> 36 </generatorConfiguration>
這段配置介紹完了,之后運行前面的JAVA方法,就會生成對應的文件。該文件的樣式最后貼個例子。
2.2. 使用Maven執行MBG
這里有一個完整的例子,Mybatis-Spring,下面講解的內容出自這個例子。
使用Maven插件的一個好處是可以將Maven中的屬性使用${property}形式在generatorConfig.xml中引用。
先看Maven的pom.xml文件(只顯示有關的部分內容):
1 <properties> 2 <!-- MyBatis Generator --> 3 <!-- Java接口和實體類 --> 4 <targetJavaProject>${basedir}/src/main/java</targetJavaProject> 5 <targetMapperPackage>com.isea533.mybatis.mapper</targetMapperPackage> 6 <targetModelPackage>com.isea533.mybatis.model</targetModelPackage> 7 <!-- XML生成路徑 --> 8 <targetResourcesProject>${basedir}/src/main/resources</targetResourcesProject> 9 <targetXMLPackage>mapper</targetXMLPackage> 10 <!-- 依賴版本 --> 11 <mapper.version>1.0.0</mapper.version> 12 <mysql.version>5.1.29</mysql.version> 13 </properties>
上面是pom.xml中properties配置的部分內容。這里配置了MBG配置文件中常用到的幾個路徑以及包名。還包含了通用Mapper的版本和數據庫JDBC驅動的版本。
下面是MBG的Maven插件配置:
1 <plugin> 2 <groupId>org.mybatis.generator</groupId> 3 <artifactId>mybatis-generator-maven-plugin</artifactId> 4 <version>1.3.2</version> 5 <configuration> 6 <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile> 7 <overwrite>true</overwrite> 8 <verbose>true</verbose> 9 </configuration> 10 <dependencies> 11 <dependency> 12 <groupId>mysql</groupId> 13 <artifactId>mysql-connector-java</artifactId> 14 <version>${mysql.version}</version> 15 </dependency> 16 <dependency> 17 <groupId>com.github.abel533</groupId> 18 <artifactId>mapper</artifactId> 19 <version>${mapper.version}</version> 20 </dependency> 21 </dependencies> 22 </plugin>
這里配置了MBG插件,並且配置了generatorConfig.xml配置文件的路徑。另外還有兩個依賴,分別是JDBC驅動以及通用Mapper(提供了MBG插件)。
下面我們在看看這個generatorConfig.xml配置文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE generatorConfiguration 3 PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" 4 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> 5 6 <generatorConfiguration> 7 <properties resource="config.properties"/> 8 9 <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"> 10 <property name="beginningDelimiter" value="`"/> 11 <property name="endingDelimiter" value="`"/> 12 13 <plugin type="${mapper.plugin}"> 14 <property name="mappers" value="${mapper.Mapper}"/> 15 </plugin> 16 17 <jdbcConnection driverClass="${jdbc.driverClass}" 18 connectionURL="${jdbc.url}" 19 userId="${jdbc.user}" 20 password="${jdbc.password}"> 21 </jdbcConnection> 22 23 <javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}"/> 24 25 <sqlMapGenerator targetPackage="${targetXMLPackage}" targetProject="${targetResourcesProject}"/> 26 27 <javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}" type="XMLMAPPER" /> 28 29 <table tableName="%" > 30 <generatedKey column="id" sqlStatement="Mysql" identity="true"/> 31 </table> 32 </context> 33 </generatorConfiguration>
可以看到這個配置文件中的大多數屬性都使用${}形式替代了。使用<properties resource="config.properties"/>引入了config.properties屬性配置,該文件內容如下:
1 # 數據庫配置 2 jdbc.driverClass = com.mysql.jdbc.Driver 3 jdbc.url = jdbc:mysql://localhost:3306/test 4 jdbc.user = root 5 jdbc.password = 6 7 #c3p0 8 jdbc.maxPoolSize=50 9 jdbc.minPoolSize=10 10 jdbc.maxStatements=100 11 jdbc.testConnection=true 12 13 # 通用Mapper配置 14 mapper.plugin = com.github.abel533.generator.MapperPlugin 15 mapper.Mapper = com.github.abel533.mapper.Mapper
使用配置文件的目的是因為系統多處地方使用了這種配置,因而使用一個屬性文件可以方便的保持一致。
除了引用配置文件中的屬性外,部分還使用了pom.xml中的屬性。這種方式使用起來更靈活。
運行
配置好之后如何運行呢?
在pom.xml這一級目錄的命令行窗口執行mvn mybatis-generator:generate即可(前提是配置了mvn)。
3、生成的代碼
下面是自動生成的代碼的例子,這些例子可以在Mybatis-Spring這里找到。
3.1、實體類UserInfo
1 package com.isea533.mybatis.model; 2 3 import javax.persistence.*; 4 5 @Table(name = "user_info") 6 public class UserInfo { 7 @Id 8 @Column(name = "Id") 9 @GeneratedValue(strategy = GenerationType.IDENTITY) 10 private Integer id; 11 12 /** 13 * 用戶名 14 */ 15 private String username; 16 17 /** 18 * 密碼 19 */ 20 private String password; 21 22 /** 23 * @return Id 24 */ 25 public Integer getId() { 26 return id; 27 } 28 29 /** 30 * @param id 31 */ 32 public void setId(Integer id) { 33 this.id = id; 34 } 35 36 /** 37 * 獲取用戶名 38 * 39 * @return username - 用戶名 40 */ 41 public String getUsername() { 42 return username; 43 } 44 45 /** 46 * 設置用戶名 47 * 48 * @param username 用戶名 49 */ 50 public void setUsername(String username) { 51 this.username = username; 52 } 53 }
代碼過長,省略了一部分,完整查看:UserInfo
可以看到這里生成的注釋是有意義的內容,注釋來源於數據庫表字段的注釋。
這里還自動生成了幾項注解的內容。
3.2、Mapper接口UserInfoMapper
1 package com.isea533.mybatis.mapper; 2 3 import com.github.abel533.mapper.Mapper; 4 import com.isea533.mybatis.model.UserInfo; 5 6 public interface UserInfoMapper extends Mapper<UserInfo> { 7 }
接口自動繼承配置的通用Mapper接口,自動包含泛型實體。
3.3、Mapper.xml文件UserInfoMapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 3 <mapper namespace="com.isea533.mybatis.mapper.UserInfoMapper" > 4 <resultMap id="BaseResultMap" type="com.isea533.mybatis.model.UserInfo" > 5 <!-- 6 WARNING - @mbggenerated 7 --> 8 <id column="Id" property="id" jdbcType="INTEGER" /> 9 <result column="username" property="username" jdbcType="VARCHAR" /> 10 <result column="password" property="password" jdbcType="VARCHAR" /> 11 <result column="usertype" property="usertype" jdbcType="VARCHAR" /> 12 <result column="enabled" property="enabled" jdbcType="INTEGER" /> 13 <result column="realname" property="realname" jdbcType="VARCHAR" /> 14 <result column="qq" property="qq" jdbcType="VARCHAR" /> 15 <result column="email" property="email" jdbcType="VARCHAR" /> 16 <result column="tel" property="tel" jdbcType="VARCHAR" /> 17 </resultMap> 18 </mapper>
xml文件只包含了實體的resultMap映射配置。
