1. MyBatisPlus常用注解
@TableName
@TableName("t_user")
public class User {}
也可通过全局配置:
mybatis-plus:
global-config:
db-config:
table-prefix: t_ # 配置MyBatis-Plus操作表的默认前缀
@TableId
@TableId(value = "uid", type = IdType.AUTO) // 通过@TableId将其标识为主键
private Long id;
//@TableId注解的value属性,指定表中的主键字段;type属性用来定义主键策略
常用的主键策略:
也可全局配置主键策略
mybatis-plus:
global-config:
db-config:
table-prefix: t_ # 配置MyBatis-Plus操作表的默认前缀
id-type: auto # 配置MyBatis-Plus的主键策略
雪花算法:
雪花算法是分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。
①核心思想:
长度共64bit(一个long型)。
1bit标识一个符号位,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。
41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。
②优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高。
@TableField
@TableField("user_name") // 使用@TableField("username")设置属性所对应的字段名
private String name;
@TableLogic
@TableLogic
private Integer isDeleted;
@EnumValue
// 使用通用枚举时使用该注解
@Getter
public enum SexEnum {
MALE(1, "男"),
FEMALE(2, "女");
@EnumValue // 表示将@EnumValue表示的字段作为值存入数据库
private final Integer sex;
private final String sexName;
SexEnum(Integer sex, String sexName) {
this.sex = sex;
this.sexName = sexName;
}
}
@Version
// 使用乐观锁插件时使用该注解
@Data
public class Product {
private Long id;
private String name;
private Integer price;
@Version // 表示乐观锁字段
private Integer version;
}
@DS
使用多数据源配置时使用;可以注解在类上或方法上;需要引入依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
import com.baomidou.dynamic.datasource.annotation.DS;
@Service
@DS("master") // 指定访问的数据源,value值为yml中配置的数据源信息
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
#多数据源配置参考:
spring:
# 配置数据源信息
datasource:
dynamic:
# 设置默认的数据源或者数据源组,默认值即为master
primary: master
# 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
strict: false
datasource:
master:
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
slave_1:
url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
2. MyBatisPlus插件
2.1 分页插件
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能
@Configuration
@MapperScan("com.atguigu.mybatisplus.mapper") //可以将主类中的注解移到此处
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
使用方法
@Test
public void testSelectPage() {
Page<User> page = new Page<>(1, 2);
userMapper.selectPage(page, null);
System.out.println(page);
}
xml自定义分页
@Repository
public interface UserMapper extends BaseMapper<User> {
/**
* @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位
*/
Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);
}
<select id="selectPageVo" resultType="com.atguigu.mybatisplus.pojo.User">
select * from t_user where age > #{age}
</select>
2.2 乐观锁插件
乐观锁实现流程
数据库中添加version字段,取出记录时,获取当前version
SELECT id,`name`,price,`version` FROM product WHERE id=1
更新时,version + 1,如果where语句中的version版本不对,则更新失败
UPDATE product SET price=price+50, `version`=`version` + 1 WHERE id=1 AND `version`=1
Mybatis-Plus实现乐观锁
添加乐观锁插件配置
@Configuration
@MapperScan("com.atguigu.mybatisplus.mapper")
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//添加乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
@Data
public class Product {
private Long id;
private String name;
private Integer price;
@Version // 表示乐观锁字段
private Integer version;
}