下面我将详细讲解如何实现mybatisPlus自定义批量新增的实现代码,包括两条示例:
自定义批量新增实现代码
mybatisPlus并不支持批量新增操作,所以需要我们手动实现,下面是具体的代码实现:
public interface CustomBatchInsertMapper<T> extends BaseMapper<T> {
/**
* 批量新增
* @param list 实体对象列表
* @return 影响记录数
*/
@InsertProvider(type = CustomBatchInsertProvider.class, method = "dynamicSQL")
int customBatchInsert(List<T> list);
}
其中,CustomBatchInsertMapper
是自定义的mapper接口,该接口继承了BaseMapper
接口。CustomBatchInsertProvider
是自定义的SQL提供者,用于生成SQL语句。在CustomBatchInsertMapper
接口中,使用@InsertProvider
注解指定CustomBatchInsertProvider
作为SQL提供者,并指定customBatchInsert
方法调用DynamicSQL
方法,最后返回影响记录数。
接下来是具体的CustomBatchInsertProvider
类的实现:
public class CustomBatchInsertProvider {
public <T> String batchInsert(Map<String, Object> map) {
List<T> list = (List<T>) map.get("list");
if (CollectionUtils.isEmpty(list)) {
return null;
}
StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO ");
sb.append(SqlHelper.getTableName(list.get(0).getClass()));
sb.append(" (");
List<Field> fieldList = getAllField(list.get(0).getClass());
for (Field field : fieldList) {
sb.append(SqlHelper.getColumnName(field));
sb.append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(") VALUES ");
for (T entity : list) {
sb.append("(");
for (Field field : fieldList) {
Object fieldValue = getFieldVal(entity, field);
if (Objects.isNull(fieldValue)) {
sb.append("null,");
} else {
sb.append(SqlHelper.safeParam(fieldValue));
sb.append(",");
}
}
sb.deleteCharAt(sb.length() - 1);
sb.append("),");
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
private List<Field> getAllField(Class<?> clazz) {
List<Field> fieldList = new ArrayList<>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (field.isAnnotationPresent(TableField.class) && !field.getAnnotation(TableField.class).exist()) {
continue;
}
fieldList.add(field);
}
Class<?> superclass = clazz.getSuperclass();
if (Objects.nonNull(superclass) && !Object.class.equals(superclass)) {
fieldList.addAll(getAllField(superclass));
}
return fieldList;
}
private Object getFieldVal(Object entity, Field field) {
try {
return field.get(entity);
} catch (IllegalAccessException e) {
throw ExceptionUtils.mpe("Error: Cannot execute getFieldVal method. Cause", e);
}
}
}
在CustomBatchInsertProvider
类中,实现了batchInsert
方法,该方法接收一个Map<String, Object>
类型的参数,其中包含需要新增的实体对象列表。该方法首先获取对象列表中的第一个对象,并通过MybatisPlus的SqlHelper.getTableName
方法获取当前实体对象对应的表名。然后,通过反射获取实体对象的所有属性和属性值,并拼接成SQL语句。最后返回拼接好的SQL语句。
注意:在进行反射获取实体对象属性时,需要判断属性是否有@TableField(exist = false)
注解,若有此注解,则跳过该属性,不参与拼接SQL语句。这是因为MybatisPlus会根据@TableField(exist = false)
注解的属性名生成SQL语句,如果没有该注解,MybatisPlus会将该属性作为数据库中的一列。
示例
下面是两条使用示例:
示例1
假设我们有一个UserDO
实体对象,用于保存用户信息。需要新增10条用户记录到数据库中。此时,我们可以这样实现:
List<UserDO> list = new ArrayList<>();
for(int i = 0; i < 10; i++) {
UserDO userDO = new UserDO();
userDO.setName("张三" + i);
userDO.setAge(20 + i);
userDO.setSex(SexEnum.MALE);
userDO.setPassword("123456");
userDO.setMobile("13888888888");
list.add(userDO);
}
CustomBatchInsertMapper<UserDO> customBatchInsertMapper = sqlSession.getMapper(CustomBatchInsertMapper.class);
int rows = customBatchInsertMapper.customBatchInsert(list);
在上述代码中,我们首先创建了10个UserDO
对象,并设置相关属性。然后,获取自定义的mapper接口CustomBatchInsertMapper
的实例,调用customBatchInsert
方法,传入实体对象列表,最后返回新增记录数。
示例2
假设我们有一个OrderDO
实体对象,用于保存订单信息。需要新增100条订单记录到数据库中。此时,我们可以这样实现:
List<OrderDO> list = new ArrayList<>();
for(int i = 0; i < 100; i++) {
OrderDO orderDO = new OrderDO();
orderDO.setUserId(i % 10 + 1L);
orderDO.setGoodsName("商品" + i);
orderDO.setTotalPrice(i * 100L);
list.add(orderDO);
}
CustomBatchInsertMapper<OrderDO> customBatchInsertMapper = sqlSession.getMapper(CustomBatchInsertMapper.class);
int rows = customBatchInsertMapper.customBatchInsert(list);
在上述代码中,我们同样创建了100个OrderDO
对象,并设置相关属性。然后,获取自定义的mapper接口CustomBatchInsertMapper
的实例,调用customBatchInsert
方法,传入实体对象列表,最后返回新增记录数。
以上就是完整的mybatisPlus自定义批量新增的实现代码
攻略,希望能够对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatisPlus自定义批量新增的实现代码 - Python技术站