大神带你玩转后端开发神器MybatisPlus——一篇文章精通MybatisPlus的使用,高效开发Java后端,节省编写sql的时间,分页,自动生成代码工具详解等

本文详细介绍了MybatisPlus,一个Mybatis的增强工具,帮助开发者快速进行Java后端开发。文章涵盖了MybatisPlus的特性、支持的数据库、依赖引入、数据库配置、单元测试、BaseMapper接口、常用注解、分页插件、乐观锁、逻辑删除以及代码生成工具的使用。通过对QueryWrapper核心API的解析,展示了如何进行各种查询、更新和删除操作,助力提升开发效率。
摘要由CSDN通过智能技术生成

文章目录

一、什么是MybatisPlus?

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

二、MybatisPlus有什么特性?

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

三、支持的数据库?

任何能使用 mybatis 进行 crud, 并且支持标准 sql 的数据库

四、引入maven依赖

 		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
		<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>

五、配置数据库

server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/数据库名称?useUnicode=true&characterEncoding=utf-8&userSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=****

5.1 dao层接口的实现(继承BaseMapper<对象>)

@Repository
public interface BannerMapper extends BaseMapper<BannerDO> {
}

5.2 ServiceImpl层的实现

@Service
public class BannerServiceImpl implements BannerService {
    @Autowired
    private BannerMapper bannerMapper;
    @Override
    public List<BannerDO> list() {
        return bannerMapper.selectList(new QueryWrapper<>());
    }
}

5.2 Controller层的实现

@RestController
@RequestMapping("api/v1/banner")
public class BannerController {

    @Autowired
    private BannerService bannerService;

    @RequestMapping("list")
    public JsonData list(){
        List<BannerDO> list = bannerService.list();
        return JsonData.buildSuccess(list);
    }

}

5.3 测试接口 /api/v1/banner/list

在这里插入图片描述

六、单元测试@Test的使用

6.1 编写测试类,结合@Slf4j日志使用

@SpringBootTest
@Slf4j
public class BannerTest {

    @Autowired
    private BannerService bannerService;

    @Test
    public void testBannerList(){
        List<BannerDO> list = bannerService.list();
        log.info("轮播图列表:{}",list);
    }

}

6.2 查看控制台是否打印

在这里插入图片描述

6.3 控制台打印日志

6.3.1 添加配置

# 控制台打印日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

6.3.2 同样执行测试方法,会发现多出来SQL日志

在这里插入图片描述

七、BaseMapper接口的剖析

7.1 源码剖析

/**
 * Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
 * <p>这个 Mapper 支持 id 泛型</p>
 *
 * @author hubin
 * @since 2016-01-23
 */
public interface BaseMapper<T> extends Mapper<T> {

    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     */
    int insert(T entity);

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     */
    int deleteById(Serializable id);

    /**
     * 根据 columnMap 条件,删除记录
     *
     * @param columnMap 表字段 map 对象
     */
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * 根据 entity 条件,删除记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 删除(根据ID 批量删除)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     */
    int updateById(@Param(Constants.ENTITY) T entity);

    /**
     * 根据 whereEntity 条件,更新记录
     *
     * @param entity        实体对象 (set 条件值,可以为 null)
     * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    T selectById(Serializable id);

    /**
     * 查询(根据ID 批量查询)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

    /**
     * 查询(根据 columnMap 条件)
     *
     * @param columnMap 表字段 map 对象
     */
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * 根据 entity 条件,查询一条记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询总记录数
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录
     * <p>注意: 只返回第一个字段的值</p>
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件,查询全部记录(并翻页)
     *
     * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录(并翻页)
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类
     */
    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

7.2 QueryWrapper介绍

查询包装类,可以封装多数查询条件,泛型指定返回的实体类
List list = bannerMapper.selectList(new QueryWrapper());

7.3 根据上述API进行查询

7.3.1 根据ID查询 selectById

  @Test
    public void testSelectBannerById(){
        BannerDO bannerDO = bannerMapper.selectById(1);
        log.info("bannerDO:{}",bannerDO);
    }

在这里插入图片描述

7.3.2 根据多个ID查询 selectBatchIds

   @Test
    public void testSelectBatchIds(){
        List<BannerDO> bannerDOS = bannerMapper.selectBatchIds(Arrays.asList(1, 2));
        log.info("bannerDOs:{}",bannerDOS);
    }

在这里插入图片描述

7.3.3 根据某字段查询 selectOne

支持链式调用,就是可以一直.eq().eq().eq()…

   @Test
    public void testSelectOne(){
        BannerDO bannerDO = bannerMapper.selectOne(new QueryWrapper<BannerDO>().eq("id", 1));
        log.info("bannerDO:{}",bannerDO);
    }

在这里插入图片描述

7.3.4 查询结果条数 selectCount

   @Test
    public void testSelectCount(){
        Integer integer = bannerMapper.selectCount(new QueryWrapper<BannerDO>());
        log.info("bannerDONumber:{}",integer);
    }

在这里插入图片描述

7.3.5 查询全部 selectList (不多说了,自己试试吧)

八、MybatisPlus常用注解

8.1 @Table 注解

@TableName(“banner”) //表名映射,指明Java类对应着数据库中的哪个表

8.2 @TableId 注解

@TableId(value = “id”,type = IdType.AUTO) //主键映射,指明数据库中主键名称以及类型,具体类型如下:

  1. IdType.AUTO 主键自增,系统分配,不需要手动输入
  2. IdType.NONE 未设置主键
  3. IdType.INPUT 需要自己输入 主键值
  4. IdType.ASSIGN_ID 系统分配 ID,用于数值型数据(Long,对应 mysql 中 BIGINT 类型)
  5. IdType.ASSIGN_UUID 系统分配 UUID,用于字符串型数据(String,对应 mysql 中 varchar(32) 类型)

8.2.1 测试添加方法,会自动返回自增的Id

@Test
public void testInsertBanner(){
    BannerDO bannerDO = new BannerDO();
    bannerDO.setImg("imgxxxxxxxxxx");
    bannerDO.setUrl("urlxxxxxxxxxx");
    bannerMapper.insert(bannerDO);
    log.info("bannerDO:{}",bannerDO);
}

8.2.2 测试结果

在这里插入图片描述
在这里插入图片描述

8.3 @TableField 注解

8.3.1 @TableField 属性解析

  1. value 用于定义非主键字段名,用于别名匹配,假如java对象属性和数据库属性不一样
  2. exist 用于指明是否为数据表的字段, true 表示是,false 为不是,假如某个java属性在数据库没对应的字段则要标记为faslse
  3. fill 用于指定字段填充策略(FieldFill,用的不多)
    字段填充策略:一般用于填充 创建时间、修改时间等字段
    FieldFill.DEFAULT 默认不填充
    FieldFill.INSERT 插入时填充
    FieldFill.UPDATE 更新时填充
    FieldFill.INSERT_UPDATE 插入、更新时填充。
8.3.1.1 value 属性解析

数据库中有这个字段,Java类中也有,但是名字如果不一样的话,那么就需要指定value属性为数据库中的字段。
例如,Java类中的字段是imgUrl,数据库中的字段是img,就需要加value属性,值为img

    @TableField(value = "img")
    private String imgUrl;

仍然可以查询到,使用了as给参数起别名为Java类中的属性名
在这里插入图片描述

8.3.1.2 exist 属性解析

如果Java类中属性在数据库中不存在,那么会报错,否则需要指定exist属性为false来说明该属性不属于数据库字段。
例如,在实体类中添加数据库中不存在的字段private Date date;然后查询任意一个,会发现报错找不到该属性
在这里插入图片描述
现在加上注解,再次查询,会发现Sql语句中没有那个属性了:

@TableField(exist = false)
    private Date date;

在这里插入图片描述

九、使用MybatisPlus进行删除操作

9.1 根据ID删除(简单,不测试了)

	@Test
    public void testDeleteId(){
       int rows = bannerMapper.deleteById(4);
       log.info("rows:{}",rows);
    }

9.2 根据map条件删除

   @Test
   public void testDeleteByMap(){
       Map<String,Object> map = new HashMap<>();
       map.put("img","aa");
       map.put("url","bb");
       int i = bannerMapper.deleteByMap(map);
       log.info("row:{}",i);
   }

测试结果:(注意:这里将map中的条件用and连接起来
在这里插入图片描述

十、使用MybatisPlus进行更新操作

可以看到update只有两个方法,下面分别介绍两个方法:
在这里插入图片描述

10.1 update()方法解析

10.1.1 使用QueryWrapper->只有一个eq()测试

    @Test
    public void testUpdate(){
        BannerDO banner = new BannerDO();
        banner.setUrl("www.baidu.com");
        int id = bannerMapper.update(banner, new QueryWrapper<BannerDO>().eq("id", 6));
        log.info("更新{}条数据",id);
    }

测试结果:(可以发现,eq()里的数据都添加到了where语句中了)
在这里插入图片描述

10.1.2 使用QueryWrapper->多个eq()测试

    @Test
    public void testUpdate(){
        BannerDO banner = new BannerDO();
        banner.setUrl("www.baidu.com");
        int id = bannerMapper.update(banner, new QueryWrapper<BannerDO>().eq("id", 6).eq("weight",8));
        log.info("更新{}条数据",id);
    }

测试结果:(可以发现,eq()里的数据都添加到了where语句中了,且多个eq里的参数用and连接起来了)
在这里插入图片描述

10.1.3 使用QueryWrapper->进行update测试

   @Test
    public void testupdateWrapper(){
        UpdateWrapper<BannerDO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("url","zfhvip.top");
        updateWrapper.set("weight",19);
        updateWrapper.eq("id",6);
        int id = bannerMapper.update(null,updateWrapper);
        log.info("更新{}条数据",id);
    }

测试结果:
在这里插入图片描述

10.2 updateById()方法解析

太简单了,自己试试吧,参数是对象类型。

十一、QueryWrapper核心API

太多了,自己看看咋用就行了,

11.1 eq 等于

11.2 ne 不等于

11.3 gt 大于

11.4 ge 大于等于

11.5 lt 小于

11.6 le 小于等于

11.7 or 拼接or (这个需要讲一下怎么用)

 @Test
    public void testQueryWrapper(){
       QueryWrapper<BannerDO> queryWrapper = new QueryWrapper<>();
       queryWrapper.eq("id",6);
       queryWrapper.or();
       queryWrapper.ne("img","13123");
       BannerDO bannerDO = bannerMapper.selectOne(queryWrapper);
       log.info("banner:{}",bannerDO);
    }

在这里插入图片描述

11.8 between 两个值中间

  @Test
    public void testQueryWrapper(){
       QueryWrapper<BannerDO> queryWrapper = new QueryWrapper<>();
       queryWrapper.between("weight",18,20);
       BannerDO bannerDO = bannerMapper.selectOne(queryWrapper);
       log.info("banner:{}",bannerDO);
    }

在这里插入图片描述

11.9 notBetween 不在两个值中间

11.10 like 模糊匹配

11.11 notLike 不像

11.12 likeLeft 左匹配

11.13 likeRight 右边匹配

11.14 isNull 字段为空

11.115 in in查询

11.16 groupBy 分组

11.17 orderByAsc 升序

11.18 orderByDesc 降序

11.19 having having查询

十二、MybatisPlus分页插件的使用

12.1 测试代码

    @Test
    public void testPage(){
        Page<BannerDO> page = new Page<>(1,3);
        IPage<BannerDO> iPage =  bannerMapper.selectPage(page, null);
        log.info("总条数:{}",iPage.getTotal());
        log.info("总页数:{}",iPage.getPages());
        log.info("总数据:{}",iPage.getRecords());
    }

12.2 测试结果

在这里插入图片描述

十三、自定义Mybatis plus全局配置文件mybatis-config.xml

《《《《 二者不能共存 》》》》

13.1 如何引入xml全部配置文件

#配置最新全局配置文件
mybatis-plus.config-location = classpath:mybatis-config.xml

13.2 xml配置sql日志打印和配置文件配置sql日志打印

       <!-- xml配置控制台输出日志-->
       <settings>
            <setting name="logImpl" value="STDOUT_LOGGING"/>
       </settings>

# 配置文件控制台打印日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

13.3 自定义sql的包扫描返回类型对象

		<typeAliases>
            <package name="**.**.**.**.model"/>
        </typeAliases>
        
# mybatis类型映射
mybatis-plus.type-aliases-package=net.xdclass.shopmanager.model

13.4 mybatis plus下划线转驼峰配置(默认就是true)

	<settings>
        <!-- 是否开启自动驼峰命名规则(camel case)映射,即从数据库列名 A_COLUMN 到属性名 aColumn 的类似映射 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
# 下划线转驼峰
mybatis-plus.configuration.map-underscore-to-camel-case=true

13.5 配置全局默认主键类型,实体类就不用加 @TableId(value = “id”, type = IdType.AUTO)

# 配置全局默认主键类型
mybatis-plus.global-config.db-config.id-type=auto

十四、MybatisPlus中select与select *

14.1 select 比 select * 性能更高,为什么?

网络IO问题
select * 会查出所有的字段,有些是不需要的,当应用程序和服务器不在同一个局域网时,字段过多会影响网络传输的性能
索引问题
在 指定字段有索引的情况下,mysql是可以不用读data,直接使用index里面的值就返回结果的。
但是一旦用了select *,就会有其他列需要从磁盘中读取才会返回结果,这样就造成了额外的性能开销

14.2 MybatisPlus中如何指定字段查询?

    @Test
    public void testPage(){
       QueryWrapper<BannerDO> queryWrapper = new QueryWrapper<>();
        Page<BannerDO> page = new Page<>(1,3);
        IPage<BannerDO> iPage =  bannerMapper.selectPage(page, queryWrapper.select("id,img"));
        log.info("总条数:{}",iPage.getTotal());
        log.info("总页数:{}",iPage.getPages());
        log.info("总数据:{}",iPage.getRecords());
    }

在这里插入图片描述

十五、什么是ActiveRecord?

Active Record(活动记录):是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
使用方法:仅需要实体类继承Model类即可
测试代码

  @Test
    public void testActiveRecord(){
       BannerDO bannerDO = new BannerDO();
        List<BannerDO> bannerDOS = bannerDO.selectList(new QueryWrapper<>());
        log.info("数据:{}",bannerDOS);
    }

在这里插入图片描述
使用建议:

  1. 业务逻辑比较简单,当类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的, 即业务逻辑大多数是对单表操作,简单,直观 一个类就包括了数据访问和业务逻辑.

  2. ActiveRecord虽然有业务逻辑, 但基本上都是基于单表的. 跨表逻辑一般会放到当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script)中.

  3. 如果对象间的关联越来越多, 你的事务脚本越来越庞大, 重复的代码越来越多, 就不建议使用了

  4. 模型容易混乱,ActiveRecord保存了数据, 使它有时候看上去像数据传输对象(DTO). 但是ActiveRecord有数据库访问能力, 所以所以分布式或者大型项目基本不用

十六、MybatisPlus遇上乐观锁

16.1 什么是乐观锁?

  1. 每次去拿数据的时候都认为别人不会修改,更新的时候会判断是别人是否回去更新数据,通过版本来判断,如果数据被修改了就拒绝更新.
  2. Java里面大量使用CAS, CAS这个是属于乐观锁,性能较悲观锁有很大的提高
  3. AtomicXXX 等原子类底层就是CAS实现,一定程度比synchonized好,因为后者是悲观锁
    小结:悲观锁适合写操作多的场景,乐观锁适合读操作多的场景,乐观锁的吞吐量会比悲观锁多

16.2 怎么使用乐观锁

16.2.1 在实体类加字段version和注解@Version(数据库也加)

@Version
private Integer version;

16.2.2 添加乐观锁插件(和上边讲的分页插件一个位置)

//乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

16.2.3 测试代码编写

  @Test
    public void testOptimisticLocker(){
       BannerDO bannerDO = new BannerDO();
       bannerDO.setId(1);
       bannerDO.setUrl("test.com");
       bannerDO.setVersion(1);
       bannerMapper.updateById(bannerDO);
    }

16.2.4 测试结果分析

读到的version是1,更新后加1.
在这里插入图片描述

16.2.5 乐观锁使用注意点

乐观锁数据类型支持int、integer、long、timestamp
仅支持updateById和update方法

十七、MybatisPlus 逻辑删除配置

17.1 什么是逻辑删除?

很多互联网公司在数据库设计规范中都加入了逻辑删除的强制规定,运营人员可以分析和审查数据,也方便将数据沉淀下来用于商业分析

比如用户删除了订单,只不过是更新了标记,不会真正的物理删除。

17.2 如何配置

数据库增加deleted字段,0是未删除,1表示删除

17.2.1 在实体类添加配置

实体类增加属性配置@TableLogic

17.2.2 在配置文件配置

#删除是1
mybatis-plus.global-config.db-config.logic-delete-value=1
#未删除是0
mybatis-plus.global-config.db-config.logic-not-delete-value=0
#如果java实体类没加注解@TableLogic,则可以配置这个,推荐这里配置
mybatis-plus.global-config.db-config.logic-delete-field=deleted

17.3 测试

  @Test
    public void testDeleteById(){
       bannerMapper.deleteById(6);
    }

可以发现,代码不是delete了,而是update
在这里插入图片描述

17.3 既然是逻辑删除,那么删除之后查询的时候会怎么样呢?

随便执行一条查询语句,可以发现增加了deleted字段的验证:
在这里插入图片描述

十八、代码自动生成工具

添加依赖

    <!-- 代码自动生成依赖 begin -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- velocity -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>
        <!-- 代码自动生成依赖 end-->

新建自动创建类(标记TODO的需要修改)

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
public class MyBatisPlusGenerator {

    public static void main(String[] args) {
        //1. 全局配置
        GlobalConfig config = new GlobalConfig();
        // 是否支持AR模式
        config.setActiveRecord(true)
                // 作者
                .setAuthor("zfh")
                // 生成路径,最好使用绝对路径,window路径是不一样的
                //TODO  TODO  TODO  TODO
                .setOutputDir("/**/**/**/**/***")
                // 文件覆盖
                .setFileOverride(true)
                // 主键策略
                .setIdType(IdType.AUTO)

                .setDateType(DateType.ONLY_DATE)
                // 设置生成的service接口的名字的首字母是否为I,默认Service是以I开头的
                .setServiceName("%sService")

                //实体类结尾名称
                .setEntityName("%sDO")

                //生成基本的resultMap
                .setBaseResultMap(true)

                //不使用AR模式
                .setActiveRecord(false)

                //生成基本的SQL片段
                .setBaseColumnList(true);

        //2. 数据源配置
        DataSourceConfig dsConfig = new DataSourceConfig();
        // 设置数据库类型
        dsConfig.setDbType(DbType.MYSQL)
                .setDriverName("com.mysql.cj.jdbc.Driver")
                //TODO  TODO  TODO  TODO
                .setUrl("jdbc:mysql://127.0.0.1:3306/****?useSSL=false")
                .setUsername("root")
                .setPassword("root");

        //3. 策略配置globalConfiguration中
        StrategyConfig stConfig = new StrategyConfig();

        //全局大写命名
        stConfig.setCapitalMode(true)
                // 数据库表映射到实体的命名策略
                .setNaming(NamingStrategy.underline_to_camel)

                //使用lombok
                .setEntityLombokModel(true)

                //使用restcontroller注解
                .setRestControllerStyle(true)

                // 生成的表, 支持多表一起生成,以数组形式填写
                //TODO  TODO  TODO  TODO
                .setInclude("product","product_task","banner");
 

        //4. 包名策略配置
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent("net.xdclass")
                .setMapper("mapper")
                .setService("service")
                .setController("controller")
                .setEntity("model")
                .setXml("mapper");

        //5. 整合配置
        AutoGenerator ag = new AutoGenerator();
        ag.setGlobalConfig(config)
                .setDataSource(dsConfig)
                .setStrategy(stConfig)
                .setPackageInfo(pkConfig);

        //6. 执行操作
        ag.execute();
        System.out.println("======= 相关代码生成完毕  ========");
    }
 
}

十九、MybatisPlus总结

优点

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

缺点

项目映入了第三方包,未来升级存在一定的兼容性问题

社区相对新生-文档缺乏相关的信息, 或者更新不及时

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java天下第1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值