教你使用java将excel数据导入MySQL

网友投稿 403 2022-10-24


教你使用java将excel数据导入MySQL

一、pom文件

junit

junit

4.12

org.springframework.boot

spring-boot-starter-test

test

com.alibaba

easyexcel

2.1.7

com.alibaba

fastjson

1.2.62

org.springframework.boot

mVdyMBEG spring-boot-starter

org.springframework.boot

spring-boot-starter-test

test

com.mchange

c3p0

0.9.5.2

com.baomidou

mybatis-plus-boot-starter

3.4.0

org.springframework.boot

spring-boot-starter-jdbc

mysql

mysql-connectomVdyMBEGr-java

runtime

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-web

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-test

test

二、配置文件

server.port=8080

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

spring.datasource.url=jdbc:mysql://localhost:3306/ddb_resources?serverTimezone=UTC

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.username=root

spring.datasource.password=root

三、mapper文件

@Mapper

public interface DdbBookNewWordMapper extends BaseMapper {

}

四、service文件

@Service

public class DemoDAO {

@Autowired

DdbBookNewWordMapper mapper;

public void save(List list) {

// 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchInsert,所有数据一次性插入

DdbBookNewWord newWord = new DdbBookNewWord();

System.out.println("插入数据开始===============================");

for (DataDemo001 info : list) {

newWord.setAppType(0);

newWord.setFkBookId(info.getFkBookId());

newWord.setWord(info.getWord());

newWord.setSimpleExplain(info.getSimpleExplain());

newWord.setImgUrl("/incoming/ddb/wordImg/"+info.getFkBookId()+"/"+info.getImgUrl());

newWord.setSoundUrl("/incoming/ddb/wordAudio/bookStudyMp3/"+info.getFkBookId()+"/"+info.getSoundUrl());

newWord.setCreateTimeInMs(1620983400709L);

newWord.setUpdateTimeInMs(1620983400709L);

System.out.println(newWord);

mapper.insert(newWord);

}

System.out.println("结束=========================");

}

}

五、实体类(数据库对应)

@Data

@AllArgsConstructor

@NoArgsConstructor

@ToString

public class DdbBookNewWord {

private int id;

private String fkBookId;

private String word;

private String simpleExplain;

private String imgUrl;

private long createTimeInMs;

private long updateTimeInMs;

private int appType;

private String soundUrl;

}

六、excel对应的实体类

@Data

public class DataDemo001 {

private String fkBookId;

private String bookeName;

private String moudle;

private String unit;

private String word;

private String soundUrl;

private String imgUrl;

private String simpleExplain;

}

七、监听器

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去

public class DataDemo001Listener extends AnalysisEventListener {

// DemoDAO demoDAO = SpringContextHolder.getBean(DemoDAO.class);

private static final Logger LOGGER = LoggerFactory.getLogger(DataDemo001Listener.class);

/**

* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收

*/

private static final int BATCH_COUNT = 100;

List list = new ArrayList();

/**

* 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。

*/

private DemoDAO demoDAO;

//

public DataDemo001Listener(DemoDAO demoDAO) {

// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数

this.demoDAO = demoDAO;

}

/**

* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来

*

* @param demoDAO

*/

// public DataDemo001Listener(DemoDAO demoDAO) {

// this.demoDAO = demoDAO;

// }

/**

* 这个每一条数据解析都会来调用

*

* @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}

* @param context

*/

@Override

public void invoke(DataDemo001 data, AnalysisContext context) {

System.out.println(JSON.toJSONString(data));

list.add(data);

// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM

if (list.size() >= BATCH_COUNT) {

saveData();

// 存储完成清理 list

list.clear();

}

}

/**

* 所有数据解析完成了 都会来调用

*

* @param context

*/

@Override

public void doAfterAllAnalysed(AnalysisContext context) {

// 这里也要保存数据,确保最后遗留的数据也存储到数据库

saveData();

LOGGER.info("所有数据解析完成!");

}

/**

* 加上存储数据库

*/

private void saveData() {

demoDAO.save(list);

}

}

八、测试类

String path = "D:\\java-demo\\kuang-poi\\";

@Test

public void simpleRead() {

String fileName = path+"悠游阅读成长计划-单词部分.xls";

// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭

EasyExcel.read(fileName, DataDemo001.class, new DataDemo001Listener(demoDAO)).sheet().doRead();

}

九、启动类(没啥用)

@MapperScan("com.example.demo.mapper")

@ComponentScan({"com.example.demo.test","com.example.demo.service"})

@SpringBootApplication

public class DemoApplication {

public static void main(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}

}

十、结构


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:静态分析与软件测试中的动态分析
下一篇:华为NTP配置实例
相关文章

 发表评论

评论列表