美文网首页Java web
mysql数据批量导入和导出

mysql数据批量导入和导出

作者: Raral | 来源:发表于2021-03-26 19:13 被阅读0次

mysql数据批量导入和数据库迁移

将一张表导入另一张表(同一个服务器下的同一个数据库)

  1. 两张表字段一致时
INSERT INTO a_test01 SELECT * FROM a_test;
  1. 两张表有些字段一致时
INSERT INTO a_test02(id,sname)  SELECT id, name AS sname FROM a_test;

这里【起别名(as)】是非常重要的,不然会因为字段不同而报错。

  1. 更新特定字段

有条件

INSERT INTO a_test03(id,sname)  SELECT id, name AS sname FROM a_test WHERE id = 1;

将一个xlsx 文件 导入 指定的表

  1. 该excel表格数据,没有类似 数据字典的字段,纯表面意思
    • 通过navicat 建立数据库,建立对应的表 字段结构
    • 右键 导入向导,选择 xlsx 格式
    • 流程图


      1616745129(1).png
      000.jpg
  1. 该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

相关文章

网友评论

    本文标题:mysql数据批量导入和导出

    本文链接:https://www.haomeiwen.com/subject/iilshltx.html