随笔 - 21  文章 - 0  评论 - 0  阅读 - 6577 

概念:作为国内流行的持久层框架,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函数名图文对照表

 

posted on   realAdam  阅读(589)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示