这里用一个简单的案例,描述了如何开发一个模块。
通过如下途径了解需求
设计非常非常重要,如果设计做好了,能省下 30%的工作量。 那什么样的设计能达到设计标准呢?
示例
DROP TABLE IF EXISTS wk_student;create table wk_student (student_id BIGINT unsigned NOT NULL AUTO_INCREMENT COMMENT '学生id',student_name varchar(255) NOT NULL COMMENT '学生姓名',student_age int COMMENT '学生年龄',student_sex int COMMENT '学生性别',gmt_create DATETIME DEFAULT CURRENT_TIMESTAMP NULL COMMENT '记录创建时间',gmt_modified DATETIME DEFAULT CURRENT_TIMESTAMP NULL COMMENT '记录修改时间',PRIMARY KEY (student_id),UNIQUE KEY `wk_student_unique` (`student_name`)) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8mb4 COMMENT='学生表';
先在一个测试库上测试一下是否有语法错误。
如果在项目中使用了 flyway 的版本控制,那么还要麻烦一点。文件需要放在 db/migration 目录下
V1__Create_student_table.sql
build
,在代码中有自带的单元测试脚本,如果通过就表示脚本没有问题。在plugin
中修改config.properties
,然后执行genCodes
来生成代码,生成的代码放在/log
中
生成的代码有:model、dao、service、controller、test,可以只用一部分,也可以全用。
尽量不要修改自动生成的代码
只能手工写了
public List<Map> selectUser(){String sql="select * from user where userid=123";return selectMapper.select(sql);}
SelectStatementProvider selectStatement = select(orderMaster.orderId, orderDate, orderDetail.lineNumber, orderDetail.description, orderDetail.quantity).from(orderMaster, "om").join(orderDetail, "od").on(orderMaster.orderId, equalTo(orderDetail.orderId)).build().render(RenderingStrategies.MYBATIS3);
Mybatis 最基本的写法,下面是一个例子
@Mapperpublic interface AreaDao extends AreaMapper {/*** 输入where条件,返回一个对象List* @param whereClause where 条件* @return List<Area>*/@Select({"select * ","from ec_area","${whereClauseProvider.whereClause}"," ${orderBy} "})@ResultMap("AreaResult")List<Area> selectByWhere(@Param("whereClauseProvider")WhereClauseProvider whereClause,@Param("orderBy") String orderBy);}
Mybatis 推出新的方法,效率提高了很多,就像写 Sql 语句一样,在 Java 中自由撰写。
代码生成器生成了基本的添加、删除、查询,还可以在这个基础进行灵活编码。
private boolean checkRoleIds(Integer[] roleIds){Long ren = roleDao.count(c-> c.where(roleId,isIn(roleIds)));if(roleIds.length>0 && ren.intValue()==roleIds.length){return true;}throw new BusinessException("角色编号在数据库中没有找到:"+ Arrays.toString(roleIds));}
为了提高系统效率,使用了数据库读写分离,系统中会对应多个 mysql 数据库。这样就要求分布式主键生成器。
下面的代码,就可以得到一个雪花
分布式主键
Long snowId=IdUtil.getSnowId();
可以在配置文件中配置,当更新一条记录时,会自动将更新时间记录到相应的字段中。
例如:gmt_modified
wukong:auto-fill-date-column:enabled: truecolumns: gmt_modified,gmt_test
根据前台参数,自动拼接 Sql。
前台一般会有这样的查询界面,按照一定规则,能动态形成查询的 Sql 语句。例子见:DynamicSqlController
正常情况下,Mybatis 撰写 Sql 操作,要实现 Model,Mapper 操作,这里提供了一个通用 Mapper: selectMapper
大大极化了 Sql 操作,只用写 Sql 语句就可以了,就可以把结果传递给前台。
@RequestMapping("/selectUser")public List<Map> selectUser(){String sql="select * from user where userid=123";return selectMapper.select(sql);}
使用SqlSafeUtil
类就可以。
集成了 JWT 安全框架。可以直接使用。
登陆、注册、分配权限、删除用户等基本功能。
有些路径不需要权限认证,可以通过配置文件来配置。
静态代码检查在build/reports/spotbugs
不写测试脚本的程序员不是好程序员。Junit 使用可以看这里
使用了 spring doc 来输出文档。
commit 代码,并且 push 到服务器上。
对于比较复杂的代码,使用stopBug
进行代码检查。