Mybatis-Plus使用

578 阅读3分钟

1 核心功能

  • 通用 CRUD:定义好 Mapper 接口后,只需要继承 BaseMapper 接口即可获得通用的增删改查功能,无需编写任何接口方法与配置文件
  • 条件构造器:通过 EntityWrapper (实体包装类),可以用于拼接 SQL 语句,并且支持排序、分组查询等复杂的 SQL
  • 代码生成器:支持一系列的策略配置与全局配置,比 MyBatis 的代码生成更好用

2 基本配置

2.1 添加核心依赖

<!--       数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
<!--        mybatis-plus和Springboot整合-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
<!--        mybatis-plus代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- 模板引擎 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

2.2 配置文件application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: suruomo
    url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
server:
  port: 8070

功能体验

3.1 通用CRUD

实体类

package com.suruomo.mybatisplus.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

/**
 * @Author: suruomo
 * @Date: 2020/8/25 14:38
 * @Description:
 */
@Data
@TableName(value = "sys_user")
public class SysUser {
    /**
     * 登录账号
     * type = IdType.INPUT表示主键输入
     * 改为AUTO为自增
     */
    @TableId(type = IdType.INPUT)
    private String userId;

    /**
     * 用户昵称
     */
    private String userName;

    /**
     * 用户邮箱
     */
    private String email;

    /**
     * 手机号码
     */
    private String phonenumber;

    /**
     * 用户性别(0男 1女 2未知)
     */
    private String sex;

    /**
     * 密码
     */
    private String password;

    /**
     * 帐号状态(0正常 1停用)
     */
    private String status;

    /**
     * 删除标志(0代表存在 2代表删除)
     */
    private String delFlag;

    /**
     * 最后登陆IP
     */
    private String loginIp;

    /**
     * 最后登陆时间
     */
    private Date loginDate;

    /**
     * 创建者
     */
    private String createBy;

    /**
     * 创建时间
     * 时间自动填充
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 更新者
     */
    private String updateBy;

    /**
     * 更新时间
     * 时间自动修改
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

Mapper接口

package com.suruomo.mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.suruomo.mybatisplus.entity.SysUser;
import org.apache.ibatis.annotations.Mapper;

/**
 * @Author: suruomo
 * @Date: 2020/8/25 14:40
 * @Description: 继承 BaseMapper<T> 接口即可获得通用的增删改查功能
 */
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
}

通用CRUD方法: 通用方法.png

Service层

package com.suruomo.mybatisplus.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.suruomo.mybatisplus.entity.SysUser;

/**
 * @Author: suruomo
 * @Date: 2020/8/25 19:34
 * @Description:
 */
public interface SysUserService extends IService<SysUser> {
}
package com.suruomo.mybatisplus.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.suruomo.mybatisplus.mapper.SysUserMapper;
import com.suruomo.mybatisplus.entity.SysUser;
import com.suruomo.mybatisplus.service.SysUserService;
import org.springframework.stereotype.Service;

/**
 * @Author: suruomo
 * @Date: 2020/8/25 19:36
 * @Description:
 */
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {

}

测试

**
 * 通用Mapper层接口测试
 * 普通CRUD+分页
 */
@RunWith(SpringRunner.class)
@SpringBootTest
class MapperTest {

    @Resource
    private SysUserMapper sysUserMapper;

    /**
     * 查找所有
     */
    @Test
    void selectList() {
        List<SysUser> userList = sysUserMapper.selectList(null);
        userList.forEach(System.out::println);
    }

    /**
     * 分页查找
     */
    @Test
    void selectByPage() {
        Page<SysUser> page = new Page<>(1, 3);
        IPage<SysUser> userIPage  = sysUserMapper.selectPage(page, null);
        System.out.println("总记录数:" + page.getTotal());
        System.out.println("总页数" + page.getPages());
        List<SysUser> list=userIPage.getRecords();
        list.forEach(System.out::println);
    }
    /**
     * 插入
     */
    @Test
    void insert(){
        SysUser user=new SysUser();
        user.setUserId("25");
        user.setUserName("susu");
        sysUserMapper.insert(user);
    }

    /**
     * 根据id删除
     */
    @Test
    void deleteById(){
        sysUserMapper.deleteById("zxc");
    }

    /**
     * 根据map删除
     */
    @Test
     void DeleteByMap(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("user_id","25");
        sysUserMapper.deleteByMap(map);
    }
    /**
     * 根据id更新
     */
    @Test
    void update(){
        SysUser user=new SysUser();
        user=sysUserMapper.selectById("ry");
        user.setUserName("ry");
        sysUserMapper.updateById(user);
    }

}

3.2 自动填充功能

经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作: 1.数据库中添加相应字段 2.实体类中添加注解

/**
 * 创建时间
 * 时间自动填充
 */
@TableField(fill = FieldFill.INSERT)
private Date createTime;

/**
 * 更新时间
 * 时间自动修改
 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

3.实现元对象处理器接口

@Component
public class MyMetaObjectHandler 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);
    }
}

3.3 分页功能

MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能 配置类:

@Configuration
public class PaginationConfig {
    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor ();
    }
}

使用:

/**
 * 分页查找
 */
@Test
void selectByPage() {
    Page<SysUser> page = new Page<>(1, 3);
    IPage<SysUser> userIPage  = sysUserMapper.selectPage(page, null);
    System.out.println("总记录数:" + page.getTotal());
    System.out.println("总页数" + page.getPages());
    List<SysUser> list=userIPage.getRecords();
    list.forEach(System.out::println);

3.4 EntityWrapper 条件构造器

Mybatis-Plus 通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者Condition(与 EW 类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担,能够有效提高开发效率

实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等

注意: 使用的是数据库的字段,不是java的属性名称

参数说明见:baomidou.com/guide/wrapp…

使用:

@RunWith(SpringRunner.class)
@SpringBootTest
public class QueryWrapperTest {
    @Resource
    private SysUserMapper sysUserMapper;

    @Test
    public void selectByInfo(){
        QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
        // 查找性别为0,姓名为a开头的人
        wrapper.select("user_id", "user_name", "email","sex").eq("sex", 0).like("user_name", "a");
        List<SysUser> users = sysUserMapper.selectList(wrapper);
        users.forEach(user -> System.out.println(user));
    }
}

3.5 代码生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

public class GenerateCode {
    public static void main(String[] args) {
        // 需要构建一个 代码自动生成器 对象
        AutoGenerator mpg = new AutoGenerator();
        // 配置策略
        // 1、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath+"/src/main/java");
        gc.setAuthor("suruomo");//作者名称
        gc.setOpen(false);
        // 自定义文件命名,注意 %s 会自动填充表实体属性!
        gc.setServiceName("%sService");
        gc.setControllerName("%sController");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");

        mpg.setGlobalConfig(gc);

        //2、设置数据源
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8");
                dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        // dsc.setDriverName("com.mysql.jdbc.Driver"); //mysql5.6以下的驱动
        dsc.setUsername("root");
        dsc.setPassword("suruomo");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);
        //3、包的配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.suruomo"); //包名
        pc.setModuleName("mybatisplus"); //模块名
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);

        //4、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("sys_user","aluminum","sys_log"); // 设置要映射的表名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true); // 自动lombok;
        strategy.setLogicDeleteFieldName("deleted");
        strategy.setRestControllerStyle(true); //rest请求
        //自动转下划线,比如localhost:8080/hello_id_2
        strategy.setControllerMappingHyphenStyle(true);
        mpg.setStrategy(strategy);
        mpg.execute(); //执行
    }
}