扩展Example类

在某些情况下可能需要扩展自动生成的example。您可能希望添加特定数据库查询条件(如Oracle ROWNUM支持),或添加除自动生成外的查询条件(如不区分大小写查询)。在这种情况下,您需要扩展自动生成example类来添加这些额外的查询条件。

一般原则

MyBatis Generator (MBG)一般情况下一个表名对应一个自动生成"example"类,除非您特殊配置。"example"类动态生成where条件被用于xxxByExample方法。

标准的"example"类包含只是标准SQL条件查询功能。在这种情况下,程序特定需要您添加额外条件查询功能。这可能需要添加非标准条件查询或在where条件中使用数据库特定功能。

自动生成"example"类中包含一个内部类实现where条件查询功能。内部类命名为GeneratedCriteria。 MBG同时也生成了内部类Criteria继承了GeneratedCriteria,您可以使用它在example类中添加您想要的功能。Eclipse插件不会删除Criteria类新增代码(注:只有Eclipse插件,并且有注释和时间戳等要求才能自动合并),因此您无需担心新增代码丢失。

例如,有一个表叫CUSTOMER。通常,MBG生成一个名为 CustomerExample的类。在CustomerExample类中添加额外功能,需要在CustomerExample.Criteria类中新增方法。

扩展vs插件

如果您经常扩展自动生成类,写一个插件来实现该功能比手工编写扩展类代码更方便。下面(标题"单条件参数")的插件类能够完成单参数查询 org.mybatis.generator.plugins.CaseInsensitiveLikePlugin

添加条件语句

MBG自动生成SQL在运行允许创建无限制where条件。为了完成这个,自动生成SQL支持四大类型条件语句。对应每种类型的SQL语句,GeneratedCriteria 内部有一个对应的方法用于添加一个动态的where条件。

1. 简单字符串替换

在使用这种类型的条件查询时不需要参数对象替换where条件中。例如:

FIRST_NAME is null LAST_NAME is not null

此条件语句GeneratedCriteria类方法是:

addCriterion(String anyString)

其中"anyString"是字符串替换where子句。该方法适合任何类型。

例如,您想使用SOUNDEX函数完成"类似"搜索功能。在MySQL中,条件语句应该是:

SOUNDEX(FIRST_NAME) = SOUNDEX('frod')

此种查询太复杂,可以考虑使用另外一个方法,这种简单字符串替换必须插入到where条件中。在内部类Criteria中添加如下方法:

public Criteria andFirstNameSoundsLike(String value) {
  StringBuffer sb = new StringBuffer("SOUNDEX(FIRST_NAME) = SOUNDEX('");
  sb.append(value);
  sb.append("')");

  addCriterion(sb.toString());

  return this;
}

下面代码是在selectByExample方法中使用了刚才新增的方法:

CustomerExample example = new CustomerExample();
Criteria criteria = example.createCriteria();
criteria.andFirstNameSoundsLike("frod");
List results = selectByExample(example);

这种方法可以添加任何条件语句到where子句中。然而,由于需要保证不同数据类型的正确(最明显的日期、时间和时间戳),所以最好使用参数替换。同时, 这样操作暴露过多的方法会导致SQL注入问题。如果可能,我们建议使用下面列出的方法之一。

2. 单条件参数

使用这种类型作为条件语句,一个参数替换where条件。例如

FIRST_NAME = ? LAST_NAME <> ?

自动生成Criteria类条件方法如下:

addCriterion(String anyString,Object anyObject,String propertyName)

Where:

anyString

替换where条件参数子句,如:upper(FIRST_NAME) like

anyObject

条件值

propertyName

条件列名,用于排除潜在错误。

该方法用于单一参数where条件。

例如,假设您想特定列不区分大小写查询,在MySQL中查询条件如下:

upper(FIRST_NAME) like ?

此方法适合单个参数功能-一个参数一个参数值。将下面方法添加到ExtendedCriteria中:

public ExtendedCriteria andFirstNameLikeInsensitive(String value) {
  addCriterion("upper(FIRST_NAME) like",
    value.toUpperCase(),"firstName");

  return this;
}

下面代码是在selectByExample方法中使用了刚才新增的功能:

ExtendedExample example = new ExtendedExample();
ExtendedCriteria criteria = (ExtendedCriteria) example.createCriteria();
criteria.andFirstNameLikeInsensitive("fred%");
List results = selectByExample(example);

3. 列表条件

列表条件适用于where条件中多个值的情况。例如:

FIRST_NAME IN (?,?,?) LAST_NAME NOT IN (?,?,?,?)

由于包含了"in" and "not in"这样的标准查询条件,因此使用起来不太灵活。然而在Criteria类中您会发现有相应的方法,如下:

addCriterion(String anyString,List listOfObjects,String propertyName)

Where:

anyString

替换where条件参数,如:FIRST_NAME IN

listOfObjects

list对象值替换条件值(在list前有一个开始的括号,一个结束括号在list后)。

propertyName

条件列名,用户排除潜在错误。

4. Between条件

Between条件参数适用于where条件特定的格式。例如:

FIRST_NAME BETWEEN ? AND ? LAST_NAME NOT BETWEEN ? AND ?

由于包含了"between" and "not between"这样的标准查询条件,因此使用起来不太灵活。然而在Criteria类中您会发现有相应的方法,如下:

addCriterion(String anyString,Object object1,Object object2,String propertyName)

Where:

anyString

替换where条件参数,如:FIRST_NAME BETWEEN

object1

替换where条件第一个参数值(object1后会自带一个"and"连接词)。

object2

替换where条件第二个参数值(object2前会自带一个"and"连接词)。

propertyName

条件列名,用户排除潜在错误。

results matching ""

    No results matching ""