日常开发过程中,经常需要快速生成一些简易代码,该工具使用 FreeMarker 和 Mybatis Generator 实现,可以通过表名自动生成 Model、Mapper、Service、Controller,另外还集成了通用Mapper(tk.mybatis),除了一些特殊的业务逻辑之外不需要写任何 SQL,只需要写好实体类及 Mapper 文件中对应的字段即可支持相应的增删改查方法,大大提高了开发效率。
- 生成实体类,集成 Lombok 插件,实体类包含表注释
- 生成 Mapper.xml文件,仅包含 BaseResultMap 的字段映射
- 生成 Dao 层的 Mapper 接口类,并集成了 通用 mapper(tk.mybatis),简化开发,代码简洁
- 生成 Service 接口和实现类,基础接口抽象
- 生成 Controller 类,基础接口抽象
Github仓库地址:code-generator
1. 项目结构图
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─best
│ │ │ │ CodeGeneratorApplication.java
│ │ │ ├─common
│ │ │ │ ├─controller
│ │ │ │ │ AbstractController.java
│ │ │ │ │ PostController.java
│ │ │ │ ├─mapper
│ │ │ │ │ CrudMapper.java
│ │ │ │ └─service
│ │ │ │ AbstractService.java
│ │ │ │ Service.java
│ │ │ ├─controller
│ │ │ │ UserController.java
│ │ │ ├─dao
│ │ │ │ UserMapper.java
│ │ │ ├─entity
│ │ │ │ User.java
│ │ │ └─service
│ │ │ │ UserService.java
│ │ │ │
│ │ │ └─impl
│ │ │ UserServiceImpl.java
│ │ └─resources
│ │ application.yml
│ └─test
│ ├─java
│ │ └─com
│ │ └─best
│ │ CodeGenerator.java
│ │ CommentPlugin.java
│ │ GeneratorConstant.java
│ │ LombokPlugin.java
│ │ MapperPlugin.java
│ │
│ └─resources
│ └─template
│ controller.ftl
│ service-impl.ftl
│ service.ftl
项目简介
1.maven依赖
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.4
org.springframework.boot
spring-boot-starter-web
tk.mybatis
mapper-spring-boot-starter
1.2.4
org.projectlombok
lombok
1.18.18
org.mybatis.generator
mybatis-generator-core
1.3.5
org.freemarker
freemarker
2.3.28
mysql
mysql-connector-java
8.0.22
com.alibaba
druid-spring-boot-starter
1.2.5
2.通用Mapper
/**
* 基础增删改查通用mapper,包含基础增删改查功能、根据id批量查询、批量插入等功能。
* 如需其它接口参考官方文档自行添加
*
* @author: JavaBest
* @date: 2021/4/17 19:00
*/
public interface CrudMapper extends BaseMapper,
ConditionMapper,
IdsMapper,
InsertListMapper {
}
3.通用Service
public class AbstractService implements Service {
@Resource
protected CrudMapper crudMapper;
private Class modelClass;
@SuppressWarnings("unchecked")
public AbstractService() {
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
modelClass = (Class) pt.getActualTypeArguments()[0];
}
@Override
public int save(T record) {
return crudMapper.insertSelective(record);
}
@Override
public int deleteById(Long id) {
return crudMapper.deleteByPrimaryKey(id);
}
@Override
public int update(T record) {
return crudMapper.updateByPrimaryKeySelective(record);
}
@Override
public List findByCondition(Condition condition) {
return crudMapper.selectByCondition(condition);
}
......
}
4.通用Controller
public class AbstractController implements PostController {
@Resource
private AbstractService service;
@Override
@PostMapping("add")
public int add(@RequestBody T record) {
return service.save(record);
}
@Override
@PostMapping("delete")
public int delete(@RequestParam Long id) {
return service.deleteById(id);
}
@Override
@PostMapping("update")
public int update(@RequestBody T record) {
return service.update(record);
}
@Override
@PostMapping("findById")
public T findById(@RequestParam Long id) {
return (T) service.findById(id);
}
@Override
@PostMapping("list")
public PageInfo list(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "100") Integer size) {
PageHelper.startPage(page, size);
List recordList = service.findAll();
return new PageInfo<>(recordList);
}
}
5.业务代码
public class User implements Serializable {
/**
* 编号
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String gender;
/**
* 地址
*/
private String address;
private static final long serialVersionUID = 1L;
}
@Service
public class UserServiceImpl extends AbstractService implements UserService {
/**
* 日志服务
*/
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
/**
* mapper
*/
@Resource
private UserMapper userMapper;
}
@RestController
@RequestMapping("user")
public class UserController extends AbstractController {
}
6.测试结果
http://localhost:8080/user/findById?id=1
{
"id": 1,
"name": "杜子腾",
"gender": "男",
"address": "五道口"
}
可以看出,业务层几乎不需要写任何代码,代码生成工具都会帮助生成好,只需要写其它逻辑即可。
关注公众号【JavaBest】获取更多精彩内容