一、业务需求
假设某学校课程系统,不同专业课程不同 (可以动态增删),但是需要根据专业不同显示该专业学生的各科课程的成绩,如下:
| 专业 | 姓名 | 高等数学 | 数据结构 |
|---|---|---|---|
| 计算机 | 张三 | 90 | 85 |
| 计算机 | 李四 | 78 | 87 |
| 专业 | 姓名 | 高等数学 |
|---|---|---|
| 数学 | 王五 | 86 |
| 数学 | 赵六 | 95 |
二、设计思路
开始的思路是根据配置的课程动态生成文档字段,使用非映射方式直接操作 MongoCollection, 有以下问题:
- 存取数据日期序列化问题 (亦可能是本人没有找到正确的处理方式)
- 返回结果集不能转换成实体对象,不方便做二次处理
所以最终使用内嵌数组的方式
三、代码示例
3.1 实体类
1 | public class Student { |
3.2 添加测试专业及课程
1 | public class MajorConfig { |
3.3 添加测试数据到 MongoDB
初始化数据 (createTime 在 MongoDB 存储为 ISODate):
1 | [ |
3.4 根据专业获取学生课程分数列表
首先查询到对应的数据,然后根据配置的课程动态添加字段:
1 | public Object list(String major){ |
各专业学生各科分数数据:
1 | [ |
1 | [ |
ReflectUtil 代码:
1 | public class ReflectUtil { |
DynamicBean 代码:
1 | public class DynamicBean { |
3.5 添加课程并修改数据库
1 | public Object add(String major, String name, Boolean updateDatabase){ |
为数学专业添加计算机基础:
1 | [ |
3.6 删除课程并修改数据库
1 | public Object del(String major, String name, Boolean updateDatabase){ |
把高等数学从计算机专业删除:
1 | [ |
3.7 修改某学生的某课程分数
1 | public Object update(String name, String courseName, Float score){ |
完整代码:GitHub