MyBatis Generator 自动生成的POJO对象的使用(一)
MyBatis Generator 会自动生成以下几种类型的对象(除非你使用MyBatis3DynamicSql 的运行环境):
- Java Model Objects(总是生成)
- SQL Map Files(always for iBATIS, usually for MyBatis)
- Java Client Object(可选项)
- 还会生成一个会在xxxByExample方法中使用到的类。可以参考一下的页面关于该类的信息:
而在MyBatis3DynamicSql运行环境下生成的对象依赖于MyBatis Dynamic Sql 库。这些对象比其他runtimes生成的对象更强大,但它们依赖于MyBatis Dynamic SQL库。
- Java Model Objects
- 一个依赖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有关,忽略。