Mybatis-Plus学习的第一天
MybatisPlus
在Mybatis的基础上只做增强不做改变,为简化而生
会根据条件自动拼接动态sql
1.配置mysql
1.1 mybatis5配置 驱动为com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名称?useSSL=false(是否使用安全连接)&useUnicode=true&characterEncoding=utf-8(字符集utf8)&serverTimezone=GMT%2B8(时区 上海东八区)
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
1.2 mybatis8配置
1.2.1 驱动与5不同为com.mysql.cj.jdbc.Driver,高版本驱动是兼容低版本的
1.2.2 需要增加时区配置
2.使用
2.1 配置实体类entity
2.1.1 主键生成策略
可以使用lombok简化配置
数据库自增列 只有一个库可以生成,可能会有单点故障的风险
UUID 没有排序,比较长
雪花算法(默认id) 几乎全球唯一 推特的snowflake是Twitter的ID生成算法 结果是一个Long类型ID,核心思想:使用41bit作为毫秒数,10bit作为机器ID(5个bit是数据中心ID,5个bit是机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以生产4096个ID),最后一个是符号位,永远为0
2.1.2 主键配置
@TableId(IdType = none)
auto 自增
none 没有设置
input 需要手动输入
uuid
in_worker 默认全局唯一id,是数字
in_worker_str
2.1.2 自动填充
全球通用字段gmt_create、gmt_modified所有表都需要、并且需要自动化
2.1.2.1 数据库级别
表中设置这两个字段 更新的勾选自动更新 字段类型datetime 默认值CURRENT_TIMESTAMP 同步实体类
2.1.2.2 代码级别
删除默认值、自动更新操作
2.1.2.2.1 在字段上设置注解 新增: @TableField(fill = FieldFill.INSERT) 更新:@TableField(fill = FieldFill.INSERT_UPDATE)
2.1.2.2.2 编写处理器
注:一定要注册成IOC组件@Component
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler{
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject){
//打印插入日志
log.info("start insert fill...");
//参数:字段名字、插入的值、要给哪个字段处理
//方法源码为 setFieldValByName(String fieldName,Object fieldVal,MetaObject metaObject)
this.setFieldValByName("createTime", new Date(), metaObject);
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject){
log.info("start update fill...");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
2.1.3 乐观锁
2.1.3.1 定义
乐观锁 无论干什么都很乐观,无论干什么都不会去上锁。如果出现问题,再更新值测试
悲观锁 无论干什么都很悲观,无论干什么都会去上锁,再去操作
当要更新一条记录的时候,希望这条记录没有被别人更新
官方解释如下:
乐观锁实现方式:
取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败
eg:设置乐观锁后 线程1 设置值var = A但未提交 线程2插队操作 也更新了这个值var = B 并且提交了。。。
这时由于有乐观锁的存在,此时线程1再提交不会覆盖线程2提交的值,此时即var = B,线程1提交失败(数值显示是线程2提交的var = B)
2.1.3.2 步骤
2.1.3.2.1 数据库增加version字段 并且设置默认值1 数字
2.1.3.2.2 实体类加对应字段 并且加上注解@Version
@Version
private Integer version;
2.1.3.2.3 注册组件
@MapperScan("XXX.mapper") //扫描mapper包的注解 统一放到mybatis配置类里
@EnbleTransactionManagement //开启事物注解
@Configuration //配置类注解
public class MybatisPlusConfig{
...
}
2.1.3.2.3.1 mybatis-plus 3.0.5
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
2.1.3.2.3.2 mybatis-plus3.4.0,乐观锁配置(OptimisticLockerInterceptor已经弃用),最新版本可以这样配置
//注册乐观锁插件
@Bean
public MybatisPlusInterceptor MybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
2.2配置持久层dao或者mapper接口
2.2.1 在对应XXXMapper接口上面继承基本接口 extends BaseMapper<T> (接口继承接口,接口之间是继承关系,不是实现关系),其中T为泛型,下面CRUD所使用的类
2.2.2 加上@Repository 代表持久层
2.2.3 在主类上加上@MapperScan("com.XXX.mapper") 可以指定要扫描的Mapper类的包的路径
注:@MapperScan和@ComponentScan都是扫描包,二者之间有什么区别
首先,@ComponentScan是组件扫描注解,用来扫描@Controller @Service @Repository这类,主要就是定义扫描的路径从中找出标志了需要装配的类到Spring容器中
其次,@MapperScan 是扫描mapper类的注解,就不用在每个mapper类上加@Mapper了
2.2.4 在test主类中测试
2.2.4.1 @Autowired private XXXMapper mapper @Test XXX(){mapper.需要测试的方法}
注:map.forech(System.out:println)(map、list可以使用forech循环打印(拉姆达表示))
2.3 配置日志
mybatis-pulus.configuration.long-impl = org.apache.ibatis.logging.stdout.StdoutImpl(此为默认配置,控制台输出,步骤、执行sql,结果,参数等)
- 点赞
- 收藏
- 关注作者
评论(0)