在某些情况下可能需要扩展自动生成的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类中新增方法。
如果您经常扩展自动生成类,写一个插件来实现该功能比手工编写扩展类代码更方便。下面(标题"单条件参数")的插件类能够完成单参数查询 org.mybatis.generator.plugins.CaseInsensitiveLikePlugin。
MBG自动生成SQL在运行允许创建无限制where条件。为了完成这个,自动生成SQL支持四大类型条件语句。对应每种类型的SQL语句,GeneratedCriteria 内部有一个对应的方法用于添加一个动态的where条件。
在使用这种类型的条件查询时不需要参数对象替换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注入问题。如果可能,我们建议使用下面列出的方法之一。
使用这种类型作为条件语句,一个参数替换where条件。例如
FIRST_NAME = ?
LAST_NAME <> ?
自动生成Criteria类条件方法如下:
addCriterion(String anyString,Object anyObject,String propertyName)
Where:
该方法用于单一参数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);
列表条件适用于where条件中多个值的情况。例如:
FIRST_NAME IN (?,?,?)
LAST_NAME NOT IN (?,?,?,?)
由于包含了"in" and "not in"这样的标准查询条件,因此使用起来不太灵活。然而在Criteria类中您会发现有相应的方法,如下:
addCriterion(String anyString,List listOfObjects,String propertyName)
Where:
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: