逆向工程定义
使用mybatis时需要根据数据表创建pojo类,pojo类的映射文件以及sql语句和Dao层,而这些部分没有什么技术含量,myBatis官方提供了逆向功能,可以根据数据表自动生成pojo,映射文件以及dao层。
我们通常将Dao层称为mapper.java,将映射文件称为mapper.xml,将会实体类称为pojo。
通用 Mapper 专用代码生成器生成的 Model 会在原有基础上增加 @Table,@Id,@Column 等注解,方便自动会数据库字段进行映射。
首先对MBG不太了解的可以先阅读下面的文档
Mybatis Geneator 详解
http://blog.csdn.net/isea533/article/details/42102297
引入逆向工程依赖和插件
(只给出有关逆向工程的,其他的省略)
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<!-- 通用 Mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
<!-- 如果你只需要用到通用 Mapper 中的插件,可以只引入 mapper-generator -->
<!-- 注意,这个包不需要和上面的 mapper 同时引入,mapper 中包含 generator -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-generator</artifactId>
<version>1.1.5</version>
</dependency>
逆向工程配置文件
<!--最新的DTD-->
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!--suppress MybatisGenerateCustomPluginInspection -->
<!--<generatorConfiguration/>: 根标签,所有的配置都必须在该标签内配置;没有属性-->
<generatorConfiguration>
<!--<context/>: 标签才是重中之重,至少有一个(比如多个数据库连接,可有多个)。-->
<!--**id**当前context的唯一标识属性;存在多个context,如果有异常信息时,会根据该id区分-->
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="javaFileEncoding" value="UTF-8"/>
<property name="useMapperCommentGenerator" value="false"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<!--<property name="mappers" value="com.bosssoft.bes.basedata.dao.NewMapper"/>-->
<!--最关键的参数就是 mappers,配置后生成的 Mapper 接口都会自动继承该接口,这里使用通用mapper,也可以使用自定义的mapper(特别注意,该自定义的接口不能被扫描到,否则会出错)-->
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<property name="caseSensitive" value="true"/>
<property name="forceAnnotation" value="true"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
</plugin>
<!--禁用注释-->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<!--连接数据库,驱动类,连接地址,用户名,密码-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/db_basedata_center?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC"
userId="root"
password="lishixiong123">
</jdbcConnection>
<!--MyBatis 生成器只需要生成 Model-->
<!--生成entity类-->
<javaModelGenerator targetPackage="com.bosssoft.bes.basedata.pojo.entity"
targetProject="src/main/java">
</javaModelGenerator>
<!--xml映射文件-->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources"/>
<!--mapper接口-->
<javaClientGenerator targetPackage="com.bosssoft.bes.basedata.dao"
targetProject="src/main/java"
type="XMLMAPPER"/>
<!--table配置,指定数据库中表生成对应的实体类-->
<table tableName="t_category" domainObjectName="Category">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="t_comb_exam_config" domainObjectName="CombExamConfig">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="t_comb_exam_config_item" domainObjectName="CombExamConfigItem">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="t_dictionary" domainObjectName="Dictionary">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="t_subject" domainObjectName="Subject">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="t_subject_answer" domainObjectName="SubjectAnswer">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="t_subject_type" domainObjectName="SubjectType">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>
从上面的配置文件中可以看出,配置文件主要做的几件事是:
1.连接数据库,这是必须的,要不然怎么根据数据库的表生成代码呢?
2.指定要生成代码的位置(),要生成的代码包括pojo类,mapper.xml和mapper.java
3.指定数据库中想要生成哪些表
参数的含义:
caseSensitive 是否区分大小写,默认值 false。如果数据库区分大小写,这里就需要配置为 true,这样当表名为 USER 时,会生成 @Table(name = “USER”) 注解,否则使用小写 user 时会找不到表。
forceAnnotation 是否强制生成注解,默认 false,如果设置为 true,不管数据库名和字段名是否一致,都会生成注解(包含 @Table 和 @Column)。
beginningDelimiter 和 endingDelimiter 开始和结束分隔符,对于有关键字的情况下适用。
useMapperCommentGenerator 是否使用通用 Mapper 提供的注释工具,默认 true 使用,这样在生成代码时会包含字段的注释(目前只有 mysql 和 oracle 支持),设置 false 后会用默认的,或者你可以配置自己的注释插件。
在上面<table 的配置中是针对 MySql 这种自增数据库的,如果使用 ORACLE 序列方式,可以参考下面的配置:
<table tableName="country">
<generatedKey column="id"
sqlStatement="select SEQ_{1}.nextval from dual"
identity="false"
type="pre"/>
</table>
SQL 中的 {1} 代表的是对应表的大写形式,{0} 是小写形式,这个配置生成的代码会像下面这样:
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY,
generator = "select SEQ_COUNTRY.nextval from dual")
private Integer id;
// 省略其他
}
运行MBG(两种方式)
使用Java编码方式运行MBG
Java代码
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config =
cp.parseConfiguration(getResourceAsStream("generator-config.xml"));
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
for (String warning : warnings) {
System.out.println(warning);
}
}
使用 Maven 执行MBG
Maven 中的插件配置如下:
<build>
<plugins>
<plugin>
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-maven-plugin -->
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<configurationFile>
${basedir}/src/main/resources/generator-config.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
在插件中配置了配置文件的路径,覆盖和输出详细日志三个参数。
除此之外需要特别注意的是 ,MBG 配置中用到的所有外部代码都必须通过依赖方式配置在这里,否则运行时会提示找不到对应的类而报错。这里有两个必须的依赖,一个是 JDBC 驱动,另一个是 Mapper 的插件。
我这里的配置文件和之前一样,若想引用外部文件
可以通过 引入了外部属性文件,
<properties resource="XXX.properties"/>
在 配置时,也使用的属性文件中的参数。
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.user}"
password="${jdbc.password}">
</jdbcConnection>
运行:在 pom.xml 这一级目录的命令行窗口执行 mvn mybatis-generator:generate即可(前提是配置了mvn)
逆向工程生成的代码
实体类
@Table(name = "t_category")
public class Category implements Serializable {
/**
* 题目类别 ID
*/
@Id
@Column(name = "id")
private Long id;
省略其他
可以看到这里生成的注释是有意义的内容,注释来源于数据库表字段的注释。
Mapper接口
public interface CategoryMapper extends Mapper<Category> {
}
接口自动继承配置的通用Mapper接口,自动包含泛型实体。
Mapper.xml
<?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.bosssoft.bes.basedata.dao.CategoryMapper">
<resultMap id="BaseResultMap" type="com.bosssoft.bes.basedata.pojo.entity.Category">
<!--
WARNING - @mbg.generated
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="name" jdbcType="CHAR" property="name" />
<result column="parent_id" jdbcType="BIGINT" property="parentId" />
<result column="status" jdbcType="TINYINT" property="status" />
<result column="org_id" jdbcType="BIGINT" property="orgId" />
<result column="created_by" jdbcType="BIGINT" property="createdBy" />
<result column="created_time" jdbcType="TIMESTAMP" property="createdTime" />
<result column="updated_by" jdbcType="BIGINT" property="updatedBy" />
<result column="updated_time" jdbcType="TIMESTAMP" property="updatedTime" />
<result column="version" jdbcType="BIGINT" property="version" />
</resultMap>
</mapper>
xml文件只包含了实体的resultMap映射配置。
最后给出使用逆向工程生成的最终的项目结构