一、pom.xml依赖引入

<!--1.数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--2.lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--3.mybatis-plus 版本很重要3.0.5-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--4.h2-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!--5.模板引擎 依赖:mybatis-plus代码生成的时候报异常-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!--6.配置ApiModel在实体类中不生效-->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>spring-boot-starter-swagger</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
<!--7.freemarker-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
<!--8.beetl-->
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>3.3.2.RELEASE</version>
</dependency>
<!--默认系统已经拥有以下两个依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

二、application.yml文件中的常用配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/else?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF8
    username: root
    password: 123
  profiles:
    active: dev
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true
//下面需要修改成当前项目包的路径
  mapper-locations: classpath:com/example/demo/mapper/xml/*.xml
  # 配置逻辑删除
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0

三、mybatisPlusconfig配置文件

//这里具体到mapper文件夹
@MapperScan("com.example.demo.mapper")
@EnableTransactionManagement
@Configuration
注意加上
public class MyBatisPlusConfig {
    // 注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
    // 逻辑删除组件!
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }
    //SQL执行效率插件
    @Bean
    @Profile({"dev","test"})// 设置 dev test 环境开启,保证我们的效率
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new
                PerformanceInterceptor();
        performanceInterceptor.setMaxTime(1000); // ms设置sql执行的最大时间,如果超过了则不执行
        performanceInterceptor.setFormat(true); // 是否格式化代码
        return performanceInterceptor;
    }
}

四、Handler处理器

处理时间字段的填充策略(数据库中的添加时间字段为gmt_create、修改时间字段为gmt_modified)。

@Slf4j
@Component // 一定不要忘记把处理器加到IOC容器中!
public class MyMetaObjectHandler implements MetaObjectHandler {
    // 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
// setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject
        this.setFieldValByName("gmtCreate",new Date(),metaObject);
        this.setFieldValByName("gmtModified",new Date(),metaObject);
    }
    // 更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("gmtModified",new Date(),metaObject);
    }
}

五、代码生成器

public class AutoClass {
    public static void main(String[] args) {
// 需要构建一个 代码自动生成器 对象
        AutoGenerator mpg = new AutoGenerator();
// 配置策略
// 1、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");// 不用改,表示获取当去用户
        gc.setOutputDir(projectPath+"/src/main/java");// 不用改,表示项目路径
        gc.setAuthor("高垚淼"); // 作者名
        gc.setOpen(false); // 创建后是否打开目录,没必要
        gc.setFileOverride(false); // 重名文件是否覆盖
        gc.setServiceName("%sService"); // 去Service的I前缀
        gc.setIdType(IdType.ID_WORKER); // 表示id的生成策略,默认是雪花算法
        gc.setDateType(DateType.ONLY_DATE); //表示时间默认采用date类型,秒级别以上转datetime不会存在精度丢失
        gc.setSwagger2(true);   // 开启后自动添加相关注解,方便生成API文档
        mpg.setGlobalConfig(gc); //设置以上配置作用于全局
//2、设置数据源
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/else?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123");
        dsc.setDbType(DbType.MYSQL); //根据不同数据库进行适配
        mpg.setDataSource(dsc);
//3、包的配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("demo"); // 设置在哪个项目名
        pc.setParent("com.example"); // 设置在那个com.公司名
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);
//4、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("stu","course","score","stu_course"); // 设置要映射的表名
        strategy.setNaming(NamingStrategy.underline_to_camel); //设置开启驼峰命名,将数据库中的表_转为java驼峰命名
        strategy.setColumnNaming(NamingStrategy.underline_to_camel); // 设置开启驼峰命名,将数据库表中的属性_转为java驼峰命名
        strategy.setEntityLombokModel(true); // 自动lombok;
        strategy.setLogicDeleteFieldName("deleted"); // 在逻辑删除属性上加注解
// 自动填充配置
        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT); // 设置自动填充时的策略
        TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreate);
        tableFills.add(gmtModified);
        strategy.setTableFillList(tableFills);
// 乐观锁
        strategy.setVersionFieldName("version"); // 在乐观锁属性上加注解
        strategy.setRestControllerStyle(true); // 设置返回实体,这里要注意,如果要后端返回excel表格,这里要false
        strategy.setControllerMappingHyphenStyle(true); //设置Controller的请求路径开启驼峰命名
        mpg.setStrategy(strategy);
        mpg.execute(); //执行
    }
}

六、通用Service

Service可以直接实现增删改查操作,不过底层依旧依靠Mapper,但是功能没有mapper多。常见service方法:

Save:
// 插入一条记录(选择字段,策略插入)
👍boolean save(T entity);
// 插入(批量)
👍boolean saveBatch(Collection<T> entityList);
Update :;
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereWrapper 条件,更新记录
👍boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根据 ID 选择修改
👍boolean updateById(T entity);
// 根据ID 批量更新
👍boolean updateBatchById(Collection<T> entityList);
SaveOrUpdate:
	// TableId 注解存在更新记录,否插入一条记录
👍boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
👍boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
👍boolean saveOrUpdateBatch(Collection<T> entityList)
Remove:
// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
👍boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
👍boolean removeByIds(Collection<? extends Serializable> idList);
单查询Get:
// 根据 ID 查询
👍T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
👍T getOne(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);
多查询List:
// 查询所有
👍List<T> list(null);
// 查询列表
👍List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper); 
Count :
// 查询总记录数
👍count(null);
// 根据 Wrapper 条件,查询总记录数
👍int count(Wrapper<T> queryWrapper)

七、状态类R

MybatisPlus提供了类似自定义的responseEntity。

return R.ok(666).setCode(200).setMsg("success");
return R.failed("400").setCode(400).setData(666);