MyBatis Generator 自动生成的POJO对象的使用(一)

  MyBatis Generator 会自动生成以下几种类型的对象(除非你使用MyBatis3DynamicSql 的运行环境):

  1. Java Model Objects(总是生成)
  2. SQL Map Files(always for iBATIS, usually for MyBatis)
  3. Java Client Object(可选项)
  4. 还会生成一个会在xxxByExample方法中使用到的类。可以参考一下的页面关于该类的信息:

  而在MyBatis3DynamicSql运行环境下生成的对象依赖于MyBatis Dynamic Sql 库。这些对象比其他runtimes生成的对象更强大,但它们依赖于MyBatis Dynamic SQL库。

  1. Java Model Objects
  2. 一个依赖MyBatis Dynamic SQL library的mapper接口和一个“support”类。可以参考MyBatis Dynamic SQL Usage Notes页面

 

  这里我们只讨论前面的几种生成对象。

一、Java Model Classes

  MyBatis Generator(MBG)生成与数据库表中的字段对应的Java类。生成的类是一种领域对象(Domain Object),但绝不应与富领域模型(rich Domain Object)混淆。MBG根据数据库中表和配置选项的特征生成不同类型的“域”对象。

  MBG生成的每个属性和方法都非标准JavaDoc标记——@mbg.generated。当从Eclipse插件运行时,在MBG的后续运行中,将删除并替换包含此JavaDoc标记的每个Java元素。而这些类中的其它Java元素则不会被MBG触碰到。记住这点,你就可以随心所欲添加自己需要的属性和方法,而不用担心在 MBG后续的运行中丢失他们——当然,别对这些元素加@mbg.generated标记就行了。

  在Eclipse插件之外,需要手动合并Java文件,但利用@mbg.generated标记,就可以清楚地知道哪些元素可以安全地删除。

  接下来的部分描述不MBG所产生的同类型的Domain类。MBG依赖<context>配置元素的defaultModelType属性值和<table>配置元素的modelType属性值来生成不同类型的Domain Object。

  

  1.1 Primary Key Class

  此类将包含表的主键中每个字段的属性。属性名称将自动生成,并将基于表中的列名称。可以使用<columnOverride>配置元素覆盖生成的属性名称。

  默认情况下,类的名称为“TableNameKey”,如果在<table>配置元素上指定了domainObjectName属性,则为“domainObjectNameKey”。

  如果表具有一个主键,则将在分层模型(the hierarchical model)中生成此类。 如果表的主键中有多个列,则将在条件模型(the conditional model)中生成此类。 此类不会在平面模型(the flat model)中生成。

 

  1.2 Record Class

  此类将包含表中每个非BLOB和非主键列的属性。

  如果存在有上述主键类,该类将继承主键类。属性名称将自动生成,并将基于表中的列名称。可以使用<columnOverride>配置元素覆盖生成的属性名称。

  默认情况下,类的名称为“TableName”,如果在<table>配置元素上指定了domainObjectName属性,则为“domainObjectName”。

  如果表具有非BLOB和非主键列,则将在分层模型中生成此类。

  如果表具有非BLOB和非主键列,或者只有一个主键列或一个BLOB列,则将在条件模型中生成此类。

  此类始终在平面模型中生成。

 

  1.3 Record Class With BLOBSs Class

  此类将包含表中每个BLOB列的属性。

  该类将继承Record Class(如果有),或者它将扩展主键类(请注意,MBG不支持生成仅包含BLOB列的表)。

  属性名称将自动生成,并将基于表中的列名称。 可以使用<columnOverride>配置元素覆盖生成的属性名称。

  此类将是selectByPrimaryKey方法或selectByExampleWithBLOBs方法的返回值。

  该类的名称将默认为“TableNameWithBLOBs”,如果在<table>配置元素上指定了domainObjectName属性,则为“domainObjectNameWithBLOBs“。

  如果表具有任何BLOB列,则将在分层模型中生成此类。 如果表具有多个BLOB列,则将在条件模型中生成此类。 此类不会在平面模型中生成。

 

  1.4 Example Class

  该类用于与MBG的动态选择功能一起使用。

  该类包含一组标准(criteria ),用于在运行时为以下方法生成动态WHERE子句:

  • selectByExample
  • selectByExampleWithBLOBs
  • deleteByExample
  • countByExample
  • updateByExample

  此类不扩展(继承)任何其他模型类。

  类的名称默认将是«TableNameExample»,或«domainObjectNameExample»,如果在<table>配置元素上指定了domainObjectName属性的话。

  如果任何“*ByExample”方法可以能够使用的话,该类就会被生成。

  请注意,如果表中有许多字段,则此类可能会变得非常大,但DAO方法很小,生成的XML片段也很小。

  如果您不打算使用动态WHERE子句功能,则可能希望禁用这些方法的生成。

  有关使用示例类的详细信息,请参考: Example Class Usage

 

二、SQL Map Files

  MyBatis Generator(MBG)生成符合MyBatis或iBATIS SQL Map DTD的SQL Map文件。这些文件包含许多不同的元素,这些元素基于表的特征以及您指定的配置选项。

  MBG为您指定的每个表生成不同的SQL Map文件。 SQL Map的name space是表的名称(由schema和目录限定,如果存在),实际的namespace是Mapper类。

  MBG不会将SQL Map条目添加到MyBatis / iBATIS配置文件中 - 您必须手动执行此操作(或者如果您愿意,可以使用插件使MBG生成框架配置文件)。

  每个生成的XML元素都包含一个XML注释部分,其中包含字符串@ mbg.generated。在后续运行中,将删除并替换包含带有字符串@mbg.generated的注释的每个元素。XML文件中的任何其他元素都将保持不变。考虑到这一点,您可以将其他元素添加到文件中,而不必担心在后续运行中丢失它们 - 只需在任何元素注释中不包含字符串@ mbg.generated。

  以下部分描述了将生成的元素。 注意:在以下描述中,术语“BLOB”用于指代数据类型为BLOB,CLOB,LONGVARCHAR或LONGVARBINARY的任何列。

   (其中定义了14个通用的CRUD方法)

  2.1、Result Map

  此元素用于将数据表的列映射到生成的Java模型对象中的属性。

  Result Map(和相应的select语句)将不包含:

  • <ignoreColumn>配置元素忽略的任何字段;
  • 表中的任何BLOB字段(参见带有BLOBs元素的结果映射)

  如果特定列存在,则将根据配置元素<columnOverride>映射表中的列。如果override不存在,则将使用默认属性名称和JDBC类型。

  如果在SQL映射中编写任何自定义连接(join)查询,则可以扩展此结果映射。这是一个常见的用例,并且是预期的。您计划将此结果映射与其他连接查询一起使用,您可能希望让MBG为结果映射中的字段生成前缀。有关生成前缀的信息,请参阅<table>参考页面。

  如果启用了select by example, or select by primary key 语句,则将生成此元素。

 

  2,2、Result Map With BLOBs

  该元素扩展了基本的Result Map,并添加了表中存在的任何BLOB字段。

  我们这样做是因为我们提供了不同版本的select by example语句,具体取决于您是否要在这些查询中返回BLOB字段。

  Result Map(和相应的select语句)将不包含:<ignoreColumn>配置元素忽略的任何字段。

  如果特定列存在,则将根据其配置元素<columnOverride>映射列。如果override不存在,则将使用默认属性名称和JDBC类型。

  

  如果在SQL映射中编写任何自定义连接(join)查询,则可以扩展此结果映射。这是一个常见的用例,并且是预期的。您计划将此结果映射与其他连接查询一起使用,您可能希望让MBG为结果映射中的字段生成前缀。有关生成前缀的信息,请参阅<table>参考页面。

  如果该表包含BLOB字段并且启用了select by example, or select by primary key 语句,则将生成此元素

 

  2.3、SQL Where Clause

  此元素包含“by example”方法使用的可重用where子句。

  如果表中存在任何BLOB字段,则where子句将不包括任何BLOB字段。大多数数据库不支持WHERE子句中的BLOB字段。

 

  2.4、Select By Primary Key

  此元素包含一个select语句,该语句将返回一行 - 由主键指定。 返回的行将包含BLOB字段(如果它们存在于表中)。

  如果表具有主键并且启用了select by primary key语句,则将生成此元素。

 

  2.5、Select By Example

  此元素包含一个select语句,其中的行与示例对象匹配。 这实现了一个简单的“按示例查询”功能,可用于生成许多不同的数据库查询。

  返回的行将不包含表中存在的任何BLOB字段(请参阅下面的BLOBs语句选择示例)。

  要点:如果示例类为null,或者未设置任何条件(criteria ),则将选择表中的所有行。

  如果启用了select by example语句,则将生成此元素。

 

  2.6、Select By Example With BLOBs

  此元素包含一个select语句,其中的行与示例对象匹配。 这实现了一个简单的“按示例查询”功能,可用于生成许多不同的数据库查询。 返回的行将包括表中存在的任何BLOB字段。

  要点:如果示例类为null,或者未设置任何条件,则将选择表中的所有行。

  如果表包含BLOB字段,则将生成此元素,并启用select by example语句。

  

  2.7、Insert

  此元素是一个insert语句,包含表中的所有字段(包括BLOB),除非使用<ignoreColumn>配置元素专门忽略该字段。

  如果表具有自动生成的key(标识列或序列中的值),并且指定了<generatedKey>配置元素,则MBG将生成相应的<selectKey>元素。

  重要说明:插入方法在iBATIS2和MyBatis3中的工作方式不同。下表总结了差异:

Runtime Behavior
iBatis2 如果指定了<generatedKey>元素,则该方法将返回新生成的键。如果未指定<generatedKey>元素,则该方法将为void。
MyBatis3 该方法将返回插入的行数(通常为0或1)。如果指定了<generatedKey>元素,则新生成的键的值将在参数对象的相应属性中设置。

  如果启用了insert语句,则将生成此元素。  

 

  2.8、Insert Selective

  此元素是一个insert语句,包含表中的所有字段(包括BLOB),除非使用<ignoreColumn>配置元素专门忽略该字段。 但是,此语句不包括参数对象中为null的字段。 这允许您使用列的数据库默认值(如果存在)。

  此元素不允许将null插入任何字段 - 因为您必须使用常规insert语句。

  重要说明:任何映射到Java原始类型的字段都会是同该方法进行插入。

  如果表具有自动生成的key(标识列或序列中的值),并且指定了<generatedKey>配置元素,则MBG将生成相应的<selectKey>元素。

  重要说明:插入方法在iBATIS2和MyBatis3中的工作方式不同。差异和上表相同:

 

  2.9 、Update By Primary Key

  此元素是一个更新语句,它将更新一行 - 由主键指定。

  update语句将更新表中的所有字段,除非:

  • <ignoreColumn>配置元素已忽略该字段
  • 该字段是一个BLOB字段(请参阅主键更新BLOBs元素)

  如果表具有主键,并且启用主键更新语句,则将生成此元素。

 

  2.10、Update By Primary Key With BLOBs

  此元素是一个更新语句,它将更新一行 - 由主键指定。 update语句将更新表中的所有字段(包括BLOB字段),除非:<ignoreColumn>配置元素已忽略该字段

  如果表具有主键,该表具有BLOB列,并且启用了主键更新语句,则将生成此元素。

 

  2.11、Update By Primary Key Selective

  此元素是一个更新语句,它将更新一行 - 由主键指定。

  update语句将仅更新表中的参数对象的属性为非null的字段。

  语句可用于更新record中的某些列,而不会影响record中的所有列。 重要说明:如果列已映射到基本类型,则该列将始终更新。 

  如果表具有主键,则将生成此元素,并且启用主键更新语句。

 

  2.12、Delete By Primary Key

  该元素是一个删除语句,它将删除表中的一行 - 由主键指定。

  如果表具有主键,则将生成此元素,并且启用“按主键删除”语句。

 

  2.13、Delete By Example

  此元素是一个删除语句,它将删除表中的一行或多行 - 由示例对象指定。

  要点:如果示例类为null,或者未设置任何条件,则表中的所有行都将被删除。

  如果启用了“按示例删除”语句,则将生成此元素。

 

  2.14、Count By Example

  此元素是一个select count(*)语句,它将返回表中与指定示例对象匹配的行数。

  要点:如果示例类为null,或者未设置任何条件,则select将返回整个表中的行数。  

  如果启用了count by example语句,则将生成此元素。

 

  2.15、Update By Example

  此元素是一个更新语句,它将更新表中与指定示例匹配的所有行。

  update语句将更新表中的所有字段,除非:

  • <ignoreColumn>配置元素已忽略该字段
  • 该字段是一个BLOB字段(请参阅BLOBs元素的示例更新)

  要点:如果示例类为null,或者未设置任何条件,则表中的所有行都将更新。

  如果启用了通过example语句更新,则将生成此元素。

 

  2.16、Update By Example With BLOBs

  此元素是一个更新语句,它将更新表中与指定示例匹配的所有行。

  update语句将更新表中的所有字段(包括BLOB字段),除非:<ignoreColumn>配置元素已忽略该字段

  要点:如果示例类为null,或者未设置任何条件,则表中的所有行都将更新。

  如果表包含BLOB列,并且启用了“按示例更新”语句,则将生成此元素。

 

  2.17、Update By Example Selective

  此元素是一个更新语句,它将更新表中与指定示例匹配的所有行。

  update语句将仅更新表中的参数对象的属性为非null的字段。

  此语句可用于更新某些记录中的某些列,而不会影响记录中的所有列。重要说明:如果列已映射到基本类型,则该列将始终更新。

  要点:如果示例类为null,或者未设置任何条件,则表中的所有行都将更新。

  如果启用了通过example语句更新,则将生成此元素。

 

  三、Java Client Objects

  MyBatis Generator(MBG)生成多种类型的Java客户端对象。

  Java客户端对象用于更容易地与生成的XML元素进行交互。 对于配置中的每个表,MBG会生成一个或多个Java客户端对象。

  对于MyBatis 3,这些是映射器接口(Mapper接口)。 对于iBATIS 2.x,这些是DAO接口和实现类。

  生成Java客户端对象是可选的,由<javaClientGenerator>配置元素控制。 MBGr可以生成以下类型的客户端:

  For MyBatis 3.x:

  • XMLMAPPER - for use with the MyBatis 3.x mapper support

  For iBATIS 2.x:

  • IBATIS - for use with the iBATIS DAO Framework
  • SPRING - for use with the Spring Framework
  • GENERIC-CI - with no dependencies beyond the iBATIS Data Mapper
  • GENERIC-SI - also with no dependencies beyond the iBATIS Data Mapper

  生成的每个字段和方法都包含非标准JavaDoc标记@ mbg.generated。 从Eclipse插件运行时,在后续运行中,将删除并替换包含此JavaDoc标记的每个字段和方法。 该类中的任何其他字段或方法都不会受到影响。

  考虑到这一点,您可以向类中添加其他字段和方法,而不必担心在后续运行中丢失它们 - 只需在您添加到类中的任何内容上不要包含@ mbg.generated JavaDoc标记。

  在Eclipse插件之外,需要手动合并Java文件,但是您可以使用@mbg.generated JavaDoc标记来了解从文件的先前版本中删除的安全性。

  Note: in the following descriptions, the term "BLOB" is used to refer to any column with a data type of BLOB, CLOB, LONGVARCHAR, or LONGVARBINARY.

 

  3.1、Methods Common to All DAO Types

  根据表的具体情况和配置选项,Java客户端生成器将生成以下方法:

  • countByExample
  • deleteByPrimaryKey
  • deleteByExample
  • insert
  • insertSelective
  • selectByPrimaryKey
  • selectByExample
  • selectByExampleWithBLOBs
  • updateByPrimaryKey (with an override to specify whether or not to update BLOB columns)
  • updateByPrimaryKeySelective (will only update non-null fields in the parameter class)
  • updateByExample (with an override to specify whether or not to update BLOB columns)
  • updateByExampleSelective (will only update non-null fields in the parameter class)

  MBG尝试通过生成不同的对象和方法来更轻松地处理包含BLOB的表,以便您可以使用BLOB字段,或根据情况忽略它们。

  有关使用selectByExample方法的示例,请参阅Example Class Usage页面。

 

  3.2、XMLMAPPER Clients (MyBatis 3.x) 

  XMLMAPPER客户端是将映射到生成的XML映射器文件中的方法的接口。

    例如,假设MBG生成了一个名为MyTableMapper的接口。 您可以按如下方式使用接口:

  SqlSession sqlSession = sqlSessionFactory.openSession();

  try {
    MyTableMapper mapper = sqlSession.getMapper(MyTableMapper.class);
    List<MyTable> allRecords = mapper.selectByExample(null);
  } finally {
    sqlSession.close();
  }

  有关如何创建sqlSessionFactory实例的详细信息,请参阅标准MyBatis文档。

 

  其余的几个小节都和ibatis有关,忽略。

 

posted @ 2019-06-26 03:40  爆炸的果核  阅读(4366)  评论(1编辑  收藏  举报