# 无脑增删改查

可视化代码生成器需配合前端工程一起运行。

可以临时使用其他项目的代码生成器【建议使用和当前Api服务的依赖包版本一致的生成器】

线上代码生成器参考地址(opens new window)

后期将会重构代码生成器的生成规则,将所有POJO的类名进行规范化。到时会统一通知。

# 1. 建表

具体规范详见数据库模块

# 2. 拷贝DDL到代码生成器

代码生成器初始界面
代码生成后

提示

按照图示步骤来即可,step2主要用于控制你的class文件需要生成到什么包下面,页面的vue等文件需要生成在哪个文件夹下面。

通常这个名称为你的业务模块名称,比如用户模块可以取名为user,论坛模块取名为forum,这里暂时取名为demo

多表关联查询功能暂时不可使用

# 3. 将生成的V6后端文件拷贝到项目

后端文件的拷贝只需要按照包名进行拷贝即可,是不是很简单?

小贴士

复制完整一个类的代码文字之后,只需要鼠标选中IDEA内的一个包(左侧文件目录中的包文件夹),然后CV就可以自动完成文件的创建和拷贝。

# 4. 编译生成QueryDSL辅助类

当你将代码全部拷贝到项目后,会发现在service的实现类中,有一个形如QXxxYxx的类不存在,如上图。

其实这个类是QueryDSL的一个sql编写的辅助对象。QueryDSL写SQL语句的一个特点就是面向对象,这个面向的对象就是QXxxYxx

正所谓好的将军,不打无准备之仗,所以我建议你可以去自行了解下完整的QueryDSL语法,在这里我只做简单演示说明。

QueryDSL单表查询参考:

QDemoTable qDemoTable = QDemoTable.demoTable;

List<DemoTable> list = queryFactory.select(qDemoTable)
				.from(qDemoTable)
				.where(qDemoTable.title.like("%杰夫%"))
				.fetch();
1
2
3
4
5
6

怎么样,语法上是不是几乎和手写sql一毛一样?

再来看一个多表关联查询的例子:

QDemoTable qDemoTable = QDemoTable.demoTable;
QDemoTable2 qDemoTable2 = QDemoTable2.demoTable2;

List<Tuple> list = queryFactory.select(qDemoTable,qDemoTable2)
				.from(qDemoTable)
				.leftJoin(qDemoTable2)
				.on(qDemoTable.id.eq(qDemoTable2.pid))
				.where(qDemoTable.title.like("%杰夫%"))
				.fetch();
1
2
3
4
5
6
7
8
9

我们注意到,select方法中,如果有两个及以上参数时,最终返回值的泛型类型为Tuple

那么我们如何获取到我们实际真正需要的DO对象呢?

list.forEach(tuple -> {
  DemoTable demoTable = tuple.get(qDemoTable);	
});
1
2
3

其实QueryDSL只是将多查询结果集做了一个聚合操作。

如果是类似菜单表那种,自己和自己关联,那你就需要取一个别名对象了。

QDemoTable qDemoTable = QDemoTable.demoTable;
/**
 * 注意这里,使用的是QDemoTable的一个构造方法
 * 其实QDemoTable.demoTable的本质也是:
 * public static final QDemoTable demoTable = new QDemoTable("demoTable")
 * 所以你自己取的别名不可以为demoTable
 * 如果涉及同一个表的多表查询,建议别名的规则根据业务名称来取,比如学生和教师都属于用户表
 * 那么可以如下取名
 * QUser qStudent = QUser.user;
 * QUser qTeacher = new QUser("qTeacher");
*/
QDemoTable qDemoTable2 = new QDemoTable("demoTable2");

List<Tuple> list = queryFactory.select(qDemoTable,qDemoTable2)
				.from(qDemoTable)
				.leftJoin(qDemoTable2)
				.on(qDemoTable.id.eq(qDemoTable2.pid))
				.where(qDemoTable.title.like("%杰夫%"))
				.fetch();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

提示

这个别名你可以理解成sql语句中的,as 关键字。但不全一样,因为实际SQL代码生成中,并不是这个名字。

因为每个QXxxYyy对象都有一个内置对象,所以如果你这个表在关联查询中只会使用一次,你可以不取别名,直接使用这个内置对象。

那么,回到正题,到底怎么生成这个QXxxYyy类呢?

其实你只需要执行:

mvn clean
mvn compile
1
2

如果你对IDEA较为熟悉,你应该知道可以直接在Maven视图窗口中直接点击执行mvn命令

警告

请务必执行clean,养成良好的习惯。

因为如果你删除了一个字段,如果不执行clean,QXxxYyy类是不会重新生成的。

这意味着,如果你的代码刚好使用了这个删除的字段,而你没有发现。并推送到了Git上。

当其他人从Git上获取你的代码后,编译时就会报错。

最后一次更新: 2021-6-2 16:28:35