文章目录
- 一、什么是MybatisPlus?
- 二、MybatisPlus有什么特性?
- 三、支持的数据库?
- 四、引入maven依赖
- 五、配置数据库
- 六、单元测试@Test的使用
- 七、BaseMapper接口的剖析
- 八、MybatisPlus常用注解
- 九、使用MybatisPlus进行删除操作
- 十、使用MybatisPlus进行更新操作
- 十一、QueryWrapper核心API
- 11.1 eq 等于
- 11.2 ne 不等于
- 11.3 gt 大于
- 11.4 ge 大于等于
- 11.5 lt 小于
- 11.6 le 小于等于
- 11.7 or 拼接or (这个需要讲一下怎么用)
- 11.8 between 两个值中间
- 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分页插件的使用
- 十三、自定义Mybatis plus全局配置文件mybatis-config.xml
- 十四、MybatisPlus中select与select *
- 十五、什么是ActiveRecord?
- 十六、MybatisPlus遇上乐观锁
- 十七、MybatisPlus 逻辑删除配置
- 十八、代码自动生成工具
- 十九、MybatisPlus总结
一、什么是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) //主键映射,指明数据库中主键名称以及类型,具体类型如下:
- IdType.AUTO 主键自增,系统分配,不需要手动输入
- IdType.NONE 未设置主键
- IdType.INPUT 需要自己输入 主键值
- IdType.ASSIGN_ID 系统分配 ID,用于数值型数据(Long,对应 mysql 中 BIGINT 类型)
- 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 属性解析
- value 用于定义非主键字段名,用于别名匹配,假如java对象属性和数据库属性不一样
- exist 用于指明是否为数据表的字段, true 表示是,false 为不是,假如某个java属性在数据库没对应的字段则要标记为faslse
- 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);
}
使用建议:
-
业务逻辑比较简单,当类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的, 即业务逻辑大多数是对单表操作,简单,直观 一个类就包括了数据访问和业务逻辑.
-
ActiveRecord虽然有业务逻辑, 但基本上都是基于单表的. 跨表逻辑一般会放到当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script)中.
-
如果对象间的关联越来越多, 你的事务脚本越来越庞大, 重复的代码越来越多, 就不建议使用了
-
模型容易混乱,ActiveRecord保存了数据, 使它有时候看上去像数据传输对象(DTO). 但是ActiveRecord有数据库访问能力, 所以所以分布式或者大型项目基本不用
十六、MybatisPlus遇上乐观锁
16.1 什么是乐观锁?
- 每次去拿数据的时候都认为别人不会修改,更新的时候会判断是别人是否回去更新数据,通过版本来判断,如果数据被修改了就拒绝更新.
- Java里面大量使用CAS, CAS这个是属于乐观锁,性能较悲观锁有很大的提高
- 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
缺点
项目映入了第三方包,未来升级存在一定的兼容性问题
社区相对新生-文档缺乏相关的信息, 或者更新不及时