基於Java SSM實現Excel數據批量導入

導入Maven依賴

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>easyexcel</artifactId>
	<version>${easyexcel.version}</version>
</dependency>

Mapper及映射文件

UserMapper.java

@Mapper
public interface UserMapper {
    int batchInsert(@Param("list") List<User> list);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hc.mapper.UserMapper">
  <resultMap id="BaseResultMap" type="com.hc.domain.User">
    <[email protected]>
    <!--@Table tb_user-->
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="nickname" jdbcType="VARCHAR" property="nickname" />
    <result column="avatar" jdbcType="VARCHAR" property="avatar" />
    <result column="account" jdbcType="VARCHAR" property="account" />
    <result column="password" jdbcType="VARCHAR" property="password" />
    <result column="gender" jdbcType="TINYINT" property="gender" />
    <result column="tel" jdbcType="VARCHAR" property="tel" />
    <result column="email" jdbcType="VARCHAR" property="email" />
    <result column="qq" jdbcType="VARCHAR" property="qq" />
    <result column="wechat" jdbcType="VARCHAR" property="wechat" />
    <result column="salt" jdbcType="VARCHAR" property="salt" />
    <result column="info" jdbcType="VARCHAR" property="info" />
    <result column="status" jdbcType="TINYINT" property="status" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
  </resultMap>
  <sql id="Base_Column_List">
    <[email protected]>
    id, nickname, avatar, account, `password`, gender, tel, email, qq, wechat, salt, 
    info, `status`, create_time, update_time
  </sql>
  <insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true">
    <[email protected]>
    insert into tb_user
    (nickname, avatar, account, `password`, gender, tel, email, qq, wechat, salt, info,
    `status`, create_time, update_time)
    values
    <foreach collection="list" item="item" separator=",">
      (#{item.nickname,jdbcType=VARCHAR}, #{item.avatar,jdbcType=VARCHAR}, #{item.account,jdbcType=VARCHAR},
      #{item.password,jdbcType=VARCHAR}, #{item.gender,jdbcType=TINYINT}, #{item.tel,jdbcType=VARCHAR},
      #{item.email,jdbcType=VARCHAR}, #{item.qq,jdbcType=VARCHAR}, #{item.wechat,jdbcType=VARCHAR},
      #{item.salt,jdbcType=VARCHAR}, #{item.info,jdbcType=VARCHAR}, #{item.status,jdbcType=TINYINT},
      #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP})
    </foreach>
  </insert>
</mapper>

Excel監聽器

@Log4j2
@Service
public class UserExcelListener extends AnalysisEventListener<User> {

	@Resource
	private UserMapper userMapper;

	/**
	 * 批處理閾值
	 */
	private static final int BATCH_COUNT = 250;
	@Getter
	List<User> list = new ArrayList<>(BATCH_COUNT);

	@Override
	public void invoke(User user, AnalysisContext analysisContext) { //逐行讀取數據
		log.info("********** 解析到一條數據:{}", JSON.toJSONString(user));
		list.add(user);
		if (list.size() >= BATCH_COUNT) {
            System.out.println("已經解析"+list.size()+"條數據");
			//每250條,往數據庫中存一次
			int batchInsertRes = userMapper.batchInsert(list);
			System.out.println(batchInsertRes);
			list.clear();
		}
	}

	@Override
	public void doAfterAllAnalysed(AnalysisContext analysisContext) {
		log.info("**********所有數據解析完成!");
	}
}

測試

@ExtendWith(SpringExtension.class)
@ContextConfiguration("/applicationContext.xml")
public class ExcelUtilTest {
    @Resource
    private UserExcelListener userExcelListener;

    @Test
    void userListener(){
        EasyExcel.read("E:\\Projects\\WorksDisplay\\data\\users.xlsx", User.class, userExcelListener)
                .sheet()
                .doRead();
    }
} 

到此這篇關於基於Java SSM實現Excel數據批量導入的文章就介紹到這瞭,更多相關Java  Excel數據批量導入內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: