MyBatisPlus:常用注解
@TableName
问题
使用MyBatis-Plus的时候,没有指定要操作的表名,但仍能进行增删改查,
在Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表 ,
(由此得出结论,MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决定,且默认操作的表名和实体类型的类名一致)
如果将user表的名字改成t_user,那么操作就无法进行
通过@TableName解决问题
在实体类类型上添加@TableName("t_user"),标识实体类对应的表,即可成功执行SQL语句
@TableId
MyBatis-Plus实现curd时,默认将“id”作为主键列.
若实体类和表中表示主键的不是id,而是其他字段,例如uid,mybatis-plus不会识别!
将实体类User中的id改为uid,数据库id也改为uid,在进行测试会报错!
通过@TableId解决问题
在实体类中uid属性上通过@TableId将其标识为主键,即可成功执行SQL语句
@TableId的value属性
若实体类中主键对应的属性为id,而表中表示主键的字段为uid,此时若只在属性id上添加注解@TableId,则抛出异常Unknown column 'id' in 'field list',即MyBatis-Plus仍然会将id作为表的主键操作,而表中表示主键的是字段uid
此时需要通过@TableId注解的value属性,指定表中的主键字段,@TableId("uid")或@TableId(value="uid")
TableId的type属性
type属性用来定义主键策略
- IdType.ASSIGN_ID(默认): 基于雪花算法的策略生成数据id,与数据库id是否设置自增无关
- IdType.AUTO : 使用数据库的自增策略,注意,该类型请确保数据库设置了id自增,否则无效
配置全局主键策略:
<bean class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml">
</property>
<property name="dataSource" ref="dataSource"></property>
<property name="typeAliasesPackage" value="com.atguigu.mp.pojo"></property>
<!-- 设置MyBatis-Plus的全局配置 -->
<property name="globalConfig" ref="globalConfig"></property>
</bean>
<bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
<!-- 设置实体类所对应的表的前缀 -->
<property name="tablePrefix" value="t_"></property>
<!-- 设置全局主键策略 -->
<property name="idType" value="AUTO"></property>
</bean>
</property>
</bean>
@TableField
经过以上的测试,我们可以发现,MyBatis-Plus在执行SQL语句时,要保证实体类中的属性名和表中的字段名一致如果实体类中的属性名和字段名不一致的情况,会出现什么问题呢?
情况1
若实体类中的属性使用的是驼峰命名风格,而表中的字段使用的是下划线命名风格例如实体类属性userName,表中字段user_name此时MyBatis-Plus会自动将下划线命名风格转化为驼峰命名风格相当于在MyBatis中配置
情况2
若实体类中的属性和表中的字段不满足情况1例如实体类属性name,表中字段username此时需要在实体类属性上使用@TableField("username")设置属性所对应的字段名
@TableLogic
逻辑删除
物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
使用场景:可以进行数据恢复
实现逻辑删除
1.数据库中创建逻辑删除状态列,设置默认值为0
2.实体类中添加逻辑删除属性
测试删除:
实际执行的是修改
测试查询,逻辑删除的内容查询不到!