MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
学习网址 https://baomidou.com/guide/generator.html
MyBatis Plus特性:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
支持的数据库:
- mysql 、mariadb 、oracle 、db2 、h2 、hsql 、sqlite 、postgresql 、sqlserver 、presto 、Gauss 、Firebird
- Phoenix 、clickhouse 、Sybase ASE 、 OceanBase 、达梦数据库 、虚谷数据库 、人大金仓数据库 、南大通用数据库
MyBatisPlus操作案例
我们创建一个品牌操作的功能,实现品牌增删改查,分别创建model
、mapper
、service
、controller
。
MyBatisPlus提供了很多通用方法:
mapper(接口)->extends BaseMapper【增删改查】
service(接口)->extends IService【增删改查】
serviceImpl->extends ServiceImpl【增删改查】
1 Mapper创建
在mall-goods-service
创建com.gupaoedu.vip.mall.goods.mapper.BrandMapper
接口,代码如下:
public interface BrandMapper extends BaseMapper<Brand> {
}
代码说明:BaseMapper中已经存在了很多常见数据库操作方法,可以大幅提升开发速度。
2 Service创建
在mall-goods-service
创建com.gupaoedu.vip.mall.goods.service.BrandService
接口,代码如下:
public interface BrandService extends IService<Brand>{
}
在mall-goods-service
创建com.gupaoedu.vip.mall.goods.service.impl.BrandServiceImpl
实现类,代码如下:
@Service
public class BrandServiceImpl extends ServiceImpl<BrandMapper,Brand> implements BrandService {}
代码说明:IService
和ServiceImpl
中已经创建好了很多常用的增删改查方法,我们写常用的增删改查,几乎不用写方法。
3 增删改功能
增删改功能在IService
和ServiceImpl
中已经全部存在, 不需要额外添加方法,只需要在Controller调用即可。
在mall-goods-service
创建com.gupaoedu.vip.mall.goods.controller.BrandController
,代码如下:
@RestController
@RequestMapping(value = "/brand")
public class BrandController {
@Autowired
private BrandService brandService;
/***
* 增加品牌
*/
@PostMapping
public RespResult add(@RequestBody Brand brand){
// 增加品牌
brandService.save(brand);
return RespResult.ok();
}
/****
* 修改
*/
@PutMapping
public RespResult update(@RequestBody Brand brand){
//修改品牌
brandService.updateById(brand);
return RespResult.ok();
}
/****
* 删除品牌
*/
@DeleteMapping("/{id}")
public RespResult delete(@PathVariable(value = "id") Integer id){
//删除品牌
brandService.removeById(id);
return RespResult.ok();
}
}
4 条件查询/分页
条件查询需要封装条件信息,MyBatis Plus提供了条件封装对象Wrapper
(它的子类QueryWrapper
可以直接使用),我们可以用它的子类QueryWrapper
实现封装查询条件。
4.1 条件查询
在BrandService
中创建如下方法:
List<Brand> queryList(Brand brand);
在BrandServiceImpl
中创建条件查询方法实现(不要忘了注入brandMapper
):
/****
* 多条件查询
* @param brand
* @return
*/
@Override
public List<Brand> queryList(Brand brand) {
// 多条件构造器
QueryWrapper<Brand> queryWrapper = new QueryWrapper<Brand>();
if(!StringUtils.isEmpty(brand.getName())){
queryWrapper.like("name",brand.getName());
}
if(!StringUtils.isEmpty(brand.getName())){
queryWrapper.eq("initial",brand.getInitial());
}
return brandMapper.selectList(queryWrapper);
}
代码说明:
like:表示模糊查询
eq:表示等值查询
在BrandController
中创建条件查询方法:
/****
* 条件查询
*/
@PostMapping(value = "/list")
public RespResult<List<Brand>> list(@RequestBody(required = false) Brand brand){
// 查询
List<Brand> brands = brandService.queryList(brand);
return RespResult.ok(brands);
}
4.2 分页查询
在BrandService
中创建如下方法:
Page<Brand> queryPageList(Long currentPage,Long size,Brand brand);
在BrandServiceImpl
中创建条件查询方法实现(不要忘了注入brandMapper
):
/***
* 分页查询
* @param brand
* @return
*/
@Override
public Page<Brand> queryPageList(Long currentPage, Long size, Brand brand) {
// 封装查询条件
Page<Brand> page = brandMapper.selectPage(
new Page<Brand>(currentPage, size),
new QueryWrapper<Brand>()
.like("name", brand.getName()));
return page;
}
代码说明:
like:表示模糊查询
在BrandController
中创建条件查询方法:
/****
* 条件分页查询
*/
@PostMapping(value = "/list/{page}/{size}")
public RespResult<Page<Brand>> list(
@PathVariable(value = "page")Long currentPage,
@PathVariable(value = "size")Long size,
@RequestBody(required = false) Brand brand){
// 分页查询
Page<Brand> brandPage = brandService.queryPageList(currentPage,size,brand);
return RespResult.ok(brandPage);
}
MyBatisPlus代码生成配置
1)引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
2)代码生成
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java"); // 文件输出路径
gc.setAuthor("bobo"); //作者
gc.setOpen(false); //生成之后是否打开目录
gc.setIdType(IdType.NONE); //主键策略
gc.setServiceName("%sService"); //名字设置 %s是占位符,可以理解成类的名字
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://192.168.100.130:3306/shop_goods?useUnicode=true&useSSL=false&characterEncoding=utf8");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("mall-goods");
pc.setParent("com.gupaoedu.code");
mpg.setPackageInfo(pc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel); //驼峰命名
strategy.setColumnNaming(NamingStrategy.underline_to_camel); //驼峰命名
strategy.setEntityLombokModel(true); //是否使用Lombok
strategy.setRestControllerStyle(true); //是否生成RestController
// 写于父类中的公共字段
strategy.setSuperEntityColumns("id"); //公共字段定义
strategy.setControllerMappingHyphenStyle(true); //驼峰转连字符
strategy.setTablePrefix(pc.getModuleName() + "_"); //表前缀
mpg.setStrategy(strategy);
mpg.execute();
}