bboyjing's blog

MybatisGenerator插件开发五【更新指定条数】

在实际项目中,遇到了这样一个需求,就是只需要更新匹配到的第一条或者前几条数据。不想手动写相关mapper,于是就想着通过插件来实现。想了一下,得益于之前在Example中添加的limit成员变量,只要稍微修改下updateByExampleSelective的SqlMapper实现就可以了。

修改SqlMap文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class UpdateLimitPlugin extends PluginAdapter {
@Override
public boolean validate(List<String> list) {
return true;
}
@Override
public boolean sqlMapUpdateByExampleSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
XmlElement ifParamElement = new XmlElement("if");
ifParamElement.addAttribute(new Attribute("test", "_parameter != null"));
XmlElement ifLimitNotNullElement = new XmlElement("if");
ifLimitNotNullElement.addAttribute(new Attribute("test", "example.limit != null"));
ifLimitNotNullElement.addElement(new TextElement("limit ${example.limit}"));
ifParamElement.addElement(ifLimitNotNullElement);
element.addElement(ifParamElement);
return true;
}
}

逻辑很简单,只需要将limit语句插入到updateByExampleSelective标签下就行了。

查看生成文件

将插件添加到项目中,并且运行完MybatisGenerator,我们来查看下生成的相关文件:

1
2
3
4
5
6
7
8
<update id="updateByExampleSelective" parameterType="map">
...
<if test="_parameter != null">
<if test="example.limit != null">
limit ${example.limit}
</if>
</if>
</update>

如何使用

使用方式如下:

1
2
3
4
ExpressNumber expressNumber = ExpressNumber.builder().build();
ExpressNumberExample expressNumberExample = new ExpressNumberExample();
expressNumberExample.setLimit(1);
expressNumberMapper.updateByExampleSelective(expressNumber, expressNumberExample) ;

本章节就到这里了。