概念:作为国内流行的持久层框架,mp是mybatis的拓展,并不改变mybaits的底层,因此使用mybatis的项目可以无缝使用mp进行迭代
本博客旨在温习mp常用的使用场景、使用方式
(一)demo框架搭建
使用springboot作为开发框架,集成lombok等必要插件(下文提供maven文件) 注:IDE:idea Version:2020.1
A.1 使用spring initializr进行项目初始化,进去包名随便填填就行(type记得选maven)
A.2 springboot版本最好在2.1以上,不然数据库链接字符串可能会报错(2.1以下使用jdk1.5的驱动)
A.3 Maven添加,跟着粘贴一下就行
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1</version> </dependency> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency> <!--lombok用来简化实体类--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
A.4 lombok idea插件商店里自己下载
A.5 mysql数据库以及数据库数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | CREATE TABLE USER ( id BIGINT (20) NOT NULL COMMENT '主键ID' , NAME VARCHAR (30) NULL DEFAULT NULL COMMENT '姓名' , age INT (11) NULL DEFAULT NULL COMMENT '年龄' , email VARCHAR (50) NULL DEFAULT NULL COMMENT '邮箱' , PRIMARY KEY (id) ); INSERT INTO user (id, name , age, email) VALUES (1, 'Jone' , 18, 'test1@baomidou.com' ), (2, 'Jack' , 20, 'test2@baomidou.com' ), (3, 'Tom' , 28, 'test3@baomidou.com' ), (4, 'Sandy' , 21, 'test4@baomidou.com' ), (5, 'Billie' , 24, 'test5@baomidou.com' ); |
A.6
数据库 properties配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
A.7 实体类、mapper实现、以及入口mapper扫描
1 2 3 4 5 6 7 | @Data public class User { private Long id; private String name ; private Integer age; private String email; } |
@Repostry
public interface UserMapper extends BaseMapper<User> { }
SpringBootTest
@MapperScan("com.example.demo2.mapper")
class Demo2ApplicationTests {
@Test
void contextLoads() {
}
}
A.8 基本项目环境搭建完成,打印看看效果
打印代码
@Autowired UserMapper userMapper; @Test void contextLoads() { List<User> users = userMapper.selectList(null); System.out.println(users); }
打印结果
B.mp的相关操作及介绍
B.1 打开日志(propertis里配置)(主要是看sql的执行流程)
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
效果:
B.2 mp的主键策略
一般1和3用的最多 1是19位随机数字(通过雪花算法完成随机) 3是自增,其它可以自己去了解
B.3 自动填充(使用场景:数据库经常有updatetime和createtime 或者updateby createby等字段,使用mp提供的自动填充可以帮我们在crud时自动填充进去)
实体类添加新字段(用于测试)
编写新类实现MetaObjectHandler 并对两个方法进行重写,交给spring管理,完成业务需求
(注意 setFieldValByName 第一个Field的createTime对应的是实体类的值)
@Component
public class MyObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
结果:
B.5 乐观锁实现
简要介绍乐观锁:业务场景 如果一个人月薪是3000 两个人要对3000这个值进行修改,A将3000改为5000 B将3000改为4000,如果A先修改那么B应该对5000这个值进行操作而不是对3000这个值进行操作(丢失更新问题)
乐观锁解决上述问题:
-
1 在取出记录时,获取当前的数据version=1
-
2 代码更新时,带上这个 version 1
-
3 执行更新时,set version = version +1 where version = version
- 4 如果两个version相同那么发生错误,操作不会执行 (1+1不等于1)
先添加字段和注解(数据库也要做此操作)

自动填充记得新增
config包下编写配置代码并注入(注:我这里用的是旧版MP,新版MP用下面那个方法就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // Spring Boot 方式 @Configuration @MapperScan( "按需修改" ) public class MybatisPlusConfig { /** * 旧版 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } /** * 新版 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return mybatisPlusInterceptor; } } |
先新增一个试试:
然后编写update代码查看sql效果
JDBC Connection [HikariProxyConnection@250702170 wrapping com.mysql.jdbc.JDBC4Connection@4a14c44f] will not be managed by Spring ==> Preparing: UPDATE user SET name=?, age=?, email=?, create_time=?, update_time=?, version=? WHERE id=? AND version=? ==> Parameters: emlia(String), 18(Integer), 1145133@163.com(String), 2023-03-07 10:38:03.0(Timestamp), 2023-03-07 10:42:46.815(Timestamp), 2(Integer), 1632933600454127618(Long), 1(Integer) <== Updates: 1
可以看出在update操作的时候会去检索version版本,乐观锁就算实现了
B.6批量查询(查询id 1,2,3的用户列表) 没啥难度
@Test void batchSelect(){ List<User> userList= userMapper.selectBatchIds(Arrays.asList(1,2,3)); System.out.println(userList); }
B.7条件查询 必知必会(这里先用map,也可以用wrapper实现)
@Test void mapSelect(){ Map<String,Object> map=new HashMap<>(); map.put("name","Jack"); map.put("age",20); List<User> users=userMapper.selectByMap(map); System.out.println(users); }
B.8分页查询 每个公司封装的都不同,建议按照公司规范写,这里就不介绍了
B.9根据id删除 调deletebyid就行 不介绍了
B.10批量删除 参数填对就行 不介绍了
B.11条件删除 跟B.7写法差不多,都是map填条件 不介绍了
B.12逻辑删除
大概意思就是实体类和数据库添加 delete字段,如果执行逻辑删除将delete的值置为1,检索的时候会在后面添加条件不检索出1的值达到逻辑删除的效果,总的来说就是假删除以防数据后期有用
实现比较简单 不介绍了
C.wrapper构造器练习
重要部分 着重练习querywrapper(文末有图表)
ge(大于等于)eq\ne\gt\lt\le都是同理,后面不做演示
@Test void select(){ QueryWrapper<User> queryWrapper=new QueryWrapper<>(); //ge\gt\le\lt queryWrapper.ge("age",21); List<User> users=userMapper.selectList(queryWrapper); System.out.println(users); }
后面的各种关键字请自行根据业务研究,wrapper原理不过是根据提供属性值进行sql拼接,大概对查询逻辑做到心里有数就越用越熟
本文结束:下一篇可能会熟悉一下lambda表达式
附:
querywarpper函数名图文对照表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现