使用mybatis的逆向功能及创建配置文件

逆向工程定义

使用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&amp;characterEncoding=utf-8&amp;useSSL=true&amp;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)。

beginningDelimiterendingDelimiter 开始和结束分隔符,对于有关键字的情况下适用。

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映射配置。

最后给出使用逆向工程生成的最终的项目结构
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值