内容简介:批量插入和分页查询一样,在项目中基本也是不可少的。这里我们要给Mapper添加两个方法:下面直接上代码。上述代码在Mapper接口和SqlMap文件中添加了
批量插入和分页查询一样,在项目中基本也是不可少的。这里我们要给Mapper添加两个方法: batchInsert
和 batchInsertSelective
,区别是前者全字段插入,后者只插入给定的字段。原来的单条 insertSelective
是通过对象的值是不是Null来实现的,我们也可以取插入记录的第0条来实现 batchInsertSelective
。但是,始终感觉有点不对,所以采取了另一种方式,显式地传递要插入地字段来实现。这里就会用到了上一章节写入到Model中的表字段枚举了。
下面直接上代码。
修改Mapper接口和SqlMap文件
public class BatchInsertPluginextends PluginAdapter{
@Override
public boolean validate(List<String> list){
return true;
}
/**
* 修改Mapper类
*/
@Override
public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable){
addBatchInsertMethod(interfaze, introspectedTable);
return true;
}
private void addBatchInsertMethod(Interface interfaze, IntrospectedTable introspectedTable){
// 设置需要import的类
Set<FullyQualifiedJavaType> importedTypes = new TreeSet<>();
importedTypes.add(FullyQualifiedJavaType.getNewListInstance());
importedTypes.add(new FullyQualifiedJavaType(introspectedTable.getBaseRecordType()));
FullyQualifiedJavaType ibsreturnType = FullyQualifiedJavaType.getIntInstance();
Method batchInsertMethod = new Method();
// 1.设置方法可见性
batchInsertMethod.setVisibility(JavaVisibility.PUBLIC);
// 2.设置返回值类型 int类型
batchInsertMethod.setReturnType(ibsreturnType);
// 3.设置方法名
batchInsertMethod.setName("batchInsert");
// 4.设置参数列表
FullyQualifiedJavaType paramType = FullyQualifiedJavaType.getNewListInstance();
FullyQualifiedJavaType paramListType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
paramType.addTypeArgument(paramListType);
batchInsertMethod.addParameter(new Parameter(paramType, "records"));
interfaze.addImportedTypes(importedTypes);
interfaze.addMethod(batchInsertMethod);
Method batchInsertSelectiveMethod = new Method();
// 1.设置方法可见性
batchInsertSelectiveMethod.setVisibility(JavaVisibility.PUBLIC);
// 2.设置返回值类型 int类型
batchInsertSelectiveMethod.setReturnType(ibsreturnType);
// 3.设置方法名
batchInsertSelectiveMethod.setName("batchInsertSelective");
// 4.设置参数列表
FullyQualifiedJavaType paramTypeSelective = FullyQualifiedJavaType.getNewListInstance();
FullyQualifiedJavaType paramListTypeSelective = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
paramTypeSelective.addTypeArgument(paramListTypeSelective);
batchInsertSelectiveMethod.addParameter(new Parameter(paramTypeSelective, "records", "@Param(\"records\")"));
batchInsertSelectiveMethod.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "columns", "@Param(\"columns\")", true));
interfaze.addImportedTypes(importedTypes);
interfaze.addMethod(batchInsertSelectiveMethod);
}
/**
* 修改Mapper.xml
*/
@Override
public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable){
addBatchInsertXml(document, introspectedTable);
addBatchInsertSelectiveXml(document, introspectedTable);
return true;
}
private void addBatchInsertXml(Document document, IntrospectedTable introspectedTable){
// <insert ...
XmlElement insertBatchElement = new XmlElement("insert");
insertBatchElement.addAttribute(new Attribute("id", "batchInsert"));
insertBatchElement.addAttribute(new Attribute("parameterType", "java.util.List"));
XmlElement valueTrimElement = new XmlElement("trim");
valueTrimElement.addAttribute(new Attribute("prefix", " ("));
valueTrimElement.addAttribute(new Attribute("suffix", ")"));
valueTrimElement.addAttribute(new Attribute("suffixOverrides", ","));
XmlElement columnTrimElement = new XmlElement("trim");
columnTrimElement.addAttribute(new Attribute("prefix", "("));
columnTrimElement.addAttribute(new Attribute("suffix", ")"));
columnTrimElement.addAttribute(new Attribute("suffixOverrides", ","));
List<IntrospectedColumn> columns = introspectedTable.getAllColumns();
for (IntrospectedColumn introspectedColumn : columns) {
String columnName = introspectedColumn.getActualColumnName();
columnTrimElement.addElement(new TextElement(columnName+","));
valueTrimElement.addElement(new TextElement("#{item." + introspectedColumn.getJavaProperty() + ",jdbcType=" + introspectedColumn.getJdbcTypeName() + "},"));
}
XmlElement foreachElement = new XmlElement("foreach");
foreachElement.addAttribute(new Attribute("collection", "list"));
foreachElement.addAttribute(new Attribute("index", "index"));
foreachElement.addAttribute(new Attribute("item", "item"));
foreachElement.addAttribute(new Attribute("separator", ","));
insertBatchElement.addElement(new TextElement("insert into " + introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()));
insertBatchElement.addElement(columnTrimElement);
insertBatchElement.addElement(new TextElement(" values "));
foreachElement.addElement(valueTrimElement);
insertBatchElement.addElement(foreachElement);
document.getRootElement().addElement(insertBatchElement);
}
private void addBatchInsertSelectiveXml(Document document, IntrospectedTable introspectedTable){
// <insert ...
XmlElement insertBatchElement = new XmlElement("insert");
insertBatchElement.addAttribute(new Attribute("id", "batchInsertSelective"));
insertBatchElement.addAttribute(new Attribute("parameterType", "map"));
XmlElement foreachColumn = new XmlElement("foreach");
foreachColumn.addAttribute(new Attribute("collection", "columns"));
foreachColumn.addAttribute(new Attribute("index", "index"));
foreachColumn.addAttribute(new Attribute("item", "item"));
foreachColumn.addAttribute(new Attribute("separator", ","));
foreachColumn.addAttribute(new Attribute("open", "("));
foreachColumn.addAttribute(new Attribute("close", ")"));
foreachColumn.addElement(new TextElement("${item}"));
insertBatchElement.addElement(new TextElement("insert into " + introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()));
insertBatchElement.addElement(foreachColumn);
insertBatchElement.addElement(new TextElement(" values "));
XmlElement valueTrimElement = new XmlElement("trim");
valueTrimElement.addAttribute(new Attribute("prefix", " ("));
valueTrimElement.addAttribute(new Attribute("suffix", ")"));
valueTrimElement.addAttribute(new Attribute("suffixOverrides", ","));
XmlElement foreachColumnForValue = new XmlElement("foreach");
foreachColumnForValue.addAttribute(new Attribute("collection", "columns"));
foreachColumnForValue.addAttribute(new Attribute("index", "index"));
foreachColumnForValue.addAttribute(new Attribute("item", "column"));
List<IntrospectedColumn> columns = introspectedTable.getAllColumns();
for (IntrospectedColumn introspectedColumn : columns) {
String columnName = introspectedColumn.getActualColumnName();
XmlElement check = new XmlElement("if");
check.addAttribute(new Attribute("test", "'" + columnName + "' == column"));
check.addElement(new TextElement("#{record." + introspectedColumn.getJavaProperty() + ",jdbcType=" + introspectedColumn.getJdbcTypeName() + "},"));
foreachColumnForValue.addElement(check);
}
valueTrimElement.addElement(foreachColumnForValue);
XmlElement foreachElement = new XmlElement("foreach");
foreachElement.addAttribute(new Attribute("collection", "records"));
foreachElement.addAttribute(new Attribute("index", "index"));
foreachElement.addAttribute(new Attribute("item", "record"));
foreachElement.addAttribute(new Attribute("separator", ","));
foreachElement.addElement(valueTrimElement);
insertBatchElement.addElement(foreachElement);
document.getRootElement().addElement(insertBatchElement);
}
}
上述代码在Mapper接口和SqlMap文件中添加了 batchInsert
和 batchInsertSelective
的支持。
查看生成文件
将插件添加到项目中,并且运行完MybatisGenerator,我们来查看下生成的相关文件:
public interface AdministratorMapper{
...
int batchInsert(List<Administrator> records);
int batchInsertSelective(@Param("records")List<Administrator> records, @Param("columns")String ... columns);
...
}
...
<insertid="batchInsert"parameterType="java.util.List">
insert into administrator
<trimprefix="("suffix=")"suffixOverrides=",">
id,
mobile,
pwd,
role,
deleted,
create_time,
update_time,
</trim>
values
<foreachcollection="list"index="index"item="item"separator=",">
<trimprefix=" ("suffix=")"suffixOverrides=",">
#{item.id,jdbcType=BIGINT},
#{item.mobile,jdbcType=VARCHAR},
#{item.pwd,jdbcType=VARCHAR},
#{item.role,jdbcType=TINYINT},
#{item.deleted,jdbcType=INTEGER},
#{item.createTime,jdbcType=BIGINT},
#{item.updateTime,jdbcType=BIGINT},
</trim>
</foreach>
</insert>
<insertid="batchInsertSelective"parameterType="map">
insert into administrator
<foreachclose=")"collection="columns"index="index"item="item"open="("separator=",">
${item}
</foreach>
values
<foreachcollection="records"index="index"item="record"separator=",">
<trimprefix=" ("suffix=")"suffixOverrides=",">
<foreachcollection="columns"index="index"item="column">
<iftest="'id' == column">
#{record.id,jdbcType=BIGINT},
</if>
<iftest="'mobile' == column">
#{record.mobile,jdbcType=VARCHAR},
</if>
<iftest="'pwd' == column">
#{record.pwd,jdbcType=VARCHAR},
</if>
<iftest="'role' == column">
#{record.role,jdbcType=TINYINT},
</if>
<iftest="'deleted' == column">
#{record.deleted,jdbcType=INTEGER},
</if>
<iftest="'create_time' == column">
#{record.createTime,jdbcType=BIGINT},
</if>
<iftest="'update_time' == column">
#{record.updateTime,jdbcType=BIGINT},
</if>
</foreach>
</trim>
</foreach>
</insert>
...
如何使用
使用方式如下:
administratorMapper.batchInsertSelective(
list,
Administrator.COLUMNS.ID.getColumn(),
Administrator.COLUMNS.MOBILE.getColumn()
);
本章节就到这里了。
以上所述就是小编给大家介绍的《MybatisGenerator插件开发四【批量插入】》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- HashMap为何从头插入改为尾插入
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入
- HashMap之元素插入
- 插入排序
- PHP 实现插入排序
- 特殊排序——二分+插入排序
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。