日常开发过程中,经常需要快速生成一些简易代码,该工具使用 FreeMarker 和 Mybatis Generator 实现,可以通过表名自动生成 Model、Mapper、Service、Controller,另外还集成了通用Mapper(tk.mybatis),除了一些特殊的业务逻辑之外不需要写任何 SQL,只需要写好实体类及 Mapper 文件中对应的字段即可支持相应的增删改查方法,大大提高了开发效率。
• 生成实体类,集成 Lombok 插件,实体类包含表注释
• 生成 Mapper.xml文件,仅包含 BaseResultMap 的字段映射
• 生成 Dao 层的 Mapper 接口类,并集成了 通用 mapper(tk.mybatis),简化开发,代码简洁
• 生成 Service 接口和实现类,基础接口抽象
• 生成 Controller 类,基础接口抽象
Github仓库地址:https://github.com/JavaBest1/...
1. 项目结构图
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─best
│ │ │ │ CodeGeneratorApplication.java
│ │ │ ├─common
│ │ │ │ ├─controller
│ │ │ │ │ AbstractController.java
│ │ │ │ ├─mapper
│ │ │ │ │ CrudMapper.java
│ │ │ │ └─service
│ │ │ │ AbstractService.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
│ └─resources
│ └─template
│ controller.ftl
│ service-impl.ftl
│ service.ftl
项目简介
- maven依赖
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.4</version>
</dependency>
<!-- mybatis Generator -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<!-- mysql jdbc驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!-- druid 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
2.通用Mapper
/**
* 基础增删改查通用mapper,包含基础增删改查功能、根据id批量查询、批量插入等功能。
* 如需其它接口参考官方文档自行添加
*
* @author: JavaBest
* @date: 2021/4/17 19:00
*/
public interface CrudMapper<T> extends BaseMapper<T>,
ConditionMapper<T>,
IdsMapper<T>,
InsertListMapper<T> {
}
3.通用Service
public class AbstractService<T> implements Service<T> {
@Resource
protected CrudMapper<T> crudMapper;
private Class<T> modelClass;
@SuppressWarnings("unchecked")
public AbstractService() {
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
modelClass = (Class<T>) 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<T> findByCondition(Condition condition) {
return crudMapper.selectByCondition(condition);
}
......
}
4.通用Controller
public class AbstractController<T> implements PostController<T> {
@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<T> list(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "100") Integer size) {
PageHelper.startPage(page, size);
List<T> 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<User> implements UserService {
/**
* 日志服务
*/
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
/**
* mapper
*/
@Resource
private UserMapper userMapper;
}
@RestController
@RequestMapping("user")
public class UserController extends AbstractController<User> {
}
6.测试结果
http://localhost:8080/user/findById?id=1
{
"id": 1,
"name": "杜子腾",
"gender": "男",
"address": "五道口"
}
可以看出,业务层几乎不需要写任何代码,代码生成工具都会帮助生成好,只需要写其它逻辑即可。
关注公众号【JavaBest】获取更多精彩内容
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。