☻Blog("Laziji")

System.out.print("辣子鸡的博客");

使用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}> {

}

前一个成员变量调用其后的成员变量

例如:

1
2
public static final Object A = B;
public static final Object B = "String B";

这种显然是不行的, 编译都通不过, 而下面一种就有点不一样了

前成员变量在静态方法中调用其后的成员变量

例如:

1
2
3
4
5
6
7
8
9
public class Test {

public static final Object A = getB();
public static final Object B = "String B";

public static Object getB() {
return B;
}
}

此时编译正常但是, 打印一下A看看:

1
2
3
System.out.println(Test.A); // null
System.out.println(Test.B); // "String B"
System.out.println(Test.getB()); // "String B"

发现A是null, 因为此时B还未初始化, 但是当把B的类型改为String

1
2
3
4
5
6
7
8
9
public class Test {

public static final Object A = getB();
public static final String B = "String B"; // B 的类型改为 String

public static Object getB() {
return B;
}
}

此时A的值就不是null

1
System.out.println(Test.A); // "String B"

这是因为Java的静态成员变量加载时类型为基本类型和String, 并且赋值为常量表达式的成员变量的加载顺序优与其他
常量表达式指能立即得出的运算 包括普通运算以及字符串运算

当静态方法太复杂的时候就可能会碰到这种问题, 而且难找到原因所在

0%