Mybatis Plus代码自动生成工具类与Service,Mapper层写法规范

352 阅读3分钟

MyBatis-plus官网
baomidou.com/

其他文章

blog.csdn.net/weixin_3255…

www.jianshu.com/p/ceb1df475…

使用自动生成器先引入依赖

使用自动生成器先引入依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.1.tmp</version>
</dependency>
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.0</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.6.1</version>
</dependency>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.6.1</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.20</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1.tmp</version>
</dependency>

现在有好几个依赖是关于mybatis-plus的可以选择mybatisplus-boot-start这个依赖就可以很全 在建立好数据库后,我们可以使用Mybatis Plus提供的自动代码生成器,将其写成一个工具类,当有表新增时,可以及时调用该工具类生成

public class GenerateTableUtil {
    public static void generate(String parent,String moduleName,String ...table){

        AutoGenerator mpg = new AutoGenerator();

        // 1.全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        System.out.println(projectPath);
        // 输出目录
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("zhou");
        gc.setServiceName("%sService");
        gc.setFileOverride(true);
        gc.setOpen(false);
//        gc.setServiceName("%Service");
        gc.setSwagger2(true);  //实体属性 Swagger2 注解
        mpg.setGlobalConfig(gc);

        // 2.设置数据源
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUsername("root");
        dsc.setPassword("david1");
        dsc.setUrl("jdbc:mysql://49.235.45.85:3306/db1?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 3. 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(moduleName);
        pc.setParent(parent);
        pc.setEntity("entiry");
        pc.setController("controller");
        pc.setService("service");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 4.策略设置
        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 重点,设置映射的表名
        strategy.setInclude(table);
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
//        // 设置逻辑删除字段
//        strategy.setLogicDeleteFieldName("deleted");
//        // 自动填充字段
//        TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
//        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
//        strategy.setTableFillList(List.of(createTime,updateTime));
//        // 乐观锁字段
//        strategy.setVersionFieldName("version");
//        strategy.setRestControllerStyle(true); // Controller用rest风格
//        strategy.setControllerMappingHyphenStyle(true);
//        strategy.setRestControllerStyle(true); // Controller用rest风格
//        strategy.setControllerMappingHyphenStyle(true);

        mpg.setStrategy(strategy);

        mpg.execute();

    }

}

工具类生成后,可以获得如下的目录,但是怎么编写Service类是一个问题,下面给出一个方案

在Service层的接口写出需要使用的方法 `public interface DepartmentService extends IService {

void addDepartment(Department department);

void deleteDepartmentById(int id);

void updateDepartmentById(Department department);

Department selectDepartmentById(int id);

}`

之后使用其应用Impl类重写这些方法,我们可以使用Mybatis Plus提供的baseMapper使用Mybatis Plus提供的方法 `@Service public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Department> implements DepartmentService {

@Override
public void addDepartment(Department department) {
    baseMapper.insert(department);
}

@Override
public void deleteDepartmentById(int id) {
    baseMapper.deleteById(id);
}

@Override
public void updateDepartmentById(Department department) {
    baseMapper.updateById(department);
}

@Override
public Department selectDepartmentById(int id) {
    return baseMapper.selectById(id);
}

}`

在需要的地方进行注入

class RedisDemoApplicationTests {

    @Autowired
    DepartmentServiceImpl departmentService;

    @Test
    void contextLoads() throws JsonProcessingException {
        departmentService.addDepartment(new Department(4,"LOL游戏部"));
        departmentService.deleteDepartmentById(4);
        departmentService.updateDepartmentById(new Department(3,"产品部"));
    }
    }
    

持久层

@Mapper
public interface AdminMapper extends BaseMapper<Admins> {

}

  • 使用MyBatis-plus 只需要继承BaseMapper
  • T 泛型需要制定要操作的实体类

只需要继承了BaseMapper接口就可以使用它提供的方法

MyBatis-plus 的BaseMapper接口内声明的方法
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.baomidou.mybatisplus.core.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;

public interface BaseMapper<T> extends Mapper<T> {

    int insert(T entity);

    int deleteById(Serializable id);

    int deleteByMap(@Param("cm") Map<String, Object> columnMap);

    int delete(@Param("ew") Wrapper<T> wrapper);

    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    int updateById(@Param("et") T entity);

    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

    T selectById(Serializable id);

    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);

    T selectOne(@Param("ew") Wrapper<T> queryWrapper);

    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);

    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);

    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);

    <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);

    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}

  • 使用MyBaits-plus时需要注意的点:
/**
 * 默认使用实体类中的名字去数据库中找同名的表,如果没有,需要指定
 */
@TableName(value = "admins")
public class Admins {
    /**
     * 指定数据库中对应表的主键,如果数据库中的主键名称和实体类中的id不同,需要制定
     */
    @TableId(value = "id", type = IdType.AUTO)
    private int id;
    private String username;
    private String password;

	/**
	 * 默认会将驼峰式命名转化为下划线
	 * 但有时候命名不同,可以使用该注解指定给字段对应的数据库中的字段
	 */
     @TableField(value = "head_photo")
    private String headphoto;
    private String isenable;
    private String phone;
    private String email;
    private String address;
    private String createTime;
    private String position;
    //省略get set 方法
	...
}