操作:
增:批量添加
删:条件删除
查:查询单个,查询多个,分页查询
改:
视频参考来源:https://www.bilibili.com/video/BV1yA411t782?p=8&t=407
1、添加依赖:
<!--springboot继承mybatis-plus的依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok用来简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2、配置数据源
#数据库连接配置
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus_study?useSSL=true&useUnicode=true&characterEncoding=utf-8
#因为我的mysql使用的是8版本,所以这里要使用com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3、代码操作
(1) mapper层定义接口,继承mybatis-plus的BaseMapper接口;里面需要传递一个实体类型(这里是自定义的实体类EquipmentPushEntity);mapper接口要使用@mapper注解;也可以不写,在启动类上使用@MapperScan(basePackages = {“org.springblade.dataparse.mapper”})或者@MapperScan(“org.springblade.dataparse.mapper”)扫描指定包下的mapper接口,让springIoc帮我们创建代理对象,并进行管理。
//mapper层
@Mapper
public interface EquipmentPushMapper extends BaseMapper<EquipmentPushEntity> {
}
//实体类
@Data
@TableName("t_device_push")
public class EquipmentPushEntity {
@TableId(value = "id", type = IdType.AUTO)
@JsonSerialize(using = ToStringSerializer.class)
private Integer id;
private Integer deviceId;
}
(2)在需要使用的地方,一般是service层,自动注入mapper对象,便可使用BaseMapper中提供的方法;
//示例
@Autowired
private EquipmentPushMapper equipmentPushMapper;
@Override
public List<EquipmentPushEntity> getAlreadySendEquipments(List<Integer> equipments) {
//selectList() 方法的参数为 MP 内置的条件构造器 Wrapper,不填写就是无任何条件
return equipmentPushMapper.selectList(null);
}
4、注解学习
- @TableName(“t_device_push”):默认情况下,mybatis-plus是使用实体类的类名作为表名去操作,如果类名与数据库表名不一致,可通过@TableName注解去映射数据库中表名。
- @TableId(value = “id”, type = IdType.AUTO):设置主键映射,value映射主键字段名,type设置主键类型,主键的生成策略;
AUTO(0),
NONE(1),//默认
INPUT(2),
ASSIGN_ID(3),
ASSIGN_UUID(4),
//已弃用
/** @deprecated */
@Deprecated
ID_WORKER(3),
/** @deprecated */
@Deprecated
ID_WORKER_STR(3),
/** @deprecated */
@Deprecated
UUID(4);
| 值 | 描述 |
|---|---|
| AUTO | 数据库自增 |
| NONE | MP set 主键,雪花算法实现 |
| INPUT | 需要开发者手动赋值 |
| ASSIGN_ID | MP分配ID, 主键类型可以使Long,Integer,String |
| ASSIGN_UUID | 分配UUID,主键类型只能是String |
INPUT 如果开发者没有手动赋值,则数据库通过自增的方式给主键赋值,但传递的参数以及返回的主键为null;如果开发者手动赋值,则存入该值。
ASSIGN_ID 跟NONE一样,自动赋值,雪花算法实现
-
@TableField(value = “name”):映射非主键字段,value映射字段名
-
@TableField(exist= false):表示是否为数据库字段false,如果实体类中的成员变量在数据库中没有对应的字段,则可以使用exist,VO、DTO中用的比较多。
-
@TableField(value = “name”,select = false):select表示是否查询该字段
-
@TableField(fill = FieldFill.INSERT):fill表示是否自动填充,将对象存入数据库的时候,由Mybatis Plus自动给某些字段赋值,例如:create_time、update_time;然后创建自定义处理器,帮助我们去set这些值。
//实体类
@Data
public class User {
private Long id;
private String name;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
//配置类,MetaObjectHandler 是由MP提供的处理器接口
@Configuration
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
-
@Version:标记乐观锁,通过version字段来保证数据的安全性,当修改数据的时候,会以version作为条件,当条件成立的时候才会执行。
(这部分还有待学习,并发) -
@EnumValue:通用枚举类注解,将数据库字段映射成实体类的枚举类型成员变量
//实体类
@Data
public class User {
private Long id;
private String name;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
private SexEnum sex;//注意此处要跟数据库的字段名一致
}
//枚举类
public enum SexEnum {
MAN(0,"男生"),
WOMEN(1,"女生");
SexEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
@EnumValue //0-男生,1-女生
private int code;
private String msg;
}
application.properties
#配合枚举类的扫描包所在地址
mybatis-plus.type-enums-package=com.james.mpdemo.enums
测试:
//查询User表所有数据
@Test
public void testSelectList() {
System.out.println(("----- selectAll method test ------"));
//UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
//所以不填写就是无任何条件
List<User> users = userMapper.selectList(null);
System.out.println(users);
}

亦可以通过实现接口的方式,不使用@EnumValue注解
public enum SexEnum implements IEnum<Integer> {
MAN(0,"男生"),
WOMEN(1,"女生");
SexEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
private int code;
private String msg;
@Override
public Integer getValue() {
return this.code;
}
}
- @TableLogic:映射逻辑删除
@Data
public class User {
private Long id;
private String name;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
private SexEnum sex;
@TableLogic //
private Integer deleted;
}
application.properties
#配置删除时值为1,没有被删除时值为0
mybatis-plus.global-config.db-config.logic-delete-value=1;
mybatis-plus.global-config.db-config.logic-not-delete-value=0;
测试:
//删除操作
@Test
public void testDelete(){
int result = userMapper.deleteById(1);
System.out.println(result);
}
5、多表查询
(mybatis-plus并没有提供多表查询的可用方法,它是针对于某个表进行的sql语句自动编写,因此我们需要自定义多表查询语句)
实体类Vo:
@Data
public class ProductVo {
private Integer id;
private String productName;
private Integer userId;
private String userName;
}
数据库表结构:

mapper层(使用注解方式,不需要新建XXXmapper.xml):
@Repository
public interface UserMapper extends BaseMapper<User> {
@Select("select p.*,u.name user_name from product p, user u where p.user_id = u.id and u.id=#{id};")
List<ProductVo> productList(Integer id);
}
测试:
//查询操作
@Test
public void testSelect3(){
List<ProductVo> productVoList = userMapper.productList(2);
productVoList.forEach(System.out::println);
}
测试结果:

6、Mybatis Plus自动生成
根据数据库表自动生成实体类、Mapper、Service、ServiceImpl、Controller
(1)pom.xml导入Mybatis Plus Generator
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
Velocity(默认)、Freemarker、Beet
2、书写启动类
mysql关于时间的处理:
日期(年月日)输出:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.apply("DATE_FORMAT(create_time,'%Y-%m-%d') = {0}", "2021-07-27");
//SELECT id,name,age,create_time,update_time,sex FROM user WHERE (DATE_FORMAT(create_time,'%Y-%m-%d') = ?)
本文介绍MyBatis Plus的快速入门,包括依赖添加、数据源配置、基本代码操作等,并详细讲解了常用注解如@TableName、@TableId、@TableField等的功能与使用方法。
1297

被折叠的 条评论
为什么被折叠?



