乐趣区

关于mybatis-plus:MybatisPlus使用

简介

业务场景

mybatisplus 该框架目标是帮忙咱们主动实现单表的 CRUD;

介绍

该框架指标是对 mybatis 框架只做加强不做扭转 –> 简化开发, 提高效率

个性

官网中个性如下:

原理

原理 –> 以对象的形式操作数据库

实现:

  1. 利用注解实现对象与表绑定 属性与字段绑定.
  2. 定义一个公共的 Mapper 接口, 定义公共的 CRUD 操作 利用泛型辨别对象.
  3. 依照特定的语法, 将对象转化为 sql 语句: 如下例:
 例子: 将 user 对象插入数据库中.
    userMapper.insert(user 对象);  // 程序员实现的最初的代码
    sql: insert into 表名 (字段.....) values (属性值......); 由 mp 动静拼接之后交由 mybatis 执行.

通过注解绑定, 由底层生成表名 (字段 …..); 传入属性值为为对象中的值; 再由 MP 动静拼接之后交由 mybatis 执行.

spring 整合 MP

1. 增加 jar 包依赖

<!--spring 整合 mybatis-plus 只导入 MP 包, 删除 mybatis 包 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency>

增加 MP 的 jar 包后要将 mybatis 的 jar 包删除,MP 中会蕴含 mybatis, 增加两个可能会抵触.

2. 原理具体实现:
1) 编辑 pojo 类须要增加注解:
@TableName(“ 表名 ”)– 实现表与对象关联, 如果 pojo 类名与表名统一 (不辨别大小写), 能够疏忽注解参数中表名
@TableId(type = IdType.AUTO)– 在主键属性上增加该注解, 示意此属性为主键且主键自增 (IdType 次要用 auto 表主键自增 /UUID 表全局惟一)

2)Mapper 接口继承 BaseMapper<T>– 留神理论利用时, 泛型 T 的引入, 写你所用的 pojo 类即可, 不增加的话数据库不能实现操作

3) 批改 yml 配置文件信息, 将 mybatis 改为 mybatis-plus 即可, 别的不须要更改, 做到只加强不批改:

mybatis-plus:
  #定义别名包
  type-aliases-package: com.jt.pojo
  #增加 xml 文件的依赖
  mapper-locations: classpath:/mybatis/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

MP API 应用

以下别离是 CRUD 的常见 API 应用, 具体阐明见官网和代码中注解 –https://baomidou.com/

package com.jt.test;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.UserMapper;
import com.jt.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.Arrays;
import java.util.List;

@SpringBootTest
public class TestMybatis {
    @Autowired
    private UserMapper userMapper;

    // 本地定义的 findAll 办法以及 sql
    @Test
    public void test01(){List<User> users = userMapper.findAll();
        System.out.println(users);

    }

    // 测试 MP 办法
    @Test
    public void test02(){
        // 查问 user 表全副数据
        List<User> users = userMapper.selectList(null);
        System.out.println(users);

    }

    /**
     * 1. 测试入库
     *  将用户信息   王大锤 20 男 入库
     */
    @Test
    public void insert(){User user=new User();
        user.setName("王大锤").setAge(20).setSex("男");
        userMapper.insert(user);
    }

    /**
     * 2. 查问练习
     *  查问 ID 为 21 的用户
     */
    @Test
    public void select01(){User user = userMapper.selectById(21);
        System.out.println(user);
        // 查问记录总数
        int count = userMapper.selectCount(null);
        System.out.println(count);
    }

    /**
     * 需要: 查问性别为女, 年龄大于 100 岁
     * 条件结构器: 动静拼接 where 条件的  多条件中默认的连接符 and
     * 常见逻辑运算符
     * 1.eq =    2.gt >    3.lt <
     * 4.ge >=   5.le <=
     */
    @Test
    public void select03(){QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("sex","女")
                .gt("age",100);
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);
    }

    /**
     * 需要:1. 查问名字中蕴含 '精' 字的男性  "% 精 %"
     *     2. 查问以精结尾的  % 精
     *     3. 查问以精结尾的  精 %
     */
    @Test
    public void select04(){QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.likeLeft("name","精")
        //queryWrapper.like("name","精")
                .eq("sex","男");
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);
    }

    /**
     * 需要: 查问 sex= 女 , 之后依照 age 倒序排列, 如果年龄雷同依照 id 排列
     */
    @Test
    public void select05(){QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("sex","女")
                .orderByDesc("age","id");
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);
    }

    /**
     * 需要: 查问 id 为 1,3,5,7,8,9 的数据
     * 关键字  in  or
     * 在关联查问中慎用
     */
    @Test
    public void select06(){Integer[] ids = {1,3,5,7,8,9};
        List<Integer> list = Arrays.asList(ids);
        List<User> users = userMapper.selectBatchIds(list);
        System.out.println(users);
    }

    /**
     * 需要: 删除 id 为 53 的数据
     */
    @Test
    public void delete01(){userMapper.deleteById(53);
    }

    /**
     * 需要: 批量删除 id 为 1,2,3,4 的数据
     */
    @Test
    public void delete02(){Integer[] ids={1,2,3,4};
        List<Integer> list = Arrays.asList(ids);
        userMapper.deleteBatchIds(list);
    }

    /**
     * 需要: 删除 age 为 30 的男性
     */
    @Test
    public void delete03(){QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("age","30")
                .eq("sex","男");
        userMapper.delete(queryWrapper);
    }

    /**
     * 需要: 将 id 为 6 的性别批改为女性
     */
    @Test
    public void update01(){User user=new User();
        user.setId(6).setSex("女");
        userMapper.updateById(user);
    }

    /**
     * 需要: 将 name 为悟空的角色名字改为卡卡罗特, 性别改为男
     */
    @Test
    public void update02(){User user = new User();
        user.setName("卡卡罗特").setSex("男");
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("name","悟空");
        userMapper.update(user,queryWrapper);
    }
}
退出移动版