You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AngularJS1、Hibernate4.3.5、Spring MVC4.2.4实现Excel导入数据库

嘿,我来帮你搞定这个Excel导入数据库的问题!你已经把Excel转成JSON了,这步已经完成大半,接下来咱们聚焦前后端对接和后端持久化的环节,一步步来:

一、前端:确保JSON数据正确传给后端

既然你已经能把Excel转成JSON,接下来要做的就是把这份JSON数据通过POST请求传给Spring MVC的接口。这里给你一个AngularJS 1.x的示例代码,确保请求格式和参数正确:

app.controller('ExcelImportCtrl', function($scope, $http) {
    // 假设你已经通过Excel解析工具得到了jsonData数组
    $scope.submitImport = function(jsonData) {
        $http.post('/api/import/excel-data', jsonData, {
            headers: { 'Content-Type': 'application/json' }
        })
        .then(function(response) {
            alert('导入成功!共导入' + response.data + '条数据');
        })
        .catch(function(error) {
            alert('导入失败:' + error.data.message);
        });
    };
});

注意哦:要保证JSON里的字段名和后端实体类的属性名一致,比如后端实体里的lastName对应JSON里的lastName,避免字段映射出错。

二、后端:Spring MVC + Hibernate 处理数据持久化

这部分是核心,咱们分步骤来实现:

1. 配置Spring MVC接收JSON

首先要确保你的Spring配置里支持JSON和Java对象的转换,Spring 4.2.4默认集成Jackson,只要你的项目里有jackson-databind、jackson-core依赖,再开启注解驱动就行:

<!-- Spring MVC配置文件 -->
<mvc:annotation-driven/>

2. 编写实体类映射数据库表

根据你的需求(父项+子项“姓氏、名字”),假设数据库表是单表设计,用@Embeddable来封装子项字段,示例如下:

@Entity
@Table(name = "user_info")
public class UserInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // 父项字段,比如用户编号、部门等
    @Column(name = "user_code")
    private String userCode;

    // 子项:姓氏+名字,用嵌入类封装
    @Embedded
    private FullName fullName;

    // getter、setter方法
}

@Embeddable
public class FullName {
    @Column(name = "last_name")
    private String lastName;

    @Column(name = "first_name")
    private String firstName;

    // getter、setter方法
}

如果你的数据库是父子表关联(比如父表存主信息,子表存姓名),那可以用@OneToOne或@OneToMany注解来映射关联关系,这个根据你的实际表结构调整就行。

3. 编写Spring MVC控制器接收请求

控制器负责接收前端传过来的JSON数组,转成Java对象列表,再交给Service层处理:

@Controller
@RequestMapping("/api/import")
public class ExcelImportController {

    @Autowired
    private UserInfoService userInfoService;

    @PostMapping("/excel-data")
    @ResponseBody
    public ResponseEntity<Integer> importExcelData(@RequestBody List<UserInfo> userInfoList) {
        try {
            int count = userInfoService.batchSaveUserInfo(userInfoList);
            return ResponseEntity.ok(count);
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(0);
        }
    }
}

4. Service层处理业务逻辑(含事务)

Service层要加上事务注解,确保批量导入时要么全成功要么全回滚:

@Service
@Transactional
public class UserInfoService {

    @Autowired
    private UserInfoDao userInfoDao;

    public int batchSaveUserInfo(List<UserInfo> userInfoList) {
        int count = 0;
        for (UserInfo userInfo : userInfoList) {
            userInfoDao.saveOrUpdate(userInfo);
            count++;
            // 每50条刷新一次Session,避免内存溢出
            if (count % 50 == 0) {
                userInfoDao.flushAndClear();
            }
        }
        return count;
    }
}

5. DAO层用Hibernate实现持久化

用Hibernate的SessionFactory来操作数据库:

@Repository
public class UserInfoDao {

    @Autowired
    private SessionFactory sessionFactory;

    public void saveOrUpdate(UserInfo userInfo) {
        sessionFactory.getCurrentSession().saveOrUpdate(userInfo);
    }

    public void flushAndClear() {
        Session session = sessionFactory.getCurrentSession();
        session.flush();
        session.clear();
    }
}
三、关键注意事项
  • 检查数据库表结构和实体类的映射是否完全匹配,比如字段名、数据类型、约束(非空、唯一等)。
  • 批量导入时记得定期flush和clear Session,避免大量数据堆积导致内存溢出。
  • 处理异常:在Service层捕获数据格式错误、数据库约束违反等异常,返回友好提示给前端。
  • 测试时可以先传少量数据,确认没问题再批量导入。

内容的提问来源于stack exchange,提问作者woodson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:42:20