ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 扩展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** 条件列名,用户排除潜在错误。