乐趣区

关于java:使用FreeMarker和Mybatis-Generator实现的代码生成工具

日常开发过程中,常常须要疾速生成一些繁难代码,该工具应用 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
│ │ │ │ ├─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

我的项目简介

  1. 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】获取更多精彩内容

退出移动版