MyBatis Generator自动生成代码

MBG介绍

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis使得数据库操作变得非常方便,使用MyBatis进行数据库操作的主要工作是书写Mapping映射文件,然而手写映射文件很容易出错,而且不够规范,因此本文使用MBG(MyBatis Generator)工具来自动生成底层模型类、DAO接口类和Mapping映射文件。

MyBatis Generator可以满足大部分常用的CRUD(Create,Retrieve,Update,Delete)数据库操作。对于复杂的操作,如join或存储过程stored procedures则需要手动编写SQL代码。

MBG将自动生成以下三部分代码

  • 与表结构匹配的java POJOs,包括:

    • 一个与表的主键相匹配的类(如果该表有主键)
    • 一个与表的非主键字段相匹配的类(除了BLOB字段)
    • 一个包含表中BLOB字段的类(如果改表含有BLOB字段)
    • 一个用于动态selects, updates 和 deletes的类(对应于example语句)
  • 与MyBatis/iBATIS兼容的SQL Map XML文件,为简单的CRUD函数生成SQL语句,生成的SQL语句包括:

    • insert
    • update by primary key
    • update by example (using a dynamic where clause)
    • delete by primary key
    • delete by example (using a dynamic where clause)
    • select by primary key
    • select by example (using a dynamic where clause)
    • count by example
  • 可以使用上述对象的java客户端类

    对于MyBaits 3.x将生成:

    • 一个mapper接口,适用于MyBatis 3.x mapper结构

    对于iBATIS 2.x将生成:

    • 适用于Spring框架的DAOs
    • 只使用iBATIS SQL映射API的DAOs
    • 适用于iBATIS DAO框架的DAOs(该框架已弃用,建议使用Spring框架)

MBG 应用

下载

下载MBG并解压:MBG官方下载地址

创建配置文件

配置文件用于告诉MBG:

  • 如何连接到数据库
  • 要生成的对象,以及如何生成
  • 用于对象生成的表

一个最小的配置文件至少包括5个元素:

  1. 元素用于指定如何连接到目标数据库
  2. 元素用于指定生成的Java model对象的存放位置(包和项目)
  3. 元素用于指定生成的SQL map文件的存放位置(包和项目)
  4. 元素用于指定生成的客户端接口和类的存放位置(包和项目),如果不希望生成Java客户端代码,则忽略该元素
  5. 至少一个数据库表元素

    一个来自官网的配置例子,用于解释配置文件的结构。

    
    
    
    <generatorConfiguration>
      <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
    
      <context id="DB2Tables" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
            connectionURL="jdbc:db2:TEST"
            userId="db2admin"
            password="db2admin">
        jdbcConnection>
    
        <javaTypeResolver >
          <property name="forceBigDecimals" value="false" />
        javaTypeResolver>
    
        <javaModelGenerator targetPackage="test.model"
                            targetProject="\MBGTestProject\src">
          <property name="enableSubPackages" value="true" />
          <property name="trimStrings" value="true" />
        javaModelGenerator>
    
        <sqlMapGenerator targetPackage="test.xml"  targetProject="\MBGTestProject\src">
          <property name="enableSubPackages" value="true" />
        sqlMapGenerator>
    
        <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"
                                              targetProject="\MBGTestProject\src">
          <property name="enableSubPackages" value="true" />
        javaClientGenerator>
    
        <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
          <property name="useActualColumnNames" value="true"/>
          <generatedKey column="ID" sqlStatement="DB2" identity="true" />
          <columnOverride column="DATE_FIELD" property="startDate" />
          <ignoreColumn column="FRED" />
          <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
        table>
    
      context>
    generatorConfiguration>

    运行MBG

    将编辑好的配置文件放到合适的路径下,在命令行中运行如下命令自动生成需要的代码:

    java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml -overwrite

    -overwrite 告诉MBG覆盖已经存在的同名Java文件,如果想保留已经存在的Java文件,就忽略该参数。
    如果忽略-overwrite参数,在有冲突时,MBG会在文件名后附加.1,例如MyClass.java.1,需要人工解决冲突。

    MBG 实战

    数据库表结构

    CREATE TABLE IF NOT EXISTS merchant_user_wechat_map (
      id                    int(10)      UNSIGNED  AUTO_INCREMENT               COMMENT 'id',
      username              varchar(255)              NOT NULL                  COMMENT '用户名',
      openid                varchar(255)              NOT NULL                  COMMENT '用户微信的openid',
      created_at            timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP     COMMENT '创建时间',
      updated_at            timestamp    NOT NULL DEFAULT 0                             COMMENT '更新时间',
      is_deleted            tinyint(1)      UNSIGNED           DEFAULT 0        COMMENT '是否删除',
      PRIMARY KEY (id),
      unique KEY username  (username),
      KEY created_at  (created_at)
    )
      ENGINE = InnoDB
      DEFAULT CHARSET  = utf8
      COLLATE = utf8_unicode_ci
      COMMENT = '用户微信与账户的映射关系';

    * is_deleted 软删除,默认为0,需要删除改记录时,将该字段置为1即可。软删除便于追踪历史记录,用软删除后需要在查找、更新等逻辑处进行该字段的判断。 *

    配置文件

    下载mysql-connector-java,用于连接到数据库,下载地址,放到<你的mysql-connector-java存放路径>,配置文件中会用到该地址。

    编写你的配置文件,如generatorConfig.xml。可以直接复制下面的配置进行使用,需要修改

    1. <你的mysql-connector-java存放路径>
    2. 数据库连接: connectionURL、userId、password
    3. 生成类存放路径:targetPackage、targetProject
    4. 你自己的元素



<generatorConfiguration>
    <classPathEntry location="<你的mysql-connector-java存放路径>/mysql-connector-java-5.1.42/mysql-connector-java-5.1.42-bin.jar"/>

    <context id="DB2Tables"    targetRuntime="MyBatis3"  defaultModelType="flat">

        <property name="autoDelimitKeywords" value="true"/>
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"/>
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        commentGenerator>

        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/store_service?zeroDateTimeBehavior=convertToNull&useSSL=false&useUnicode=true&characterEncoding=UTF-8"
                        userId="testuser"
                        password="testpw">
        jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        javaTypeResolver>

        
        <javaModelGenerator targetPackage="example.mbg.tutorial.domain"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        javaModelGenerator>

        <sqlMapGenerator targetPackage="example.mbg.tutorial.repository.mapper"
                         targetProject="src/main/resources/base">
            <property name="enableSubPackages" value="true"/>
        sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="example.mbg.tutorial.repository.mapper"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        javaClientGenerator>

        <table tableName="merchant_user_wechat_map" domainObjectName="MerchantUserWechatMap" >
            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
            <columnOverride column="id" javaType="Long"/>
            <columnOverride column="username" javaType="String"/>
            <columnOverride column="openid" javaType="String"/>
            <columnOverride column="created_at" javaType="String"/>
            <columnOverride column="updated_at" javaType="String"/>
            <columnOverride column="is_deleted" javaType="Integer"/>
        table>

    context>
generatorConfiguration>

运行MBG

java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml

生成4个文件如图所示:

MyBatis Generator自动生成代码_第1张图片

你可能感兴趣的:(Coding)