第一步:导入依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
导入Mybatis-plus的依赖后就不需要导入Mybatis的依赖了
第二步:
让Usermapper继承BaseMapper
注意:在继承的过程中要注意BaseMapper<>中的泛型要实现声明好,应该为实体类中的类型
常见注解:
一:
@TableName:用来指定表名
@TableId:用来指定表中主键的信息
@TableField:用来指定表中普通字段的名字
MyBatisPlus 中,对于自增(Auto-Increment)主键的生成策略
1. 数据库自增(如 MySQL 的自增主键)
- 配置方式:
- 首先,在数据库表设计时,将对应的主键字段设置为自增类型(例如在 MySQL 中使用
AUTO_INCREMENT
关键字)。 - 在实体类中,对应的主键字段使用
@TableId
注解,并设置type
属性为IdType.AUTO
。示例如下:
- 首先,在数据库表设计时,将对应的主键字段设置为自增类型(例如在 MySQL 中使用
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("your_table_name")
public class YourEntity {
@TableId(type = IdType.AUTO)
private Long id;
// 其他字段及对应的getter和setter方法
//...
}
- 生成策略说明:
- 当向数据库插入一条新记录时,数据库会自动为主键字段分配一个递增的值,MyBatisPlus 在执行插入操作时,会从数据库获取到这个自动生成的主键值,并填充到实体类的主键字段中,以便后续使用。
2. 雪花算法(Snowflake)生成分布式唯一 ID
- 配置方式:
- 在实体类的主键字段上使用
@TableId
注解,并设置type
属性为IdType.ASSIGN_ID
。示例:
- 在实体类的主键字段上使用
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("your_table_name")
public class YourEntity {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
// 其他字段及对应的getter和setter方法
//...
}
- 生成策略说明:
- MyBatisPlus 会使用雪花算法来生成一个长度为 19 位的分布式唯一 ID 作为主键值。雪花算法生成的 ID 具有唯一性、有序性(在一定时间范围内按时间先后生成的 ID 是有序的)等特点,适用于分布式系统中需要生成唯一标识符的场景,比如在多个节点同时插入数据时,能保证每个记录都有唯一的主键值。
3. 其他 ID 生成策略
- UUID(通用唯一识别码)策略(不常用,存在一些性能和存储问题):
- 配置方式:通过设置
@TableId
注解的type
属性为IdType.ASSIGN_UUID
来启用。 - 生成策略说明:会生成一个 36 位的字符串形式的通用唯一识别码作为主键值。但由于 UUID 是随机生成的,且长度较长,在数据库存储和索引查询等方面可能会带来一些性能损耗,所以一般不太推荐在高并发等性能要求较高的场景下使用。
- 配置方式:通过设置
- 基于数据库序列生成(适用于部分数据库如 Oracle):
- 配置方式:对于支持序列的数据库(如 Oracle),可以在实体类的主键字段上使用
@TableId
注解,并设置type
为IdType.ASSIGN_SEQ
。同时,需要配置相应的序列信息(比如在 MyBatisPlus 的全局配置或特定的 Mapper 配置中指定序列名称等)。 - 生成策略说明:会根据数据库中的序列来生成主键值,每次获取下一个序列值作为新记录的主键,以保证主键的唯一性和有序性(按照序列的生成顺序)。
- 配置方式:对于支持序列的数据库(如 Oracle),可以在实体类的主键字段上使用
不同的自增生成策略适用于不同的应用场景,在实际项目中,可以根据具体需求(如是否是分布式系统、数据库类型、性能要求等)来选择合适的主键生成策略。
INPUT:通过set方法自行登录
@TableField
注解
1. 注解的作用
@TableField
注解主要用于在实体类中对数据库表字段进行一些额外的配置和映射说明,以确保实体类与数据库表之间的字段对应关系更加准确和灵活处理一些特殊情况。
2. 常用属性及功能
exist 属性
- 作用:用于指定该实体类中的字段在数据库表中是否真实存在。
- 示例及说明:
public class YourEntity {
@TableId(type = IdType.AUTO)
private Long id;
@TableField(exist = false)
private String virtualField;
// 其他字段及对应的getter和setter方法
//...
}
在上述示例中,virtualField
字段使用了@TableField(exist = false)
注解,这表示该字段在数据库表中并不存在,它可能是仅在实体类层面用于临时存储数据、计算结果等用途,在进行数据库操作(如插入、更新等)时,MyBatisPlus 不会将该字段对应的数据发送到数据库中。
value 属性
- 作用:用于指定实体类中的字段对应的数据库表中的具体字段名。
- 示例及说明:
public class YourEntity {
@TableId(type = IdType.AUTO)
private Long id;
@TableField(value = "db_column_name")
private String fieldName;
// 其他字段及对应的getter和setter方法
//...
}
这里,fieldName
字段通过@TableField(value = "db_column_name")
注解明确了其对应的数据库表中的字段名为db_column_name
。这在数据库表字段名和实体类字段名不一致的情况下非常有用,比如数据库表中有个字段叫user_name
,而实体类中习惯用username
来表示该属性,就可以通过这种方式进行准确映射。
condition 属性
- 作用:用于在执行查询操作时设置查询条件的附加规则。
- 示例及说明:
public class YourEntity { @TableId(type = IdType.AUTO) private Long id; @TableField(condition = SqlCondition.LIKE) private String searchableField; // 其他字段及对应的getter和setter方法 //… }
假设在进行查询操作时,当涉及到searchableField
字段,通过设置@TableField(condition = SqlCondition.LIKE)
,可以使得在构建查询语句时,对该字段的查询会以LIKE
的方式进行(比如在 MyBatisPlus 的条件查询构建器中使用时),即会按照模糊查询的方式处理该字段的查询条件。
update 属性
- 作用:用于指定在执行更新操作时,该字段是否参与更新。
- 示例及说明:
public class YourEntity {
@TableId(type = IdType.AUTO)
private Long id;
@TableField(update = false)
private String noUpdateField;
// 其他字段及对应的getter和setter方法
//...
}
在上述示例中,noUpdateField
字段设置了@TableField(update = false)
,这意味着在对实体类对应的数据库表进行更新操作时,该字段的数据不会被更新到数据库中,即使实体类中该字段的值发生了变化。
3. 使用场景总结
- 解决字段名映射差异:当实体类字段名和数据库表字段名不一致时,通过
@TableField(value = …)
来准确映射两者关系,确保数据的正确读写。 - 处理虚拟字段:对于那些仅存在于实体类层面而不在数据库表中的字段,使用
@TableField(exist = false)
来告知 MyBatisPlus 在数据库操作时不处理该字段。 - 定制查询条件:在需要对某些字段在查询时设置特殊的查询条件方式(如模糊查询等)时,利用
@TableField(condition = …)
来实现。 - 控制字段更新参与度:当希望在更新操作中某些字段不参与更新时,通过
@TableField(update = false)
来实现这一目的。
总之,@TableField
注解为 MyBatisPlus 在实体类与数据库表之间的字段映射、操作处理等方面提供了更加灵活和精细的控制手段。
自定义SQL:
在Controller层调用Service层的接口,在Service的实现类中调用Mapper层的方法,使用mp需要在Controller就调用wrapper来代替xml中的where条件,不过where条件前面的update或者select语句还是要自己写的,mp在遇到复杂的where条件的时候还是要mb和mp结合,省去了where条件,注意 例如上图:
balance-#{balance} ${ew.customSqlSegment} 注意$前面有个空格,不然报错
Service接口:
我们的自定义接口继承mp提供的接口。我们的接口实现类去继承mp给的实现类,
//注意指定泛型,泛型为我们的实体
实现类要给两个参数,一个是mapper类型,一个是实体类型,
案例:
LambdaQurey查询:
@Override
public List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {
List<User> users = lambdaQuery().like(name != null, User::getUsername, name)
.eq(status != null, User::getStatus, status)
.gt(minBalance != null, User::getBalance, minBalance)
.le(maxBalance != null, User::getBalance, maxBalance)
.list(); //如果查询一个的话是one
return users;
}
}