一.mybatis项目的体系结构

百度mybaits,可以进入mybatis的github:https://github.com/mybatis。

mybatis是一个大大的体系,它不是孤立的,它可以和许多其他框架或技术配合使用。

mybatis下的子项目有如下几类:

*与IOC框架之间的配合:spring和guice,guice跟spring是同类产品,但是它使用注解方式完全替代spring,比spring更轻量,来自谷歌。

*与缓存之间的配合:各种cache都有,有memcached,caffeine,ignite,oscache,hazelcast,couchbase。ignite是apache的缓存技术。

*动态sql脚本:freemarker sripting,velocity scripting,mybatis为动态sql煞费苦心,提出了很多种解决方案,它们并非总是有用,要有选择地使用。比如mybatis-core自带的sql语句构建器:sql builder,它其实就是把sql关键词写成了函数

private String selectPersonSql() {
  return new SQL() {{
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
    SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
    FROM("PERSON P");
    FROM("ACCOUNT A");
    INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
    INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
    WHERE("P.ID = A.ID");
    WHERE("P.FIRST_NAME like ?");
    OR();
    WHERE("P.LAST_NAME like ?");
    GROUP_BY("P.ID");
    HAVING("P.LAST_NAME like ?");
    OR();
    HAVING("P.FIRST_NAME like ?");
    ORDER_BY("P.ID");
    ORDER_BY("P.FULL_NAME");
  }}.toString();
}

这段代码表示的含义一看便知,很显然每一个关键词都是一个函数。

再比如mybatis-generator的example模块,它要把表中的每一个字段的各种情况都描述出来,以Criteria(标准,准则之意)为核心,比如有一个字段名为CreatedTime,它会自动生成一大堆条件,其实相当于把sql语句用java写了一遍。

        public Criteria andCreatedtimeIsNull() {
            addCriterion("createdTime is null");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeIsNotNull() {
            addCriterion("createdTime is not null");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeEqualTo(Long value) {
            addCriterion("createdTime =", value, "createdtime");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeNotEqualTo(Long value) {
            addCriterion("createdTime <>", value, "createdtime");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeGreaterThan(Long value) {
            addCriterion("createdTime >", value, "createdtime");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeGreaterThanOrEqualTo(Long value) {
            addCriterion("createdTime >=", value, "createdtime");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeLessThan(Long value) {
            addCriterion("createdTime <", value, "createdtime");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeLessThanOrEqualTo(Long value) {
            addCriterion("createdTime <=", value, "createdtime");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeIn(List<Long> values) {
            addCriterion("createdTime in", values, "createdtime");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeNotIn(List<Long> values) {
            addCriterion("createdTime not in", values, "createdtime");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeBetween(Long value1, Long value2) {
            addCriterion("createdTime between", value1, value2, "createdtime");
            return (Criteria) this;
        }

        public Criteria andCreatedtimeNotBetween(Long value1, Long value2) {
            addCriterion("createdTime not between", value1, value2, "createdtime");
            return (Criteria) this;
        }

*mybatis的具体化及其插件:typehandler-jsr,generator

进入github之后,进入release模块可以下载发行版本(不要直接下载zip包)。

二.运行mybatis-generator

官网上说有四种方式:

*控制台:java -jar mybatis-generator.jar -configfile haha.xml

*maven方式构建

*ant方式构建

*java代码方式

很显然,用java代码方式更好,因为通过eclipse可以配置好类路径,省却了在xml中配置classPathEntry属性,并且能够直接把生成到相对路径中去。用java代码控制是这样的:

   List<String> warnings = new ArrayList<String>();
   boolean overwrite = true;
   File configFile = new File("generatorConfig.xml");
   ConfigurationParser cp = new ConfigurationParser(warnings);
   Configuration config = cp.parseConfiguration(configFile);
   DefaultShellCallback callback = new DefaultShellCallback(overwrite);
   MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
   myBatisGenerator.generate(null);

这么写其实也不好,不完善,比如warning也没有输出,运行完了也没说一声等。

既然可以用控制台的方式”java -jar xx.jar 参数列表“运行,那就说明xx.jar包中含有main函数,所以可以直接调用之:

org.mybatis.generator.api.ShellRunner.main(new String[]{"-configfile", "src/generator2.xml"});

按F3可以查看源代码,可以学习一下需要哪些参数。

综上可知,运行mybatis-generator的方式最好的只有一种:通过java代码调用main函数。

三.生成了哪些东西

1.实体类po

它的变化主要集中在主键上:有三种方式conditional(默认与hierachical只有细微差别),flat(平方式,数据库中是啥就是啥),hierachical(层次方式,对主键进行了封装)。先说flat,它是最简单的那种,数据库里面的每一个字段都被映射成唯一的实体类成员变量;再说hierarchical,它比较啰嗦,把数据库中的主键封装成一个类,然后让实体类去继承这个主键类,比如user表有三个属性:userName,school,age,其中userName和school两个属性共同作为主键。

class UserKey{

String userName;

String school;

//属性的get及set方法在此略去

}

class User extends UserKey{

int age;

//age的get及set方法

}

conditional是默认的方式,它跟hierachical非常像,唯一的区别在于:如果主键中只有一个元素,那就不写成另一个类了。

2.xml文件:里面放的全是生成的mapper

3.java接口文件:里面放的全是与xml对应的java接口,其中example是可选的。

example是generator在动态sql方面的一些努力,它其实就是把每一个字段都用java判断各种条件,用java代码免去了手写sql语句。在我看来,并无卵用。那么如何禁用之呢?在context标签中添加属性target=Mybatis3Simple;在我看来,生成po类时,hirarchial也是没卵用的,因为人们实践已经证明:要用无意义的属性作为id;id只包含一个字段,不要使用复合主键。所以,如果主键只有一个字段,用默认的conditional就足够了,如果主键有多个字段,那就去修改数据库吧。

四.学习配置mybatis-generator,这一个文件就足够了

这个文件来自于”简书“上的某位大神

<?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>
  <!-- 可以用于加载配置项或者配置文件,在整个配置文件中就可以使用${propertyKey}的方式来引用配置项 resource:
          配置资源加载地址,使用resource,MBG从classpath开始找,比如com/myproject/generatorConfig.properties
    url:配置资源加载地质,使用URL的方式,比如file:///C:/myfolder/generatorConfig.properties.
          注意,两个属性只能选址一个;
          另外,如果使用了mybatis-generator-maven-plugin,那么在pom.xml中定义的properties都可以直接在generatorConfig.xml中使用 -->
  <properties resource="" url="" />

  <!-- 在MBG工作的时候,需要额外加载的依赖包 location属性指明加载jar/zip包的全路径 -->
  <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />

  <!--
    context:
                生成一组对象的环境 id:必选,
                上下文id,用于在生成错误时提示
    defaultModelType:指定生成对象的样式
      1,conditional:类似hierarchical;
      2,flat:所有内容(主键,blob)等全部生成在一个对象中;
      3,hierarchical:主键生成一个XXKey对象(key class),Blob等单独生成一个对象,其他简单属性在一个对象中(record class) 

    targetRuntime:
      1,MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample;
      2,MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample; introspectedColumnImpl:类全限定名,用于扩展MBG -->
  <context id="mysql" defaultModelType="hierarchical"
    targetRuntime="MyBatis3Simple">

    <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;
                       一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 -->
    <property name="autoDelimitKeywords" value="false" />
    <!-- 生成的Java文件的编码 -->
    <property name="javaFileEncoding" value="UTF-8" />
    <!-- 格式化java代码 -->
    <property name="javaFormatter"
      value="org.mybatis.generator.api.dom.DefaultJavaFormatter" />
    <!-- 格式化XML代码 -->
    <property name="xmlFormatter"
      value="org.mybatis.generator.api.dom.DefaultXmlFormatter" />

    <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
    <property name="beginningDelimiter" value="`" />
    <property name="endingDelimiter" value="`" />

    <!-- 必须要有的,使用这个配置链接数据库 @TODO:是否可以扩展 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver"
      connectionURL="jdbc:mysql:///pss" userId="root" password="admin">
      <!-- 这里面可以设置property属性,每一个property属性都设置到配置的Driver上 -->
    </jdbcConnection>

    <!-- java类型处理器 用于处理DB中的类型到Java中的类型,默认使用JavaTypeResolverDefaultImpl;
                        注意一点,默认会先尝试使用Integer,Long,Short等来对应DECIMAL和 NUMERIC数据类型; -->
    <javaTypeResolver
      type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
      <!-- true:使用BigDecimal对应DECIMAL和 NUMERIC数据类型
           false:默认, scale>0;length>18:使用BigDecimal;
        scale表示精度,length表示位数
        scale=0;length[10,18]:使用Long;
        scale=0;length[5,9]:使用Integer;
        scale=0;length<5:使用Short; -->
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

    <!-- java模型创建器,是必须要的元素 负责:
        1,key类(见context的defaultModelType);
        2,java类;
        3,查询类
      targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
      targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
      -->
    <javaModelGenerator targetPackage="com._520it.mybatis.domain"
      targetProject="src/main/java">
      <!-- for MyBatis3/MyBatis3Simple 自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter; -->
      <property name="constructorBased" value="false" />

      <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
      <property name="enableSubPackages" value="true" />

      <!-- for MyBatis3 / MyBatis3Simple 是否创建一个不可变的类,如果为true, 那么MBG会创建一个没有setter方法的类,取而代之的是类似constructorBased的类 -->
      <property name="immutable" value="false" />

      <!-- 设置一个根对象, 如果设置了这个根对象,那么生成的keyClass或者recordClass会继承这个类;在Table的rootClass属性中可以覆盖该选项
        注意:如果在key class或者record class中有root class相同的属性,MBG就不会重新生成这些属性了,包括: 1,属性名相同,类型相同,有相同的getter/setter方法; -->
      <property name="rootClass" value="com._520it.mybatis.domain.BaseDomain" />

      <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
      <property name="trimStrings" value="true" />
    </javaModelGenerator>

    <!-- 生成SQL map的XML文件生成器,
                     注意,在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口(或者不用mapper接口),
      或者只使用Mapper接口+Annotation,所以,如果 javaClientGenerator配置中配置了需要生成XML的话,这个元素就必须配置
      targetPackage/targetProject:同javaModelGenerator -->
    <sqlMapGenerator targetPackage="com._520it.mybatis.mapper"
      targetProject="src/main/resources">
      <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

    <!-- 对于mybatis来说,即生成Mapper接口,注意,如果没有配置该元素,那么默认不会生成Mapper接口 targetPackage/targetProject:同javaModelGenerator
      type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下):
      1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
      2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;
      3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
              注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER -->
    <javaClientGenerator targetPackage="com._520it.mybatis.mapper"
      type="ANNOTATEDMAPPER" targetProject="src/main/java">
      <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
      <property name="enableSubPackages" value="true" />

      <!-- 可以为所有生成的接口添加一个父接口,但是MBG只负责生成,不负责检查 <property name="rootInterface"
        value=""/> -->
    </javaClientGenerator>

    <!-- 选择一个table来生成相关文件,可以有一个或多个table,必须要有table元素 选择的table会生成一下文件:
     1,SQL map文件
     2,生成一个主键类;
     3,除了BLOB和主键的其他字段的类;
     4,包含BLOB的类;
     5,一个用户生成动态查询的条件类(selectByExample, deleteByExample),可选;
     6,Mapper接口(可选) tableName(必要):要生成对象的表名;
      注意:大小写敏感问题。
            正常情况下,MBG会自动的去识别数据库标识符的大小写敏感度,在一般情况下,MBG会根据设置的schema,catalog或tablename去查询数据表,
            按照下面的流程:
      1,如果schema,catalog或tablename中有空格,那么设置的是什么格式,就精确的使用指定的大小写格式去查询;
      2,否则,如果数据库的标识符使用大写的,那么MBG自动把表名变成大写再查找;
      3,否则,如果数据库的标识符使用小写的,那么MBG自动把表名变成小写再查找;
      4,否则,使用指定的大小写格式查询; 另外的,如果在创建表的时候,使用的""把数据库对象规定大小写,就算数据库标识符是使用的大写,在这种情况下也会使用给定的大小写来创建表名;
      这个时候,请设置delimitIdentifiers="true"即可保留大小写格式;
      可选: 1,schema:数据库的schema;
      2,catalog:数据库的catalog;
      3,alias:为数据表设置的别名,如果设置了alias,那么生成的所有的SELECT SQL语句中,列名会变成:alias_actualColumnName
      4,domainObjectName:生成的domain类的名字,如果不设置,直接使用表名作为domain类的名字;可以设置为somepck.domainName,那么会自动把domainName类再放到somepck包里面;
      5,enableInsert(默认true):指定是否生成insert语句; 6,enableSelectByPrimaryKey(默认true):指定是否生成按照主键查询对象的语句(就是getById或get);
      7,enableSelectByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询语句; 8,enableUpdateByPrimaryKey(默认true):指定是否生成按照主键修改对象的语句(即update);
      9,enableDeleteByPrimaryKey(默认true):指定是否生成按照主键删除对象的语句(即delete); 10,enableDeleteByExample(默认true):MyBatis3Simple为false,指定是否生成动态删除语句;
      11,enableCountByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询总条数语句(用于分页的总条数查询);
      12,enableUpdateByExample(默认true):MyBatis3Simple为false,指定是否生成动态修改语句(只修改对象中不为空的属性);
      13,modelType:参考context元素的defaultModelType,相当于覆盖; 14,delimitIdentifiers:参考tableName的解释,注意,默认的delimitIdentifiers是双引号,如果类似MYSQL这样的数据库,使用的是`(反引号,那么还需要设置context的beginningDelimiter和endingDelimiter属性)
      15,delimitAllColumns:设置是否所有生成的SQL中的列名都使用标识符引起来。默认为false,delimitIdentifiers参考context的属性
      注意,table里面很多参数都是对javaModelGenerator,context等元素的默认属性的一个复写; -->
    <table tableName="userinfo">

      <!-- 参考 javaModelGenerator 的 constructorBased属性 -->
      <property name="constructorBased" value="false" />

      <!-- 默认为false,如果设置为true,在生成的SQL中,table名字不会加上catalog或schema; -->
      <property name="ignoreQualifiersAtRuntime" value="false" />

      <!-- 参考 javaModelGenerator 的 immutable 属性 -->
      <property name="immutable" value="false" />

      <!-- 指定是否只生成domain类,如果设置为true,只生成domain类,如果还配置了sqlMapGenerator,那么在mapper
        XML文件中,只生成resultMap元素 -->
      <property name="modelOnly" value="false" />

      <!-- 参考 javaModelGenerator 的 rootClass 属性 <property name="rootClass"
        value=""/> -->

      <!-- 参考javaClientGenerator 的 rootInterface 属性 <property name="rootInterface"
        value=""/> -->

      <!-- 如果设置了runtimeCatalog,那么在生成的SQL中,使用该指定的catalog,而不是table元素上的catalog
        <property name="runtimeCatalog" value=""/> -->

      <!-- 如果设置了runtimeSchema,那么在生成的SQL中,使用该指定的schema,而不是table元素上的schema
        <property name="runtimeSchema" value=""/> -->

      <!-- 如果设置了runtimeTableName,那么在生成的SQL中,使用该指定的tablename,而不是table元素上的tablename
        <property name="runtimeTableName" value=""/> -->

      <!-- 注意,该属性只针对MyBatis3Simple有用; 如果选择的runtime是MyBatis3Simple,那么会生成一个SelectAll方法,如果指定了selectAllOrderByClause,那么会在该SQL中添加指定的这个order条件; -->
      <property name="selectAllOrderByClause" value="age desc,username asc" />

      <!-- 如果设置为true,生成的model类会直接使用column本身的名字,而不会再使用驼峰命名方法,比如BORN_DATE,生成的属性名字就是BORN_DATE,而不会是bornDate -->
      <property name="useActualColumnNames" value="false" />

      <!-- generatedKey用于生成生成主键的方法, 如果设置了该元素,MBG会在生成的<insert>元素中生成一条正确的<selectKey>元素,该元素可选
        column:主键的列名;
        sqlStatement:要生成的selectKey语句,有以下可选项:
              Cloudscape:相当于selectKey的SQL为:
                           VALUES IDENTITY_VAL_LOCAL()
              DB2 :相当于selectKey的SQL为: VALUES IDENTITY_VAL_LOCAL()
              DB2_MF :相当于selectKey的SQL为:
                     SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1
              Derby :相当于selectKey的SQL为:VALUES IDENTITY_VAL_LOCAL()
              HSQLDB :相当于selectKey的SQL为:CALL IDENTITY()
              Informix :相当于selectKey的SQL为:
                   select dbinfo('sqlca.sqlerrd1') from
                              systables where tabid=1
              MySql :相当于selectKey的SQL为:SELECT LAST_INSERT_ID()
              SqlServer :相当于selectKey的SQL为:SELECT SCOPE_IDENTITY()
              SYBASE :相当于selectKey的SQL为:SELECT  @@IDENTITY
              JDBC :相当于在生成的insert元素上添加useGeneratedKeys="true"和keyProperty属性 -->
        <generatedKey column="" sqlStatement=""/> 

      <!-- 该元素会在根据表中列名计算对象属性名之前先重命名列名,非常适合用于表中的列都有公用的前缀字符串的时候,
       比如列名为:CUST_ID,CUST_NAME,CUST_EMAIL,CUST_ADDRESS等;
        那么就可以设置searchString为"^CUST_",并使用空白替换,那么生成的Customer对象中的属性名称就不是 custId,custName等,而是先被替换为ID,NAME,EMAIL,然后变成属性:id,name,email;
        注意,MBG是使用java.util.regex.Matcher.replaceAll来替换searchString和replaceString的,
        如果使用了columnOverride元素,该属性无效; <columnRenamingRule searchString="" replaceString=""/> -->

      <!-- 用来修改表中某个列的属性,MBG会使用修改后的列来生成domain的属性; column:要重新设置的列名; 注意,一个table元素中可以有多个columnOverride元素哈~ -->
      <columnOverride column="username">
        <!-- 使用property属性来指定列要生成的属性名称 -->
        <property name="property" value="userName" />

        <!-- javaType用于指定生成的domain的属性类型,使用类型的全限定名 <property name="javaType"
          value=""/> -->

        <!-- jdbcType用于指定该列的JDBC类型 <property name="jdbcType" value=""/> -->

        <!-- typeHandler 用于指定该列使用到的TypeHandler,如果要指定,配置类型处理器的全限定名 注意,mybatis中,不会生成到mybatis-config.xml中的typeHandler
          只会生成类似:where id = #{id,jdbcType=BIGINT,typeHandler=com._520it.mybatis.MyTypeHandler}的参数描述
          <property name="jdbcType" value=""/> -->

        <!-- 参考table元素的delimitAllColumns配置,默认为false <property name="delimitedColumnName"
          value=""/> -->
      </columnOverride>

      <!-- ignoreColumn设置一个MGB忽略的列,如果设置了改列,那么在生成的domain中,生成的SQL中,都不会有该列出现
        column:指定要忽略的列的名字;
        delimitedColumnName:参考table元素的delimitAllColumns配置,默认为false
        注意,一个table元素中可以有多个ignoreColumn元素  -->
        <ignoreColumn column="deptId" delimitedColumnName=""/>
    </table>

  </context>

</generatorConfiguration>

  

五.学习经验

路有很多条,没必要全走。有些路只是人们的尝试,没必要全会。配置文件时,无需全部知道各种配置,只需要记住一种正确的配置就足够了。比如配置文件中的classPathEntry这个属性,完全没必要,因为可以在其他位置配置类库的路径。

mybatis generator使用总结的更多相关文章

  1. mybatis Generator生成代码及使用方式

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5889312.html 为什么要有mybatis mybatis 是一个 Java 的 ORM 框架,OR ...

  2. 使用MyBatis Generator自动创建代码(dao,mapping,poji)

    连接的数据库为SQL server2008,所以需要的文件为sqljdbc4.jar 使用的lib库有: 在lib库目录下新建一个src文件夹用来存放生成的文件,然后新建generatorConfig ...

  3. mybatis generator 自动生成dao层映射代码

    资源: doc url :http://www.mybatis.org/generator/ download:https://github.com/mybatis/generator/release ...

  4. mybatis generator maven插件自动生成代码

    如果你正为无聊Dao代码的编写感到苦恼,如果你正为怕一个单词拼错导致Dao操作失败而感到苦恼,那么就可以考虑一些Mybatis generator这个差价,它会帮我们自动生成代码,类似于Hiberna ...

  5. mybatis generator.xml 配置 自动生成model,dao,mapping

    generator.xml文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE gener ...

  6. Mybatis generator的使用

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...

  7. MyBatis Generator作为maven插件自动生成增删改查代码及配置文件例子

    什么是MyBatis Generator MyBatis Generator (MBG) 是一个Mybatis的代码生成器,可以自动生成一些简单的CRUD(插入,查询,更新,删除)操作代码,model ...

  8. 记一次 IDEA mybatis.generator 自定义扩展插件

    在使用 idea mybatis.generator 生成的代码,遇到 生成的代码很多重复的地方, 虽然代码是生成的,我们也不应该允许重复的代码出现,因为这些代码后期都要来手动维护. 对于生成时间戳注 ...

  9. Mybatis Generator生成工具配置文件详解

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...

  10. MyBatis Generator 详解

    MyBatis Generator中文文档 MyBatis Generator中文文档地址:http://mbg.cndocs.tk/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中 ...

随机推荐

  1. [转]VS2010中如何创建一个WCF

    本文转自:http://www.cnblogs.com/zhangliangzlee/archive/2012/08/28/2659701.html 转载:http://www.cnblogs.com ...

  2. MMORPG大型游戏设计与开发(客户端架构 part3 of vegine)

    无论在何处在什么地方,我们都或多或少的接触到数学知识.特别是在客户端中,从打开界面的那一刻起就有太多与数学扯上的关联,如打开窗口的大小,窗口的位置,窗口里面的元件对象,以及UI的坐标等等.而在进入游戏 ...

  3. 【原】常见CSS3属性对ios&android&winphone的支持

    2个月前,我在博文<webapp开发中兼容Android4.0以下版本的css hack>中写过“那对于做移动网页开发的同事来说,一般只要做好webkit内核浏览器的展现效果就行了” ,在 ...

  4. Objective-C基础数据类型-NSSet[转]

    转自GISerYang 集合: 集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址:不过NSArray是有序的集合,NSSet是无序的集合. 集合是一种哈希表,运用散列算法 ...

  5. 第30课 Qt中的文本编辑组件

    1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...

  6. 2016.11.17 NOI plus day0

    今天很乱乱乱乱 根本不想写代码 玩了一早上了 昨晚失眠了 今天又懵逼了 中午就要走了 明天就要考试了 考完试回来就要补文化课了 现在我的内心很平静 因为已经紧张的冻结了 你知道什么叫彷徨么? 机房里的 ...

  7. u3d单词学习plane

    plane n.水平: 平面: 飞机: 木工刨

  8. web端通信技术

    1.web端通信技术:长连接.长轮询.websocket; 什么是长连接.长轮询? 就是客户端不停的向服务器发送请求以获取最新的数据信息.这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它 ...

  9. 一个screen的简单配置。。

    # Start message startup_message off defencoding utf- encoding utf- utf- shell bash hardstatus always ...

  10. 【转】【MySql】Waiting for table metadata lock原因分析

    MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景.而且,一旦alter table TableA的操作停滞在Wa ...