概念:作为国内流行的持久层框架,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数据库以及数据库数据
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, '[email protected]'), (2, 'Jack', 20, '[email protected]'), (3, 'Tom', 28, '[email protected]'), (4, 'Sandy', 21, '[email protected]'), (5, 'Billie', 24, '[email protected]');
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扫描
@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用下面那个方法就行
// 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), [email protected](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函数名图文对照表
标签:demo,version,plus,mp,spring,mybatis,new,com From: https://www.cnblogs.com/thomasvide/p/17187498.html