使用视图
Jul 10, 2017 10:38:44 AM
为什么需要视图
数据库将数据存储在数据表中,有些时候,为了展现某些数据,还需要跨越多个表进行计算。比如你有两个数据表
- 雇员表 t_employee
- 任务表 t_task
每个雇员都会有多个任务,所以任务表有一个字段 eid 指向雇员的主键 id。 我们需要随时知道一个雇员有多少个任务,所以在雇员的的POJO 里面,有一个 Java 字段叫做 taskCount 来描述雇员当前总的任务数量。
那么,如何获取这个 taskCount 呢? 每次都执行 SELECT COUNT(*) 吗?比较理想的一个解决方法就是使用视图。在视图的 SQL 语句中我们可以利用数据库的方言,发挥数据库的效率。并且在程序代码里也会更加简洁。比如我们建立一个视图 v_employee
CREATE VIEW v_employee AS (
SELECT * , taskcount = (SELECT COUNT(id) FROM t_task AS t WHERE t.eid = e.id) FROM t_employee AS e;
)
这段代码仅仅是个示意,在不同的数据库上,有不同的写法
那么实际上,我们建立的这个 Employee 的 Java 对象就是要从 v_employee 获取,但是执行 insert, update 或者 delete 的时候,却是操作 t_employee 的。为了这个特殊的需求, Nutz.Dao 提供了 @View 和 @Readonly 这两个注解。
在 POJO 对象上使用视图
我们直接来表述一下 Employee 这个 POJO,这里仅仅是个示意
@Table("t_employee")
@View("v_employee") // <- 这里声明了视图
public class Employee{
@Id
private int id;
...
@Column("taskcount") // 其实可以不用声明数据库字段名 "taskcount",因为多数数据库忽略大小写
@Readonly // <- 这里声明了只读字段,即视图里增加的字段
private int taskCount;
...
}
- 通过 @View, Nutz.Dao 知道了当查询数据时候,应该从哪里获取数据
- 通过 @Readonly 注解 Nutz.Dao 知道,当修改或者删除数据的时候,那些字段应该忽略。
接下来,你就可以通过 org.nutz.dao.Dao 接口随意操作这个 POJO 了。
本页面的文字允许在知识共享 署名-相同方式共享 3.0协议和GNU自由文档许可证下修改和再使用。