MyBatis plus学习笔记

Mybatis plus

1、概述

文档:Redirect

特性:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

2、快速入门

1、创建数据库

2、创建springboot项目,导入依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
<!--连接数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
<!--数据持久层框架--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version></dependency>

3、连接数据库

spring.datasource.username=root
spring.datasource.password=20000211a
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

4、pojo-dao-service-controller

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {private Long id;private String name;private Integer age;private String email;
}
//Mapper接口继承BaseMapper
//所有的基本的CRUD就完成了
@Repository
public interface UserMapper extends BaseMapper<User> {
}

3、配置日志

配置日志只需要在application.properties文件中加上

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

 

4、CRUD拓展

@Test
void insert(){User user = new User();user.setName("徐翊皓");user.setAge(21);user.setEmail("1552485819@qq.com");userMapper.insert(user);
}

 

主键生成策略

分布式系统唯一id生成:分布式系统唯一ID生成方案汇总 - nick hao - 博客园

1、默认ID_WORKER全局唯一id

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {//这个是默认的@TableId(type = IdType.ID_WORKER)private Long id;private String name;private Integer age;private String email;
}

2、主键自增

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;
}
  • 实体类字段上 @TableId(type = IdType.AUTO)

  • 数据库字段也一定要设置为自动递增

3、其余的源码解释

public enum IdType {AUTO(0),//自动递增NONE(1),//未设置INPUT(2),//手动输入,设置为这种方式后需要自己输入,不然主键为nullID_WORKER(3),//默认的全局唯一idUUID(4),//全局唯一ID_WORKER_STR(5);//ID_WORKER的字符串表示法
​private int key;
​private IdType(int key) {this.key = key;}
​public int getKey() {return this.key;}
}

雪花算法

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。具体实现的代码可以参看GitHub - twitter-archive/snowflake: Snowflake is a network service for generating unique ID numbers at high scale with some simple guarantees.。

自动填充

创建时间,更新时间!这些操作都应该是自动完成的,我们不希望去手动完成!

阿里巴巴开发手册:所有的数据库表都要配置上gmt_create、gmt_modifield,并且需要自动化!

方式一:数据库级别(在企业中,不允许去修改数据库)

1、在表中新增字段create_time,update_time

 

 

2、实体类中增加属性

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;private Date createTime;private Date updateTime;
}

3、测试

@Test
void update(){User user = new User();user.setId(5L);user.setName("徐斌");user.setAge(50);user.setEmail("123456@qq.com");userMapper.updateById(user);
}

方式二:代码级别

1、删除数据库中的默认值和更新操作

 

 

2、实体类的属性上需要增加注解

//插入数据库时时自动填充
@TableField(fill = FieldFill.INSERT)
private Date createTime;
//插入或更新数据库时时自动填充
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

3、编写处理器来处理这个注解

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {//插入时的填充策略@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill");//setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)this.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}
​//更新时的填充策略@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill");//setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)this.setFieldValByName("updateTime",new Date(),metaObject);}
}

 

乐观锁

在面试过程中,经常会被问到乐观锁,悲观锁!

乐观锁实现方式:

  • 取出记录时,获取当前version

  • 更新时带上这个version

  • set version = newVersion where version = oldVersion

  • 如果version不对,就更新失败

乐观锁:1、先查询,获得版本号 version=1   2、执行更新时把version+1
--A
update user set name = "徐翊皓",version = version + 1
where id = 1 and version = 1
--B 线程抢先完成,这个时候version为2,会导致A线程修改失败
update user set name = "徐翊皓",version = version + 1
where id = 1 and version = 1

1、数据库添加version字段

 

2、实体类中增加属性

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;//乐观锁注解@Versionprivate Integer version;
}

3、注册组件

spring xml方式:

<bean class="com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor" id="optimisticLockerInnerInterceptor"/>
​
<bean id="mybatisPlusInterceptor" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor"><property name="interceptors"><list><ref bean="optimisticLockerInnerInterceptor"/></list></property>
</bean>

spring boot注解方式:

@MapperScan("com.xyh.mapper")
@Configuration
public class MyBatisPlusConfig {@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}
}

4、测试成功

//测试乐观锁成功
@Test
void test1(){User user = userMapper.selectById(1L);user.setName("倪大红");user.setAge(80);userMapper.updateById(user);
}

 

//测试乐观锁成功
@Test
void test1(){User user = userMapper.selectById(1L);user.setName("倪红");user.setAge(80);userMapper.updateById(user);
}

 

5、测试失败

//测试乐观锁失败
@Test
void test2(){User user = userMapper.selectById(1L);user.setName("a");User user1 = userMapper.selectById(1L);user1.setName("b");userMapper.updateById(user);userMapper.updateById(user1);//如果没有使用乐观锁,b就会覆盖a
}

分页插件

1、注册组件

@MapperScan("com.xyh.mapper")
@Configuration
public class MyBatisPlusConfig {//乐观锁@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}//分页插件@Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor();}
}

2、编写dao层代码

//Mapper接口继承BaseMapper
//所有的基本的CRUD就完成了
@Repository
public interface UserMapper extends BaseMapper<User> {IPage<User> selectByPage(Page<User> page,String name);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xyh.mapper.UserMapper"><select id="selectByPage" resultType="com.xyh.pojo.User">select * from user where name like "%"#{name}"%"</select>
</mapper>

3、测试

//分页查询
@Test
void testPage(){String name="徐";//参数一:当前页//参数二:页面大小Page<User> page = new Page<>(1,1);IPage<User> userIPage = userMapper.selectByPage(page, name);System.out.println(userIPage.getTotal());for (User user:userIPage.getRecords()){System.out.println(user);}
}

 

逻辑删除

物理删除:从数据库中直接移除

逻辑删除:在数据库中没有被移除,而是通过一个变量来让他失效!deleted=0==》deleted=1

管理员可以查看被删除的记录,防止数据丢失,类似于回收站

1、数据库增加字段

 

2、实体类中增加属性

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;//乐观锁注解@Versionprivate Integer version;//逻辑删除@TableLogicprivate Integer deleted;
}

3、注册组件

@MapperScan("com.xyh.mapper")
@Configuration
public class MyBatisPlusConfig {//乐观锁@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}//分页插件@Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor();}//逻辑删除@Beanpublic ISqlInjector sqlInjector(){return new LogicSqlInjector();}
}

4、配置文件

# 逻辑已删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-delete-value=1 
# 逻辑未删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0

5、测试

@Test
void delete(){userMapper.deleteById(5L);System.out.println(userMapper.selectById(5L));
}

 

5、性能分析插件

用于输出每条sql以及执行的时间

6、条件查询器(Wrapper)

还是要去看官方文档

@SpringBootTest
public class WrapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid test1(){userMapper.selectList(new QueryWrapper<User>().eq("name","徐翊皓").between("age",20,30));}
}

7、代码生成器

1、导入依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.3.1.tmp</version>
</dependency>
<!-模板引擎,我们这里选择的是默认的:velocity->
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.0</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

2、编写一个类

//代码自动生成
public class GeneratorCode {public static void main(String[] args) {// 需要构建一个 代码自动生成器 对象AutoGenerator mpg = new AutoGenerator();// 配置策略// 1、全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");gc.setOutputDir(projectPath + "/src/main/java");gc.setAuthor("徐翊皓");gc.setOpen(false);gc.setFileOverride(false); // 是否覆盖gc.setServiceName("%sService"); // 去Service的I前缀gc.setIdType(IdType.AUTO);gc.setDateType(DateType.ONLY_DATE);gc.setSwagger2(false);mpg.setGlobalConfig(gc);//2、设置数据源DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("20000211a");dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);//3、包的配置PackageConfig pc = new PackageConfig();pc.setParent("com.xyh");pc.setEntity("pojo");pc.setMapper("mapper");pc.setService("service");pc.setServiceImpl("service.impl");pc.setController("controller");mpg.setPackageInfo(pc);//4、策略配置StrategyConfig strategy = new StrategyConfig();strategy.setInclude("user"); // 设置要映射的表名strategy.setNaming(NamingStrategy.underline_to_camel);strategy.setColumnNaming(NamingStrategy.underline_to_camel);strategy.setEntityLombokModel(true); // 自动lombok;strategy.setLogicDeleteFieldName("deleted"); // 逻辑删除// 自动填充配置TableFill createTime = new TableFill("create_time", FieldFill.INSERT);TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);ArrayList<TableFill> tableFills = new ArrayList<>();tableFills.add(createTime);tableFills.add(updateTime);strategy.setTableFillList(tableFills);// 乐观锁strategy.setVersionFieldName("version");strategy.setRestControllerStyle(true);strategy.setControllerMappingHyphenStyle(true); //localhost:8080/hello_id_2mpg.setStrategy(strategy);mpg.execute(); //执行}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68359.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

商品亲和性分析与关联规则挖掘

商品亲和性分析 亲和性分析根据样本个体之间的关系&#xff0c;确定它们关系的亲疏。它主要根据两个指标统计商品之间的亲和性&#xff1a; 支持度&#xff1a;支持度指的是数据集中规则应验的次数。&#xff08;商品交易中同时买A商品和B商品的交易数量【支持度也可以为次数…

js 数组的 forEach,some,every,reduce,sort 方法

forEach() 方法的使用 forEach 遍历数组的每一项 const arr [小红,倪大红,苏大强,我滴宝]arr.forEach((item,index)>{if(item 苏大强){console.log(index); // 2}});some() 方法的使用 从开始便利找到符合条件的便停止便利&#xff0c;相比 forEach 在性能上有一定优势…

Python 利用百度文字识别 API 识别并提取图片中文字

Python 利用百度文字识别 API 识别并提取图片中文字 利用百度 AI 开发平台的 OCR 文字识别 API 识别并提取图片中的文字。首先需注册获取 API 调用的 ID 和 key&#xff0c;步骤如下&#xff1a; 打开百度AI开放平台&#xff0c;进入控制台中的文字识别应用(需要有百度账号&a…

调用阿里API实现图片中的文字识别

作者介绍 王雪玉&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff1a;2239580540qq.com 王泽宇&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生&#xf…

李飞飞高徒教你从0到1构建GPT,马斯克点赞

詹士 发自 凹非寺量子位 | 公众号 QbitAI “从0到1手搓GPT”教程来了&#xff01; 视频1个多小时&#xff0c;从原理到代码都一一呈现&#xff0c;训练微调也涵盖在内&#xff0c;手把手带着你搞定。 该内容刚发出来&#xff0c;在Twitter已吸引400万关注量&#xff0c;HackerN…

马斯克、米哈游轮番注资,AI医疗会是下一个风口吗?

图片来源&#xff1a;由无界AI生成 医疗健康一直都是老生常谈的话题&#xff0c;如今这个领域正面临着诸多挑战&#xff0c;如成本不断攀升或是全球性流行病等&#xff0c;而脑机接口等AI技术的出现有望为医疗领域提供新的解决方案。 如果你是科幻迷&#xff0c;你可能对脑机接…

《战略品牌管理》思维导图,教你如何对品牌进行管理

品牌一直在我们的生活中扮演了很重要的作用&#xff0c;它影响了我们的决策&#xff0c;甚至让我们痴迷。可是很少有人真正理解它的本质以及它是怎么建立并成长的&#xff0c;而战略品牌管理知识便是这样管理品牌的一本书&#xff0c;它能帮我们解释我们生活中的很多现象&#…

薅羊毛我愿称Python为最强,Python 自动化带你轻松赚钱

ps&#xff1a;本文仅限用于技术交流&#xff0c;请勿用于其他用途。 准 备 工 作 在编写代码之前&#xff0c;需要做如下准备工作&#xff1a; 1、配置好 Android ADB 开发环境 2、Python 虚拟环境内安装 pocoui 依赖库 3、操作剪切板的应用 APK 编 写 代 码 我们分 7 …

薅羊毛算副业吗?薅羊毛到底是怎么赚钱的?

薅羊毛算副业吗?薅羊毛到底是怎么赚钱的? 薅羊毛当然也算是一种副业! 薅羊毛拿佣金的起初,我的原因应该跟大部分人事一样的,“挣钱”。 我是先在知乎上,小红书大概了解的“薅羊毛”的运作方式,然后加入一个羊毛裙看了一下别人是怎么操作的,当时觉得也是很简单的,每…

羊毛大军杀入币圈,有人月入过万,有人惨遭反薅,沦为韭菜

文 | 棘轮 比萨 空投糖果、“月入过万”、“躺赚”……羊毛党大军&#xff0c;早已杀入币圈。 羊毛党圈流传的“史上最贵羊毛”——ONT空投&#xff0c;就出自币圈。甚至有职业羊毛党因此购入保时捷。 相较于互联网圈“羊毛”&#xff0c;币圈“羊毛”往往不需注册、实名验证。…

知乎带货月入过万的赚钱路子,前期操作后期可躺赚

如果说网络上有哪些值得投入并真正当做一个优质副业项目来操作的话&#xff0c;知乎好物推荐应该算一个&#xff0c;今天就跟大家聊聊知乎好物这个网络赚钱项目。 目前已经有很多小伙伴以此为副业&#xff0c;并且取得了很好的成绩&#xff0c;做到了睡后收入。 知乎好物&…

技术创造价值,手把手教你薅羊毛篇

距离上一篇年终总结的文章已经过了3个多月了&#xff0c;在年终总结中写到了利用脚本自动薅羊毛的话题&#xff0c;评论里有不少小伙伴比较感兴趣。so&#xff0c;今天就来给大家详细介绍一下如何让技术创造价值&#xff08;得给薅羊毛上升一个层次&#xff09;。本文没有什么技…

CSDN是如何让我副业月入过万的?

始 我跟 CSDN 的缘分要从 2011 年说起&#xff0c;当时我正上高二&#xff0c;当时好像是在搞鼓 MFC。当时家里有了第一台电脑&#xff0c;我也再也不用去黑网吧去敲代码了&#xff0c;在家搜索资料的时候出现在我眼帘之中&#xff0c;并且对我有帮助的基本上都是 CSDN 上的内…

薅羊毛 | Python 自动化带你轻松赚钱

作者&#xff1a;星安果 来源&#xff1a;AirPython 阅读文本大概需要 10 分钟。 1 目 标 场 景 最近&#xff0c;有一个朋友告诉我&#xff0c;她在某平台上购买了一部手机&#xff0c;收到货之后发现商品质量挺好的&#xff0c;价格也不贵。 临了随手给了个好评&#xff0c;商…

来来来,教你如何智慧薅羊毛!

提到边缘计算&#xff0c;熟悉ToB技术的朋友&#xff0c;首先可能想到的就是运营商的5G MEC&#xff08;移动边缘计算&#xff09;&#xff0c;以及云计算中的融合边缘系统理念。 的确&#xff0c;作为全球公认的创新技术趋势&#xff0c;边缘计算如今已经被广泛用于云计算、5G…

互联网薅羊毛指南

点击上方“程序猿杂货铺”&#xff0c;“星标或置顶公众号” 第一时间获取价值内容 阅读本文大概需要 9 分钟 本文经授权转载于公众号 | Python爱好者社区 作者 | 王大伟 微软最有价值专家&#xff08;MVP&#xff09; 薅羊毛&#xff0c;一种参与各种优惠活动的新型说法&#…

CSDN给你一个薅羊毛的机会!你真的不要吗?

抢红包、集福卡、转锦鲤等等&#xff0c;每年过年过节&#xff0c;各种价值几十亿的瓜分活动&#xff0c;对于网络冲浪选手来说&#xff0c;眼花缭乱但也乐趣满满。 可现实是&#xff1a;你抢了5毛8&#xff0c;人家抢了好几万&#xff01; 甚至前段时间&#xff0c;字节跳动安…

go-cqhttp QQ机器人入门

有关go-cqhttp QQ机器人的一些小问题 基础介绍介绍一些名词***2022-04-07更新***小问题汇总&#xff1a; 基础介绍 go-cqhttp机器人是基于onebot协议的一个应用,官网&#xff1a;https://docs.go-cqhttp.org/可以制作QQ机器人。娱乐性还是蛮强的。之前研究的时候发现网上的教程…

【Re:从零开始的QQ机器人搭建】——基于go-cqhttp和python

【Re&#xff1a;从零开始的QQ机器人搭建】—— 基于go-cqhttp 警告&#xff1a;小心智械危机&#xff08; 前言 之前酷Q用的好好的&#xff0c;谁知道刚打完工会战不到2天tx就封了大部分机器人。所幸小部分有生力量保留了下来&#xff0c;必可活用于下次机器人搭建。 一、…

使用NoneBot2可视化平台搭建QQ聊天机器人:本地和云部署教程

NoneBot是一个基于Python 3.8的异步、开源和可扩展的框架&#xff0c;用于构建和运行聊天机器人&#xff0c;支持各种聊天平台&#xff0c;如Telegram&#xff0c;Discord和WeChat。它是基于nonebot库构建的&#xff0c;提供了一个易于使用的界面&#xff0c;用于创建聊天机器人…