mysql数据批量导入和数据库迁移
将一张表导入另一张表(同一个服务器下的同一个数据库)
- 两张表字段一致时
INSERT INTO a_test01 SELECT * FROM a_test;
- 两张表有些字段一致时
INSERT INTO a_test02(id,sname) SELECT id, name AS sname FROM a_test;
这里【起别名(as)】是非常重要的,不然会因为字段不同而报错。
- 更新特定字段
有条件
INSERT INTO a_test03(id,sname) SELECT id, name AS sname FROM a_test WHERE id = 1;
将一个xlsx 文件 导入 指定的表
- 该excel表格数据,没有类似 数据字典的字段,纯表面意思
- 通过navicat 建立数据库,建立对应的表 字段结构
- 右键 导入向导,选择 xlsx 格式
-
流程图
1616745129(1).png
000.jpg
- 该excel表格数据,有类似 数据字典的字段,需要将映射到表字段,拆分表
需要java代码实现:
- 定义一个controller 将来 通过 postman 上传 excel文件
@RestController
public class ExcelController {
@Autowired
private IExcelService excelService;
//上传表格到数据库
@PostMapping("/api/common/uploadExcel")
public AjaxResult uploadExcel( MultipartFile file, Map<String, Object> map) {
String name = file.getOriginalFilename();
if (name.length() < 6 || !name.substring(name.length() - 5).equals(".xlsx")) {
return AjaxResult.error("文件格式不对");
}
List<ExcelBean> list = null;
try {
list = ExcelUtils2.excelToList(file.getInputStream());
for( ExcelBean excelBean : list) {
if(excelBean != null) {
excelService.inertTest(excelBean);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return AjaxResult.success("获取数据成功,并且插入数据库中", list);
}
//下载表格
}
- 定义一个工具类 把文件读取后,存入到数据库中表里
public class ExcelUtils2 {
//读取excel文件,转换成java list结构
public static List<ExcelBean> excelToList(InputStream inputStream) {
// 1. 定义一个接手的list
List<ExcelBean> list = new ArrayList<>();
try {
//2. 定义 一个 工作簿
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
//工作表对象
XSSFSheet sheet = workbook.getSheetAt(0);
System.out.println(sheet);
//总行数
int rowLength = sheet.getLastRowNum();
//这个行数 计算时去掉头部的一行
System.out.println("总行数有多少行" + rowLength);
XSSFRow row = sheet.getRow(0);
//总列数
int colLength = row.getLastCellNum();
System.out.println("总列数有多少列" + colLength);
//得到指定的单元格,这计算是从 头部开始计算
XSSFCell cell = row.getCell(0);
System.out.println("单元格," + cell);
for(int i = 1; i <= rowLength; i ++) {
ExcelBean itemObj = new ExcelBean();
row = sheet.getRow(i);
for(int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
cell = row.getCell(j);
System.out.println(cell+",");
if(cell != null) {
cell.setCellType(CellType.STRING);
String data = cell.getStringCellValue();
data = data.trim();
//取到对应单元格的数据,进行赋值
//j 0:表示编号; 1: 表示姓名
if(j == 0) {
int id = Integer.parseInt(data);
itemObj.setId(id);
}else if(j == 1) {
itemObj.setName(data);
}
}
}
list.add(itemObj);
}
}catch (Exception e) {
}
return list;
}
}
- 效果图
优化插入到数据库的性能优化,分表插入等操作
敬请期待
参考链接:
https://blog.csdn.net/qq_31204607/article/details/107385660
https://zhuanlan.zhihu.com/p/209193157
https://www.jianshu.com/p/8356a59dad00
网友评论