基于mybatis的动态表数据增删改查方法实现
Posted 洛阳泰山
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于mybatis的动态表数据增删改查方法实现相关的知识,希望对你有一定的参考价值。
实体类
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@Data
public class DynamicEntity
/** 主键 */
@TableId(value = "id",type= IdType.ASSIGN_ID)
private Long id;
private String tableName;
private Map<String,Object> params;
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void setParams(Map<String, Object> params)
params.forEach((k,v)->
if(v instanceof String)
try
Date date= dateFormat.parse(v.toString());
params.put(k,date);
catch (ParseException e)
params.put(k,v);
);
params.put("id",id);
params.put("create_time",new Date());
this.params = params;
mapper类
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.springblade.gis.modules.dynamic.entity.DynamicEntity;
import org.springblade.gis.modules.dynamic.wrapper.DynamicWrapper;
import java.util.List;
import java.util.Map;
@Mapper
public interface DynamicMapper
Long insert(DynamicEntity entity);
int updateById(DynamicEntity entity);
@MapKey("id")
List<Map<String,Object>> selectById(String tableName, Long id);
@MapKey("id")
List<Map<String,Object>> selectList(DynamicWrapper entity);
int deleteById(String tableName, Long id);
Long selectCount(DynamicWrapper entity);
service类
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.springblade.gis.modules.dynamic.mapper.DynamicMapper;
import org.springblade.gis.modules.dynamic.entity.DynamicEntity;
import org.springblade.gis.modules.dynamic.wrapper.DynamicWrapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Service
public class DynamicService
@Resource
private SqlSessionTemplate sqlSessionTemplate;
@Resource
private DynamicMapper dynamicMapper;
public Long save(DynamicEntity entity)
return dynamicMapper.insert(entity);
public Boolean saveBatch(List<DynamicEntity> list)
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
dynamicMapper = session.getMapper(DynamicMapper.class);
try
if (CollectionUtils.isNotEmpty(list))
int num = list.size();
for (int i = 0; i < num; i++)
dynamicMapper.insert(list.get(i));
if ((i > 0 && i % 1000 == 0) || i == num - 1)
session.commit();
session.clearCache();
catch (Exception e)
session.rollback();
e.printStackTrace();
return false;
finally
session.close();
return true;
public int updateById(DynamicEntity entity)
return dynamicMapper.updateById(entity);
public List<Map<String, Object>> getById(String tableName,Long id)
return dynamicMapper.selectById(tableName,id);
public List<Map<String, Object>> list(DynamicWrapper wrapper)
if(StringUtils.isBlank(wrapper.getColumns()))
wrapper.setColumns("*");
return dynamicMapper.selectList(wrapper);
public Long count(DynamicWrapper entity)
return dynamicMapper.selectCount(entity);
public Boolean removeByIds(String tableName,List<Long> ids)
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
dynamicMapper = session.getMapper(DynamicMapper.class);
try
if (CollectionUtils.isNotEmpty(ids))
int num = ids.size();
for (int i = 0; i < num; i++)
dynamicMapper.deleteById(tableName,ids.get(i));
if ((i > 0 && i % 1000 == 0) || i == num - 1)
session.commit();
session.clearCache();
catch (Exception e)
session.rollback();
e.printStackTrace();
return false;
finally
session.close();
return true;
wrapper类
import lombok.Data;
import java.util.Map;
@Data
public class DynamicWrapper
private String tableName;
private String columns;
private Map<String,Object> params;
controller类
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springblade.core.secure.annotation.NoToken;
import org.springblade.core.tool.api.R;
import org.springblade.gis.modules.dynamic.entity.DynamicEntity;
import org.springblade.gis.modules.dynamic.service.DynamicService;
import org.springblade.gis.modules.dynamic.wrapper.DynamicWrapper;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@NoToken
@RestController
@AllArgsConstructor
@RequestMapping("dynamic")
@Api(value = "数据库表数据", tags = "数据库表数据")
public class DynamicController
private final DynamicService dynamicService;
@ApiOperation(value = "分页 @author Tarzan Liu")
@GetMapping("page/tableName")
public R<IPage<Map<String,Object>>> pageList(@PathVariable("tableName") String tableName, @RequestParam Map<String,Object> params)
IPage page=new Page();
if(params.get("current")!=null)
page.setCurrent((Long) params.get("current"));
else
page.setCurrent(1);
if(params.get("size")!=null)
page.setSize((Long) params.get("size"));
else
page.setSize(1000);
DynamicWrapper wrapper=new DynamicWrapper();
wrapper.setTableName(tableName);
wrapper.setParams(params);
page.setTotal(dynamicService.count(wrapper));
Long pages;
if(page.getTotal()%page.getSize()==0)
pages=page.getTotal()/page.getSize();
else
pages=page.getTotal()/page.getSize()+1;
page.setPages(pages);
page.setRecords(dynamicService.list(wrapper));
return R.data(page);
@ApiOperation(value = "批量添加 @author Tarzan Liu")
@PostMapping("saveBatch/tableName")
public R<List<Long>> saveBatch(@PathVariable("tableName") String tableName,@RequestBody List<Map<String,Object>> maps)
List<DynamicEntity> list=maps.stream().map(e->
DynamicEntity entity=new DynamicEntity();
entity.setId(IdWorker.getId(DynamicEntity.class));
entity.setParams(e);
entity.setTableName(tableName);
return entity;
).collect(Collectors.toList());
dynamicService.saveBatch(list);
return R.data(list.stream().map(DynamicEntity::getId).collect(Collectors.toList()));
@ApiOperation(value = "详情 @author Tarzan Liu")
@PostMapping("get/tableName/id")
public R<List<Map<String, Object>>> get(@PathVariable("tableName") String tableName,@PathVariable("id") Long id)
return R.data(dynamicService.getById(tableName,id));
@ApiOperation(value = "修改 @author Tarzan Liu")
@PostMapping("update/tableName")
public R<Boolean> update(@PathVariable("tableName") String tableName, @RequestBody Map<String,Object> map)
DynamicEntity entity=new DynamicEntity();
entity.setParams(map);
entity.setTableName(tableName);
entity.setId((Long) map.get("id"));
int flag= dynamicService.updateById(entity);
return R.status(flag>0?true:false);
@ApiOperation(value = "删除 @author Tarzan Liu")
@PostMapping("delete/tableName")
public R<Boolean> delete(@PathVariable("tableName")String tableName,@RequestBody List<Long> ids)
return R.status(dynamicService.removeByIds(tableName,ids));
以上是关于基于mybatis的动态表数据增删改查方法实现的主要内容,如果未能解决你的问题,请参考以下文章
mybatis实战教程(mybatis in action)之三:实现数据的增删改查