使用视图代替Mybatis中的多表查询的设计

使用Mybatis开发项目时, 若是简单的单表查询, 完全可以全部使用代码生成工具自动生成, 但是如果有需要多表联合查询的时候就无能为力了, 不得不手动编写EntityDao以及Service 显得很不统一
但是如果使用视图的话, 就又能利用代码生成工具的便利自动生成EntityDao以及Service, 而且可以在Java代码中完全隐藏掉数据库层专注于应用的开发

源码

commons-mybatis

Model

DO.java

这里的数据库表设计是遵循阿里巴巴Java编码规范
每个表固定三个字段id, gmt_create, gmt_modified
实体类继承BaseDO 默认拥有三个属性id, gmtCreate, gmtModified以及重写的toString()

VO.java

视图名以_view为后缀
视图类继承BaseVO 由于视图的字段不一定, 所以BaseVO中只重写了toString()

Dao

DODao.java

常用的增删改查方法

1
2
3
4
5
6
7
8
T selectById(Long id);
List<T> select(T bean);
int selectCount(T bean);
List<T> select(Query<T> query);
int selectCount(Query<T> query);
int insert(T bean);
int update(T bean);
int delete(Long id);

VODao.java

由于视图不能删增删改, 所以只有select

1
2
3
4
List<T> select(T bean);
int selectCount(T bean);
List<T> select(Query<T> query);
int selectCount(Query<T> query);

Service 以及 Controller 见源码

Mybatis Generator

代码生成器使用velocity模版

获取表信息

1
2
select * from information_schema.tables 
where table_schema = (select database()) and table_name = ?

获取列信息

1
2
3
select * from information_schema.columns 
where table_name = ?
and table_schema = (select database()) order by ordinal_position

动态获取表信息注入模版, 自动生成DO, VO

Dao.java.vm

例如

1
2
3
4
5
6
7
8
9
10
11
package ${package}.database.dao;

import ${package}.database.model.${className}${suffix};

import org.apache.ibatis.annotations.Mapper;
import org.laziji.commons.mybatis.dao.${suffix}Dao;

@Mapper
public interface ${className}Dao extends ${suffix}Dao<${className}${suffix}> {

}