Mybatis-plus学习-最全细致讲解

x33g5p2x  于2022-02-07 转载在 其他  
字(9.4k)|赞(0)|评价(0)|浏览(323)

Mybatis的升级版

首先说一下这个Mybatis-plus他自己集成了所有的CRUD方法,所以我们先简单的写一个小测试:

启动类:

package com.example.Demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
@MapperScan("com.example.Demo.mapper")
public class MybatisPlusStudyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusStudyApplication.class, args);
    }



}

Mapper层:只需要继承接口

package com.example.Demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.Demo.pojo.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper extends BaseMapper<User> {

}

实体类:

package com.example.Demo.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String email;
}

测试:

package com.example.Demo;
import com.example.Demo.mapper.UserMapper;
import com.example.Demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class MybatisPlusStudyApplicationTests {

    @Autowired
    private UserMapper userMapper;
    @Test
    void contextLoads() {
        List<User> users = userMapper.selectList(null);

       users.forEach(System.out::println);
    }

}

配置文件:

server.port=7099
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

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.global-config.db-config.id-type=auto
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

测试结果:

需要注意的一个问题:

注意:主启动类扫描所有接口

插入+主键生成策略:

一旦手动写id必须写setid

public enum IdType {
     
    AUTO(0),//数据库ID自增  
    NONE(1),//该类型为未设置主键类型      
    INPUT(2),//用户输入ID
      		 //该类型可以通过自己注册自动填充插件进行填充  
    
//以下3种类型、只有当插入对象ID 为空,才自动填充。     
    ID_WORKER(3),//全局唯一ID (idWorker)      
    UUID(4),//全局唯一ID (UUID)          
    ID_WORKER_STR(5);//字符串全局唯一ID (idWorker 的字符串表示)

CRUD操作:

package com.example.Demo;
import com.example.Demo.mapper.UserMapper;
import com.example.Demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class MybatisPlusStudyApplicationTests {

    @Autowired
    private UserMapper userMapper;
    /**
     * 查询测试
     */
    @Test
    void contextLoads() {
        List<User> users = userMapper.selectList(null);
       users.forEach(System.out::println);
    }
    /**
     * 测试插入
     */
    @Test
    public  void testInstert(){
        User user = new User();
        user.setName("邓家佳");
        user.setEmail("2534625115@qq.com");
        user.setAge(3);
        int result = userMapper.insert(user);
        System.out.println(result);
        System.out.println(user);
    }
    /**
     * 测试更新
     */
    @Test
    public  void  TestUpdate(){
        User user = new User();
        user.setId(9L);
        user.setName("范涛之");
        int i = userMapper.updateById(user);
        System.out.println(i);
    }


}

自动填充

  • 创建时间 . 修改时间! 这些个操作都是自动化完成的,我们不希望手动更新!

  • 阿里巴巴开发手册:所有的数据库表:gmt_create .gmt_modified几乎所有的表都要配置上!而且需要自动化!

1:首先,新建字段写好注解:

package com.example.Demo.pojo;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.omg.CORBA.IDLType;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    /**
     * 第一个注解:逐渐自增
     */
    @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;

}

2:编写处理器:

package com.example.Demo.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 时间自动填充处理器
 */
@Slf4j
@Component
public class MyDataHandler implements MetaObjectHandler {

    // 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始执行插入.........");
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    // 更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始执行更新.........");
        this.setFieldValByName("updateTime",new Date(),metaObject);

    }

}

乐观锁的处理:

1:数据库添加字段默认为1:

实体类增加字段:

3:配置乐观锁插件:

// 注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {

        return new OptimisticLockerInterceptor();
    }

测试:乐观锁成功:单一线程

测试:乐观锁失败:

/**
     * 测试乐观锁失败:多线程
     */
    @Test
    public  void  TestClocker2() {
        // 线程一:
        //查询用户信息
        User user = userMapper.selectById(5L);
        user.setName("kuangshen111");
        user.setEmail("124621515@qq.com");

        // 线程二:模拟另外一个用户执行插队操作
        User user2 = userMapper.selectById(5L);
        user2.setName("kuangshen222");
        user2.setEmail("124621515@qq.com");

        // 自旋锁尝试多次提交
        userMapper.updateById(user2); //如果没有乐观锁就回覆盖插队线程的值

    }

查询操作:批量查询

/**
     * 查询测试
     */
    @Test
    public void  TestSelect(){
        List<User> users = userMapper.selectBatchIds(Arrays.asList(5, 6, 7));
        users.forEach(System.out::println);
    }

查询:按条件:适用Map

/**
     * 条件查询
     */

    @Test
    public  void  testTJ(){
        HashMap<String, Object> map = new HashMap<>();
        // 自定义查询
        map.put("name","邓家佳");
        List<User> users = userMapper.selectByMap(map);
        users.forEach(System.out::println);
    }

分页查询:

1:配置分页插件:

// 分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        return paginationInterceptor;
    }

2:直接使用Page对象

/**
     * 分页查询
     */
    @Test
    public  void  TestPage(){
        // 参数一:当前页  参数二:页面大小
        Page<User> page = new Page<>(1,4);
        userMapper.selectPage(page,null);

        page.getRecords().forEach(System.out::println);
    }

删除操作:根据ID删除

/**
     * 删除操作:
     */
    @Test
    public void testDeleteById(){
        userMapper.deleteById(12L);

    }

    /**
     * 批量删除通过id
     */
    public  void testDeleteByBatchId(){
        userMapper.deleteBatchIds(Arrays.asList(5L,8L,9L));

    }

    /**
     * 条件删除
     */
      */
    public  void testDeleteByMap(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("name","哈哈哈");
        userMapper.deleteByMap(map);
    }

逻辑删除:

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

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

1:数据库中增加字段:

2:实体类增加属性:

/**
     * 逻辑删除
     */
    @TableLogic
    private  Integer deleted;

3:配置组件:

// 逻辑删除组件
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

配置文件的修改:

# 配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

测试:

性能分析插件

1:增加插件:

/**
     * SQL 执行性能分析插件
     * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
     */
    @Bean
    @Profile({"dev","test"})// 设置 dev test 环境开启
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }

配置文件增加:spring.profiles.active=dev

条件构造器:Wrapper 六个测试

手写一些复杂sql

package com.example.Demo;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.Demo.mapper.UserMapper;
import com.example.Demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;
import java.util.Map;

@SpringBootTest
public class WrapperTest {

    @Autowired
    private UserMapper userMapper;

    /**
     * 测试一:查询name不为空并且邮箱不为空的用户 ,同时年龄大于等于12岁
     */

    @Test
    void  TestWr(){
         QueryWrapper<User> wrapper = new QueryWrapper<>();
         wrapper.isNotNull("name")
                .isNotNull("email")
                .ge("age",12);
        userMapper.selectList(wrapper).forEach(System.out::println);  //和我们学习的map对比一下

    }

    /**
     * 测试二:名字等于范涛之的
     */
    @Test
    void test2(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name","范涛之");

        User user = userMapper.selectOne(wrapper);
        System.out.println(user);
    }

    /**
     * 测试三:查询年龄在20-30岁之间的用户
     */
    @Test
    void test3(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.between("age",20,30);
        Integer count = userMapper.selectCount(wrapper);//查询结果数
        System.out.println(count);
    }

    /**
     * 测试四:模糊查询:名字里面不包含范的
     */

    @Test
    void test4(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 左和右:百分号在哪边 这个就相当于:t%也就是t开头
        wrapper.notLike("name","范")
                .likeRight("email","t");
        List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
        maps.forEach(System.out::println);
    }

    /**
     * 测试五:子查询
     */
    @Test
    void test5(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // id在子查询中查出来
        wrapper.inSql("id","select id from user where id<3");

        List<Object> objects = userMapper.selectObjs(wrapper);
        objects.forEach(System.out::println);
    }

    /**
     * 测试六:排序:通过id进行排序
     */
    @Test
    void test6(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // id在子查询中查出来
        wrapper.orderByDesc("id");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);

    }



}

代码自动生成器:

  • dao、pojo、service、controller都给我自己去编写完成!

  • AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、

  • Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

  • 只需要改实体类名字 和包名 还有 数据库配置即可

相关文章

微信公众号

最新文章

更多

目录