✨✨个人主页:沫洺的主页
📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏
📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏
📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏
💖💖如果文章对你有所帮助请留下三连✨✨
☕MyBatis-Plus介绍
MyBatis-Plus(opens new window)(简称 MP)是一个 MyBatis(opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatisPlus特性
无侵入:只做增强不做改变,不会对现有工程产生影响
强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现单表CRUD 操作
支持 Lambda:编写查询条件无需担心字段写错
支持主键自动生成
内置分页插件
……
🍣MyBatis-Plus使用
可参考官方的快速入门
数据库
多模块Spring Boot工程(练习可以使用单模块工程)
主要依赖包
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>3.5.2</version> </dependency>
具体依赖
父模块scm-root的pom.xml
<dependencyManagement> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> <scope>compile</scope> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.5</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.9</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>3.5.2</version> </dependency> </dependencies> </dependencyManagement>
子模块scm-app的pom.xml
<dependencies> <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> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <dependency> <groupId>com.moming</groupId> <artifactId>scm-service</artifactId> <version>14-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies>
子模块scm-dao的pom.xml
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> </dependency> <dependency> <groupId>com.moming</groupId> <artifactId>scm-entity</artifactId> <version>14-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies>
子模块scm-entity的pom.xml
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> </dependency> </dependencies>
子模块scm-service的pom.xml
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> </dependency> <dependency> <groupId>com.moming</groupId> <artifactId>scm-dao</artifactId> <version>14-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies>
scm-dao模块/scm-mapper模块(都可以,我用的dao(懒得改),既然是mybatis,建议用mapper,如果你用的是mapper模块,那么下面的dao都换成mapper,还有就是上面的子模块引入的dao模块换成mapper模块)
创建dao/ImagesMapper
package com.moming.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.moming.entity.Images; public interface ImagesMapper extends BaseMapper<Images> { }
scm-entity模块
创建entity/Images
这里注意表名和类名不一致要通过@TableName去指定表名
同样的表字段名和属性名不一致用@TableField去指定字段名
package com.moming.entity; import cn.hutool.core.date.LocalDateTimeUtil; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.time.LocalDateTime; @Data @TableName("scm_images") public class Images { //自增,且不加入sql语句拼接 @TableId(type = IdType.AUTO) private Integer id; @TableField("img") private String img; @TableField("createTime") private LocalDateTime createTime = LocalDateTimeUtil.now(); }
scm-service模块
创建service/ImagesService
package com.moming.service; import com.moming.dao.ImagesMapper; import com.moming.entity.Images; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class ImagesService { @Autowired private ImagesMapper imagesMapper; public Integer add(Images images){ return imagesMapper.insert(images); } public List<Images> select(){ return imagesMapper.selectList(null); } }
scm-app模块
application.yml配置数据库连接信息
#数据库连接信息配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db5?useSSL=false&useServerPrepStmts=true username: root password: 123456 druid: initial-size: 10 # 初始化时建立物理连接的个数 min-idle: 10 # 最小连接池数量 maxActive: 200 # 最大连接池数量 maxWait: 60000 # 获取连接时最大等待时间,单位毫秒 #映射文件所在位置 mybatis: mapper-locations: classpath:mapper/*Mapper.xml #别名 type-aliases-package: com.moming.entity #配置日志级别 logging: level: # root: error com.moming: info rest: controller: advice: base-packages: com.moming.controller
创建controller/ImagesController
package com.moming.controller; import com.moming.entity.Images; import com.moming.service.ImagesService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/api/images") public class ImagesController { @Autowired private ImagesService imagesService; @PostMapping("/add") public Integer add(@RequestBody Images images){ return imagesService.add(images); } @GetMapping("/select") public List<Images> select(){ return imagesService.select(); } }
在 Spring Boot 启动类中添加@MapperScan注解,扫描 dao/mapper 文件夹
package com.moming; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.moming.dao") public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
单元测试
ImagesMapper中的selectList()方法的参数为 MP 内置的条件封装器Wrapper,所以不填写就是无任何条件
package com.moming; import com.moming.dao.ImagesMapper; import com.moming.entity.Images; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest public class ScmAppTests { @Autowired private ImagesMapper imagesMapper; @Test void test1() { List<Images> images = imagesMapper.selectList(null); images.forEach(System.out::println); } }
测试结果
单模块的入门使用请参考官方的快速入门,不过官方用的是H2数据库,可以改为MySql数据库
🍰注解
官方已经描述的很详细了,这里做一些常用的演示
@TableName
- 描述:表名注解,标识实体类对应的表
- 使用位置:实体类
@TableId
- 描述:主键注解
- 使用位置:实体类属性主键字段
- 常用: @TableId(type = IdType.AUTO)默认自增
@TableField
- 描述:字段注解(非主键)
- 使用位置: 实体类属性上
FieldStrategy
- 配合@TableField使用,如下插入忽略,修改忽略
@TableField(insertStrategy= FieldStrategy.IGNORED,updateStrategy = FieldStrategy.IGNORED)
@OrderBy
- 描述:内置 SQL 默认指定排序,优先级低于 wrapper 条件查询
- 默认倒序
@OrderBy(asc = true)//正序(不写就是正序)
🍨条件封装器Wrapper
创建Wrapper对象
QueryWrapper wrapper = new QueryWrapper<T>();
常用方法
package com.moming; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.moming.dao.ImagesMapper; import com.moming.entity.Images; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest public class ScmAppTests { @Autowired private ImagesMapper imagesMapper; @Test void selectTest() { //普通查询 //List<Images> images = imagesMapper.selectList(null); //条件查询 QueryWrapper<Images> wrapper1 = new QueryWrapper<>(); //QueryWrapper<Images> wrapper1 = Wrappers.query(); //等于 //wrapper1.eq("img", "1.jpg"); //大于等于 //wrapper1.ge("id",2); //Integer minId=2; Integer minId=null; wrapper1.ge(minId!=null,"id",minId); //模糊 wrapper1.like("img", "1"); LambdaQueryWrapper<Images> wrapper2 = new LambdaQueryWrapper<>(); wrapper2.like(Images::getImg,"2"); List<Images> images = imagesMapper.selectList(wrapper2); images.forEach(System.out::println); } @Test void updateTest() { Images images = new Images(); images.setId(3); images.setImg("333.jpg"); //全字段修改 //imagesMapper.updateById(images); //单字段修改 //UpdateWrapper<Images> wrapper1 = new UpdateWrapper<>(); UpdateWrapper<Images> wrapper1 = Wrappers.update(); wrapper1.set("img", "333333.jpg"); wrapper1.eq("id",3); //imagesMapper.update(null, wrapper1); LambdaUpdateWrapper<Images> wrapper2 = new LambdaUpdateWrapper<>(); wrapper2.set(Images::getImg,"3.jpg"); wrapper2.eq(Images::getId,3); imagesMapper.update(null, wrapper2); } @Test void deleteTest() { Images images = new Images(); images.setId(3); //根据对象删除 imagesMapper.deleteById(images); //根据具体id删除 imagesMapper.deleteById(2); //多条删除 imagesMapper.deleteBatchIds(CollUtil.newArrayList(1,2,3)); UpdateWrapper<Images> wapper = Wrappers.update(); wapper.eq("id",3); imagesMapper.delete(wapper); } //通过传统xml方式查询 @Test void test1() { List<Images> tukuList = imagesMapper.select(); tukuList.forEach(System.out::println); } //通过注解方式查询 @Test void test2() { List<Images> tukuList = imagesMapper.select2(); tukuList.forEach(System.out::println); } }
补充支持传统的写sql方式
scm-dao模块
ImagesMapper
package com.moming.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.moming.entity.Images; import org.apache.ibatis.annotations.Select; import java.util.List; public interface ImagesMapper extends BaseMapper<Images> { List<Images> select(); @Select("select * from scm_images") List<Images> select2(); }
scm-app模块
application.yml配置
mybatis-plus: config-location: classpath:mapper/*Mapper.xml #别名 type-aliases-package: com.moming.entity
创建resources/ImagesMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.moming.dao.ImagesMapper"> <select id="select" resultType="com.moming.entity.Images"> select * from scm_images </select> </mapper>