MyBatis(1)之MyBatis-Generator起步

独立的jar工程
xml标签解析
main函数配置
xml示列

一.创建Jar项目

建议创建独立的jar项目,只需要使用maven创建空骨架项目,原因:

  1. 该部分不参与任何的主业务,也引用不到主业务想关的内容;
  2. 该部分的依赖相对独立,与主项目基本没有交集;

添加依赖:

<dependency>
     <groupId>org.mybatis.generator</groupId>
     <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.0</version>
</dependency>
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.46</version>
</dependency>

二.xml配置

在resources目录下创建(xxx).xml文件,如:mybatis-generator.xml。如何生成Interface、xml、model全部在该xml文件中配置。
1.最新的DTD:

<!DOCTYPE generatorConfiguration  
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"  
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

2.标签配置以及意义

  • 2.1 <generatorConfiguration/>: 根标签,所有的配置都必须在该标签内配置;没有属性

  • 2.2. <properties/>: 主要引用外部的properties配置文件。不是必要的元素

    • resource 属性引用classpath中指定位置的properties文件,默认在当前目录下查找,也可指定相对目录(示例中是相对位置)

    • url属性引用文件系统的配置;比如:file:///C:/myfolder/generatorConfig.properties
      注意:resource与url只能指定一个

  • 2.3.<classPathEntry/>: 引用指定的jar/zip;一般将驱动加载包加载进来。不经常使用,可以不用配

    • location属性 jar/zip的全路径
  • 2.4.<context/>: 标签才是重中之重,至少有一个(比如多个数据库连接,可有多个)。

    • **id**当前context的唯一标识属性;存在多个context,如果有异常信息时,会根据该id区分
    • **defaultModelType**属性配置生成domain类的形式;有种选择:
      1.flat:一个table只生成一个domain类,所有类型的字段都包含在该类中
      2.hierarchical: 该类型会将text/blob类型的字段单独生成一个类,主键单独一个类,其余字段一个类,这些类之间保持继承关系;
      3.conditional: 默认的类型,跟**hierarchical**差不多。text/blob大字段会生成一个domain类,但是其他分离出来的字段,如果只包含一个字段,比如只有主键字段,这种模式会合并这两个类。即不会生成只有一个键的domain类。
    • **targetRuntime**属性用于配置使用MyBatis3.0或者3.4,再或者iBatis2.0版本,以及是否使用Java8Interface新特性,及是否生成xml文件,有中选择:
      1.MyBatis3:默认值,使用MyBatis3.0+,尽可能的生成动态sql以及"by exanple" 方法
      2.MyBatis3Simple:兼容Mybatis3.0+,只是生成基本的CURD方法,by example相关方法及动态sql不会生成;
      3.MyBatis3DynamicSql:向上兼容MyBatis3.4+,会使用Java8接口的新特性;但xml文件不再生成及忽略<sqlMapGenerator/>标签,并且model的类型是FLAT(defaultModelType),特殊的Text/Blob字段不再单独生成包括方法;
      4.Ibatis2Java2:
      5.Ibatis2Java5:这两种使用iBATIS2.0+,但不包括3.0,使用的较少,了解不多;
    • **introspectedColumnImpl**: 该属性指定自定义继承org.mybatis.generator.api.IntrospectedColumn实现类的全路径;(该类记录了数据库表的原始数据,后期会有专门文章介绍)
<context/>的子标签
  • 1.<property/>:与logback日志配置文件中功能类似,将配置的参数抽离集中配置,下文再通过placeholder的方式引用;无子标签

    • namevalue属性;注意大小写 (别自己挖坑😂)
  • 2. <plugin/>:配置自定义实现org.mybatis.generator.api.Plugin或者继承org.mybatis.generator.api.PluginAdapter插件类的全路径;可配置多个

    • type属性配置全路径;(比如:myBaits默认提供的插件:org.mybatis.generator.plugins.EqualsHashCodePlugin)
    • *plugin 标签中还可以配置***<property/>***标签,该标签配置的参数可以在类中获取到。在自定义plugin时,有时会根据不同开发者配置动态的内容,可使用此特性*
  • 3.<commentGenerator/>:定义xml、interface、model中是否生成原生注释(用处不大,而且看起来特乱),再结合org.mybatis.generator.internal.DefaultCommentGenerator可实现自定义注释(后期会有详细文章介绍)

    • 可包含<property>标签,配置:suppressDate:按照原生注释是否生成日期;
  • 4.<jdbcConnection/>:用户配置数据库相关信息(connectionURL,driverClass,userId,password缺一不可),这些值就可以提取到<property>标签中统一管理

  • 5.<javaModelGenerator/>:用于生成ModelQuery By Example类;(会受defaultModelType策略的影响)

    • targetPackage:存放model类的包路径,比如:com.test.mybatis.generator.model,间隔符号可以用都点;如果该路径错误或者不存在,MyBatis会创建或者将错就错,任然会在当前工程生成;
    • targetProject:当前工程所在的具体目录,比如:D:/java/project/mybatis/src/main/java,MyBatis会拼接targetPackage,形成完成的存放当前model的路径;如果配置的具体路径不存在,MyBaits不会自动创建,只会什么也不做,结果是什么也生成不出来;
    • ***Property***支持的<property>标签参数有:
      • constructorBased:是否生成构造函数,默认值false
      • enableSubPackages:是否已当前tabale为基础生成文件存放该model;默认值false;
      • trimStrings:是否自动生成trimString相应的代码;
      • rootClass:这个最有用,将表中共有的字段抽取到父类中,在生成后Model自动继承该类,并在子类中不生成响应的字段;前提是:父子类中字段类型、名称必须相同,否则会在子类重新生成;(table中可以不用配置重复的字段)
  • 6.<sqlMapGenerator/>:用于生成xml文件;个人觉得xml文件中配置sql比接口中用注解好;所以会配置该标签;

    • targetPackagetargetProject 与model配置方法一致;支持的<property>标签只有:enableSubPackages;
  • 7.<javaClientGenerator/>:用于生成Interface接口;

    • type 相比之前两个多了类型;根据<context/>的targetRuntime配置的不同都有对应不同的侧类;主要有:基于完全基于注解型(ANNOTATEDMAPPER)、完全基于xml型(XMLMAPPER)、混合型(MIXEDMAPPER);其他两个属性targetProjecttargetPackage与Model一致;
  • 8.<table/>: 过五关斩六将终于要看到胜利的曙光了,最重要也是最不能马虎的地方;table信息的转换配置;相关属性和标签如下:

    • tableName:数据库中对应的表名称
    • domainObjectName:对应model的类名,同时也是 xxxExample、interface、xml的名称;一般是表名的驼峰命名(个人最讨厌表一个名,转换过来又一个名称)
    • mapperName:指定Interface、xml文件的前缀名称,如果不配置取model作为前缀(可有可无)
    • alias:为表取别名,如果设置,会在查询语句的字段设置成alias_actualColumnName;
    • modelType:覆盖<context/>标签的属性defaultModelType
    • enablexxx:是否启用某些方法;默认为全部开启

    子标签如下:

    • **<generatedKey>**:0个或者最多1个;如果配置,会在<insert/>标签下加入<selectKey>标签(新增时返回刚新增的主键);column指定表中的主键;sqlStatement:使用的那种数据库,对应mybatis如何配置获取最新的主键;type:pre或者post,指定放置<selectKey/>的位置;
    • **<columnOverride/>**:字段对应model的属性的名称;column:表字段;property:对应属性字段;javaType:指定生成时属性的类型;jdbcType:指定数据库字段的类型;该标签还可以增加子标签trimString:是否在生成的sql语句增加空格的去除;
    • **<ignoreColumn/>**:需要忽略的字段;(这个没有用过🤣);
    • **<columnRenamingRule/>**:对应某些表的所有字段有统一开头,可以使用此字段统一切换成对应的类型;searchString:就是定义开头(比如:searchString="^test_",以test开头的);replaceString:被代替的字段,或者空字符串,或者指定的样式;

****以上标签是有顺序的,按照上面的顺序即可;否则启动会报错****
以上就是经常用到并且很重要的标签,以及属性;熟能生巧,可以多尝试配置一下,找到适合自己项目的配置;

main函数

main函数主要是从classPath中加载上面配置的XML文件;并打印一些日志;具体的代码如下:

public static void main(String[] args) {
        List<String> warnings = new ArrayList<String>();
        try {
            //重新生成时 代码是否被覆盖
            boolean overwrite = true;
            //加载MyBatis的xml配置文件
            File file = new File(StartExecute.class.getClassLoader().getResource("common/generator.xml").getFile());

            ConfigurationParser parser = new ConfigurationParser(warnings);
            Configuration configuration = parser.parseConfiguration(file);

            DefaultShellCallback defaultShellCallback = new DefaultShellCallback(overwrite);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(configuration, defaultShellCallback, warnings);
            myBatisGenerator.generate(null);

        } catch (IOException | SQLException | InterruptedException | InvalidConfigurationException | XMLParserException e) {
            LOGGER.info("出现的异常信息是{"+e.getMessage()+"}");
        }

        warnings.forEach(item ->System.out.println());
        System.out.println("生成完毕");
    }

最后附上我自己的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>
    <context id="mybatis3" targetRuntime="MyBatis3" defaultModelType="flat" introspectedColumnImpl="">
        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

        <commentGenerator type="com.rwx.mybatis.component.config.CustomerCommentGenerator">
            <property name="suppressAllComments" value="false"/>
        </commentGenerator>

        <jdbcConnection
                driverClass="${driver}"
                connectionURL="${url}"
                userId="${username}"
                password="${password}"/>

        <!--存放model的配置-->
        <javaModelGenerator targetPackage="com.test.mybatis.generator.model"
                            targetProject="E:\Project\mybatisgenertor\src\main\java">
            <property name="constructorBased" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!--存放xml的配置-->
        <sqlMapGenerator targetPackage="com.test.mybatis.generator.dao.mapper"
                         targetProject="E:\Project\mybatisgenertor\src\main\java">
            <property name="enableSubPackage" value="true"/>
        </sqlMapGenerator>

        <!--存放interface的配置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.test.mybatis.generator.dao"
                             targetProject="E:\Project\mybatisgenertor\src\main\java"/>

        <table tableName="test" domainObjectName="Test">
        <generatedKey column="id" sqlStatement="SELECT(REPLACE(UUID(),'-',''))" type="pre"/>
        <columnOverride column="id" property="id"/>
        <columnOverride column="contract_code" property="contractCode"/>
        <columnOverride column="money" property="money"/>
        <columnOverride column="payment_type" property="paymentType" javaType="Integer"/>
        <columnOverride column="total_periods" property="totalPeriods"/>
        <columnOverride column="delete_flag" property="deleteFlag" javaType="Integer"/>
        </table>
    </context>
</generatorConfiguration>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • MyBatis Generator (MBG) 是由一个XML配置文件驱动的。这个配置文件中会声明以下内容: 如何...
    JSON_NULL阅读 18,711评论 3 10
  • MyBatis通用Mapper3介绍 通用Mapper都可以极大的方便开发人员。可以随意的按照自己的需要选择通用方...
    郭少华阅读 2,236评论 0 3
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,520评论 0 4
  • MyBatis 理论篇 [TOC] 什么是MyBatis  MyBatis是支持普通SQL查询,存储过程和高级映射...
    有_味阅读 2,899评论 0 26
  • 文字太轻,回忆太重。千言万语终究无法表达我内心深处的触动。 中考过后,我们去了不同的学校,你去了市中心的一所普通高...
    奔跑吧傻妞阅读 274评论 0 1