首页 > 其他分享 >mybatis-plus(mp)常用概念以及demo实操

mybatis-plus(mp)常用概念以及demo实操

时间:2023-03-07 11:46:09浏览次数:49  
标签:demo version plus mp spring mybatis new com

概念:作为国内流行的持久层框架,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

相关文章

  • Visual Components帮助丹麦公司DTI在全球市场保持竞争力
    丹麦技术研究所(DTI)是通过商业项目或由丹麦国家政府或欧盟资助的项目为广泛行业提供研发服务的供应商。他们与客户密切合作,了解他们的具体需求,并通过使用机器人和自动化......
  • docker-compose搭建redis集群
    1、编写Redis配置文件#创建目录mkdir-p/home/docker/docker-redis/redis-cluster#切换至指定目录cd/home/docker/docker-redis/redis-cluster/#编写re......
  • MybatisPlus多表连接查询
    一、(一)背景内容软件应用技术架构中DAO层最常见的选型组件为MyBatis,熟悉MyBatis的朋友都清楚,曾几何时MyBatis是多么的风光,使用XML文件解决了复杂的数据库访问的难题。时至......
  • CAD Plus 移动端使用帮助
    Mac端使用帮助Englishhelp如果您有疑问或需要帮助请发送邮件至[email protected].权限要求1.1获取位置信息使用文件管理功能时显示网络信息需要获取位置信息权限......
  • C# 利用EPPlus获取合并单元格的值
    当我们想获取合并单元格的值的时候,例如a1,a2,a3行在j1列合并了单元格,读取值的时候 我们在 a1行读取到了值 a2,a3行均为空值这种问题解决方法代码......
  • logstash时间@timestamp转unix_ms毫秒时间戳
    2020-05-03使用date过滤器可以将unix时间戳、多种形式的时间字段转换为ISO8601的时间格式,可以参考官方教程 logstash-filter-date但是如何将@timestamp转成unix_ms却......
  • ENGG1310 P2.2 Data, Logic Gates & Binary Computation
    课程内容笔记,自用,不涉及任何assignment,exam答案Notesforself-use,donotincludeanyassignmentsorexamsDataRepresentations这里可以和前面介绍的数字信号/......
  • PSRS (Parallel Sorting by Regular Sampling)(基于MPI)
    (一)基于MPI 的程序设计方法并行程序设计可以通过多种方法实现,它们各有特点,并适合于不同的场合。最常用的是共享变量方法和消息传递方法。共享变量方法的主要特点是利......
  • 用线性二次模型建模大型数据中心,基于 MPC 进行冷却控制
    目录一个总述reviews0abstract1intro2relatedwork3DCcooling(问题定义)4MPC(method)4.1Modelstructure4.2Systemidentification4.3Control5实验5.1先比较一下sy......
  • tcpdump使用指南
    全网最详细的tcpdump使用指南 今天要给大家介绍的一个Unix下的一个 网络数据采集分析工具,也就是我们常说的抓包工具。与它功能类似的工具有wireshark,不同的......