Mybatis-Plus学习的第一天

举报
多米诺的古牌 发表于 2021/02/20 15:13:35 2021/02/20
【摘要】 MybatisPlus在Mybatis的基础上只做增强不做改变,为简化而生会根据条件自动拼接动态sql1.配置mysql  1.1 mybatis5配置 驱动为com.mysql.jdbc.Driver    spring.datasource.url=jdbc:mysql://localhost:3306/数据库名称?useSSL=false(是否使用安全连接)&useUnicode=tr...

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,结果,参数等)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。