如何使用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
相关产品推荐
相关产品推荐

