MybatisPlus------常用注解以及设置统一前缀以及主键生成策略(六)
在使用MybatisPlus的过程中时,实力类的Mapper继承BaseMapper,此时不要添加@TableName注解也能够对表数据实现增删改查。
// mybatispuls 提供了接口实现单表的增删改查
// 使用
@Mapper
public interface BaseProcedureMapper extends BaseMapper<BaseProcedure> {
Map<String,BaseProcedure> selcetMapById(String id);
}
为什么不加@TableName注解也能够对表进行增删改查?
如果没写@TableName,MybatisPlus会通过BaseMapper中传入的实体类对象,根据驼峰转下划线的规则,来匹配数据表。
比如BaseProcedure类,会转义成base_procedure表
如果该表名,或表面和实体类的关系不匹配,就会报找不到这个表的异常
如果修改表名,或者不符合驼峰转下划线的规则,需要指定表名,也建议最好指定表名
在实体类上加上@TableName(“表名”),即可为实体类指定对应表。
@Data
@TableName("base_procedure")
public class BaseProcedure {
// 默认使用雪花算法,对象ID需要使用 Long类型
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
private String procedureCode;
有时公司会统一设置表名为t_作为起始,或者base_作为起始。
此时可以MybatisPlus可在配置文件中,设置全局的统一的前缀,这样@TableName上就不用写统一的前缀
在application.yml文件中配置
mybatis-plus:
## 设置log打印执行的SQL语句
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
## 设置mybatisplus的全局配置
global-config:
db-config:
## 设置实体类所对应的表的统一前缀
table-prefix: base_
实体类进行修改
@Data
@TableName("procedure")
public class BaseProcedure {
// 默认使用雪花算法,对象ID需要使用 Long类型
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
private String procedureCode;
@TableId
当主键不为id,为uid时
在不写@TableId时,当主键为id时,myabtisPlus也能够对表操作进行解析,一旦不为id,比如改为uid,则会解析失败。
此时需要在uid属性上加上@TableId注解,指定该字段作为主键。
@Data
@TableName("procedure")
public class BaseProcedure {
// 默认使用雪花算法,对象ID需要使用 Long类型
// 将属性所对应的字段指定为主键
@TableId(type = IdType.ASSIGN_UUID)
private String uid;
当属性为id,但主键为uid时value
@TableId中有value属性,能够指定当前属性,对应数据库表中的哪个字段。
@Data
@TableName("procedure")
public class BaseProcedure {
// 默认使用雪花算法,对象ID需要使用 Long类型
// 将属性所对应的字段指定为主键
@TableId(value = "uid", type = IdType.ASSIGN_UUID)
private String id;
@TableId的type属性
type默认时雪花算法。
type = IdType.AUTO 自动递增,数据库必须设置id自增,否则无效
type = IdType.NONE 雪花算法生成ID
type = IdType.INPUT 用户输入ID
type = IdType.ASSIGN_ID 雪花算法适用于Number和String,与数据库是否设置无关
type = IdType.ASSIGN_UUID 生成UUID随机ID
/**
* 生成ID类型枚举类
*
* @author hubin
* @since 2015-11-10
*/
@Getter
public enum IdType {
/**
* 数据库ID自增
* <p>该类型请确保数据库设置了 ID自增 否则无效</p>
*/
AUTO(0),
/**
* 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
*/
NONE(1),
/**
* 用户输入ID
* <p>该类型可以通过自己注册自动填充插件进行填充</p>
*/
INPUT(2),
/* 以下2种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 分配ID (主键类型为number或string),
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
*
* @since 3.3.0
*/
ASSIGN_ID(3),
/**
* 分配UUID (主键类型为 string)
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
*/
ASSIGN_UUID(4);
private final int key;
IdType(int key) {
this.key = key;
}
}
如果自己在传参时,传入ID,那么配置的idtype就不会生效
通过全局配置主键生成策略
通过操作id-type属性。
mybatis-plus:
## 设置log打印执行的SQL语句
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
## 设置mybatisplus的全局配置
global-config:
db-config:
## 设置实体类所对应的表的统一前缀
table-prefix: base_
## 设置全局主键生成策略
## id-type: assign_id
## id-type: assign_uuid
## id-type: auto
## id-type: input
id-type: none
@TableField
主键不一致时可以通过@TableId注解。
mybatisplus会默认的将驼峰转换为下划线,不需要额外配置。
@TableField:指定属性对应的字段名
@Accessors(chain = true)
@TableName("base_procedure")
public class BaseProcedure {
// 默认使用雪花算法,对象ID需要使用 Long类型
// 将属性所对应的字段指定为主键
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("procedure_code")
private String procedureCode;
@TableLogic逻辑删除
用于逻辑删除。
在是否生效字段上加上@TableLogic,这个字段就会用于逻辑删除。
Accessors(chain = true)
@TableName("base_procedure")
public class BaseProcedure {
// 默认使用雪花算法,对象ID需要使用 Long类型
// 将属性所对应的字段指定为主键
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("procedure_code")
private String procedureCode;
private String procedureName;
//表示逻辑删除字段
//是否生效标志
@TableLogic
private Integer active;
当执行delete语句时,本质上并不会执行delete语句,而是执行update语句,
@Test
public void testDeleteByID(){
//根据对象的id进行删除
BaseProcedure baseProcedure = new BaseProcedure();
baseProcedure.setId("ef5397a26b7a469c6fe1de0e");
int result = baseProcedureMapper.deleteById(baseProcedure);
System.out.println("result:{}"+result);
}
执行SQL看控制台打印
==> Preparing: UPDATE base_procedure SET active=1 WHERE id=? AND active=0
==> Parameters: ef5397a26b7a469c6fe1de0e(String)
<== Updates: 0
@TableLogic 如不特殊注明,默认生效为0,失效为1.如果定义的相反,需要特殊注明
@TableLogic(value="原值",delval="改值")
value = "" 未删除的值,默认值为0
delval = "" 删除后的值,默认值为1
修改注解
//表示逻辑删除字段
//是否生效标志
@TableLogic(value = "1",delval = "0")
private Integer active;
执行删除语句,查看执行SQL
==> Preparing: UPDATE base_procedure SET active=0 WHERE id=? AND active=1
==> Parameters: ef5397a26b7a469c6fe1de0e(String)
<== Updates: 1
并且在执行maybatispuls框架所提供的数据库操作时,会自动带上这个生效条件
@Test
public void testSelectList(){
//会自带active = 1
List<BaseProcedure> baseProceduress = baseProcedureMapper.selectList(null);
baseProceduress.forEach(System.out::println);
//会自带active = 1
List<BaseProcedure> baseProcedures = baseProcedureMapper.selectList(new QueryWrapper<BaseProcedure>()
.eq("id","ef5397a26b7a469c6fe1de0e"));
baseProcedures.forEach(System.out::println);
//不会自带active = 1
Map<String, BaseProcedure> result = baseProcedureMapper.selcetMapById("ef5397a26b7a469c6fe1de0e");
System.out.println(result);
//会自带active = 1
Long aLong = baseProcedureMapper.selectCount(new LambdaQueryWrapper<BaseProcedure>().eq(BaseProcedure::getId, "ef5397a26b7a469c6fe1de0e"));
System.out.println(aLong);
}
如果是在mapperl.xml中自定义的SQL,需要自己加上active=1的生效条件,否则不会生效