前言:
由国人自主开发的基于Mybatis的增强框架MybatisPlus,一经推出,便收获了国内Java开发者的一致好评。MybatisPlus在Mybatis的基础上,只做增强,内置了关于单表的许多基础操作,让我们可以不在将时间放在那些基础的CRUD上,直接调用MybatisPlus提供的方法,大大减少了我们在开发过程中的低级代码量,使我们只需要将时间和精力放在一些复杂的多表联合查询上。这大大减少了我们的工作量,而且,由于是国人自行开发的框架,在许多方法的声明和使用上,更符合我们国人的习惯,而且,还提供了中文版的API文档,是我们在阅读和使用时,更加的方便和得心应手。接下来,我将基于spring boot项目,来演示一下如何正确的使用MybatisPlus进行一些单表的基础操作。
使用到的技术栈:jdk17,spring boot3.1.5,MySQL,MybatisPlus
本次演示使用knife4j进行测试。
一、创建一个空的spring boot项目,
并且导入相应的依赖项
<!-- web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.2</version>
</dependency>
<!-- knife4j-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
<!-- mysql-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
二、在MySQL数据库中建立一张表,用来进行测试,并且在spring boot项目中建立相应的类。
1、数据表:我就随便建了一个表,用来进行本次的测试:
id为主键,不为空,并且设置为自动递增,随便加了几条数据用来测试。
2、接下来对应着这张表,我们就要建立相应地数据层、业务层、表现层;
首先建立对应的实体类,要与表中的字段进行对映。
@Data @TableName("test") public class Test implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; private String testName; private String testPwd; private String testMoney; private Integer testAge; }
我们使用@Data自动进行get,set和toString的生成,@TableName("test")注解里要写上表的名字,这样才能将实体类与数据库中的表进行对映。并且实体类中的属性名称也要与表中的属性名称对映,这里我们使用驼峰命名是可以与数据表中的下划线联立起来的
(MybatisPlus默认实现小驼峰命名与下划线之间的映射;要么属性名称与数据库字段完全一致,要么采用小驼峰命名与下划线之间的映射。如果两种方法都不想使用还可以在属性上加上@TableField()注解,在这个注解里面写上数据库的字段名称也可以进行映射)
3、创建一个mapper接口,实现BaseMapper,BaseMapper是MybatisPlus中的接口,里面定义了很多基础方法,这样就可以使用MybatisPlus中的方法。
@Mapper public interface TestMapper extends BaseMapper<Test> { }
BaseMapper里面的泛型就是我们写的实体类,然后再接口上加入@Mapper注解,将这个接口加入MybatisPlus管理。
如果mapper接口比较多的话,也可以直接在项目的启动类加上@MapperScan注解,并指定mapper接口的扫描路径。
4、定义一个业务层的接口,并且新建一个类去实现。再业务层的接口和类中,也要取继承一些MybatisPlus的接口或类,才能实现MybatisPlus的功能。
public interface ITestService extends IService<Test> { //接口 }
@Service public class TestServiceImpl extends ServiceImpl<TestMapper, Test> implements ITestService { //实现类 }
业务层的接口继承了IService接口,并传入一个实体类的泛型
业务层的实现类继承了ServiceImpl类,并且,传入我们定义的Mapper接口和实体类,还要实现了业务层的接口。
5、创建一个controller类,并且使用自动装配注入我们的业务层Bean,,接下来在表现层中实现我们的代码。
@RestController @RequestMapping("/tests") public class TestController {@Autowired private ITestService testService;}
表现层,采用Rest风格。
接下来,看一下我们的包层次结构:
6、在application.yml配置文件中,配置数据库的连接信息,及MybatisPlus的一些标准配置:
id-type: 将表中的id字段设为自动递增
log-impl:日志输出:将执行的SQL语句打印在控制台上
datasource:数据库的一些配置信息
三、接下来开始基于MybatisPlus完成单表操作。
1、查全部信息:
@GetMapping("/all") public List<Test> getAll(){ return testService.list(); }
直接调用testService的list()方法,就能实现查询到数据表中的所有数据,
查询结果:
控制台输出的SQL语句:
可以看到,我们调用MybatisPlus提供的方法,与我们手写SQl语句,是一样的效果。而MybatisPlus封装了大量的方法供我们进行使用,这样就减少了我们手写低级SQL的时间与精力。而MybatisPlus封装的方法基本上都能做到见名知意,这样就能大大提高我们的效率。
2、根据id查单个信息:
@Operation(summary = "根据id获取测试数据") @GetMapping("/getById/{id}") public Test getById(@PathVariable("id") Integer id) { return testService.getById(id); }
直接调用testService的getById方法,名字起的也是非常直接。运行结果如下
控制台输出的SQL语句:
与我们手写的SQl语句,没有什么不同。
3、新增一条数据到数据库
@Operation(summary = "添加测试数据") @PostMapping("/add") public String add(@RequestBody Test test) { return testService.save(test)?"添加成功":"添加失败"; }
调用save方法,返回一个布尔类型,用于判断新增是否成功。运行结果:
控制台输出的SQL语句:
4、根据id,修改一条数据
@Operation(summary = "根据id,更新测试数据") @PostMapping("/update") public String updateById(@RequestBody Test test) { return testService.updateById(test)?"更新成功":"更新失败"; }
运行结果:
控制台输出的SQL语句:
5、根据id删除一条数据
@Operation(summary = "根据id删除测试数据") @DeleteMapping("/deleteById/{id}") public String deleteById(@PathVariable("id") Integer id) { return testService.removeById(id)?"删除成功":"删除失败"; }
运行结果:
控制台输出的SQL语句:
6、分页查询:
@Operation(summary = "分页查询") @GetMapping("/getPage/{PageSize}/{PageNum}") public List<Test> getPage(@PathVariable("PageSize") Integer PageSize,@PathVariable("PageNum") Integer PageNum){ Page<Test> page = new Page<>(PageNum,PageSize); Page<Test> testPage = testService.page(page); List<Test> testList = testPage.getRecords(); return testList; }
使用分页查询时,要新增分页拦截器。不然,分页功能不能实现。新建一个配置类,实现MybatisPlus的分页拦截。
//MybatisPlus分页拦截器 @Configuration public class MPInterceptors { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mybatisPlusInterceptor; }
运行结果:
控制台输出的SQL语句:
7、分页条件查询
创建一个分页对象Page,使用Lambda表达式的方式,创建一个条件对象,然后,使用like模糊查询,查询的条件是,根据用户名模糊查询。
@Operation(summary = "分页条件查询(根据用户名模糊查询)") @PostMapping("/getPage/{PageSize}/{PageNum}") public List<Test> getPageCondition(@PathVariable("PageSize") Integer PageSize,@PathVariable("PageNum") Integer PageNum,@RequestBody Test test){ Page<Test> page = new Page<>(PageNum,PageSize); LambdaQueryWrapper<Test> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(test.getTestName()!=null,Test::getTestName,test.getTestName()); List<Test> testList = testService.page(page, queryWrapper).getRecords(); return testList; }
运行结果:
控制台输出的SQL语句:
还是比较完美的输出的SQL语句,和我们编写的没太大差异。
总结:
MybatisPlus封装了几乎所有的条件,模糊查询、大于、小于、等于、分页等等,我们可以记住常用的几种。在需要其他条件时,可以在MybatisPlus的官网上进行查询,官网是中文写的,我们读起来更加的方便和的心应手,
官网地址:MyBatis-Plus
https://baomidou.com
使用MybatisPlus框架可以帮助我们省去写低级SQL语句的时间和精力,在单表的操作上,MybatisPlus几乎可以满足我们在开发过程中遇到的所有需求。而且,MybatisPlus是对Mybatis做的无侵入式增强,我们仍然可以使用Mybatis在mapper.xml中写动态SQL语句。现在,在国内的Java开发中,MybatisPlus几乎是写后端必不可少的框架。
写单表的SQL时,用MybatisPlus封装的方法。涉及到,多表查询时,可以在Mapper文件中写SQL语句,这样,大大提高了我们的开发效率。减少了一些重复枯燥的CRUD操作。