Mybatis-Plus的使用

目录

一、创建并初始化数据库

1、创建数据库:

2、创建 User 表

 3、插入数据

二、创建SpringBoot项目

1、引入依赖

2、添加application.yml配置文件

3、创建实体类User

4、创建UserMapper

5、在主启动类上添加@MapperScan

6、在测试类中测试功能

三、更新表的各个操作

1、自动填充

1.1在User表中添加datetime类型的新的字段 create_time、update_time

1.2实体上添加注解

1.3元对象处理器接口添加初始操作

2.乐观锁(添加版本号,先比对版本号,修改之后版本号+1)

2.1数据库中添加version字段

 2.4通过MybatisPlusConfig 配置类往容器中放入组件

2.5测试乐观锁

3 、分页功能

3.1通过配置类放入组件

 3.2测试分页

4逻辑删除

4.2实体类添加deleted 字段

4.3元对象处理器接口添加deleted的insert默认值

4.4通过配置类添加组件

4.5测试逻辑删除

四.代码生成器

一、创建并初始化数据库

1、创建数据库:

create database if not exists mybatis_plus;

2、创建 User 表

use mybatis_plus;

CREATE TABLE user
(
	id InT(11) primary key auto_increment  COMMENT '主键ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(30) NULL DEFAULT NULL COMMENT '邮箱',
);

 3、插入数据

DELETE FROM user;

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');

二、创建SpringBoot项目

1、引入依赖

<dependencies>

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>


        <!--开发者工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!--lombok用来简化实体类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

2、添加application.yml配置文件

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=UTC
    username: root #数据库账号
    password: 1234 #数据库密码
    driver-class-name: com.mysql.cj.jdbc.Driver   #mysql8.0使用cj包下的

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #mybatis日志输出

3、创建实体类User

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

4、创建UserMapper

@Repository
public interface UserMapper extends BaseMapper<User> {
}

5、在主启动类上添加@MapperScan

@MapperScan("chang.mapper")//放在配置类上作用也一样

6、在测试类中测试功能

  @Autowired 
    private UserMapper userMapper; 

    @Test
    public void testSelectList() {
        //UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
        //所以不填写就是无任何条件
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }

   @Test//测试添加
    public void testInsert(){
        User user = new User();
        user.setName("chang");
        user.setAge(222);
        user.setEmail("74194741@qq.com");

        int result = userMapper.insert(user);
        System.out.println(result); //影响的行数
        System.out.println(user); //id自动回填
    }

   @Test//测试更新
    public void testUpdateById(){
        User user = new User();
        user.setId(1L);
        user.setAge(18);
        int result = userMapper.updateById(user);
        System.out.println(result);
        System.out.println(user);

    }

三、更新表的各个操作

1、自动填充

1.1在User表中添加datetime类型的新的字段 create_time、update_time

1.2实体上添加注解

   @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

1.3元对象处理器接口添加初始操作

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

import java.util.Date;

@Component  //实现元对象处理器接口
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
//    private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);

    //使用mp(mybatisplus)实现添加操作,这个方法执行
    @Override
    public void insertFill(MetaObject metaObject) {
//        LOGGER.info("start insert fill ....");
        log.info("start insert fill ....");
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("version", 1, metaObject);
        this.setFieldValByName("deleted", 0, metaObject);
    }

    //使用mp(mybatisplus)实现更新操作,这个方法执行
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
//        LOGGER.info("start update fill ....");
        this.setFieldValByName("updateTime", new Date(), metaObject);

    }
}

2.乐观锁(添加版本号,先比对版本号,修改之后版本号+1)

        用于主键生成策略

2.1数据库中添加version字段

ALTER TABLE `user` ADD COLUMN `version` INT(11);

2.2实体类添加version字段

@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;

 2.3元对象处理器接口添加version的insert默认值

@Override
public void insertFill(MetaObject metaObject) {
    ......
    this.setFieldValByName("version", 1, metaObject);//设置乐观锁的默认值
}

 2.4通过MybatisPlusConfig 配置类往容器中放入组件

@Bean//高版本中为OptimisticLockerInnerInterceptor
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

2.5测试乐观锁

  //测试乐观锁
    @Test
    public void testOptimisticLocker(){
        //先查询数据
        User user = userMapper.selectById(8L);
        //修改数据
        user.setAge(99);
        userMapper.updateById(user);
    }//修改之后版本号由1变为了2

3 、分页功能

3.1通过配置类放入组件

 //分页插件    高版本不用配置
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

 3.2测试分页

 @Test//测试分页功能
    public void testSelectPage(){
        //创建Page对象,两个参数分别代表 当前页和每页显示记录数
        Page<User> page = new Page<>(1, 3);
        userMapper.selectPage(page , null);
        page.getRecords().forEach(System.out::println);
        System.out.println(page.getCurrent());//当前页
        System.out.println(page.getRecords());//每页数据List集合
        System.out.println(page.getPages());//总页数
        System.out.println(page.getSize());//每页显示记录数
        System.out.println(page.getTotal());//总数量
        System.out.println(page.hasNext());//是否有下一页
        System.out.println(page.hasPrevious());//是否有上一页
    }

4逻辑删除

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

逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

4.1数据库中添加 deleted字段

ALTER TABLE `user` ADD COLUMN `deleted` boolean

4.2实体类添加deleted 字段

@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;

4.3元对象处理器接口添加deleted的insert默认值

@Override
public void insertFill(MetaObject metaObject) {
    ......
    this.setFieldValByName("deleted", 0, metaObject);
}

4.4通过配置类添加组件

 //逻辑删除插件(假删除) 高版本不用配置
    @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }

4.5测试逻辑删除

//测试 逻辑删除
    @Test
    public void testLogicDelete() {
        int result = userMapper.deleteById(1L);
        System.out.println(result);
    }//执行完成后,再查询所有信息,此条信息不存在

四.代码生成器

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;


public class CodeGenerator {

    @Test
    public void run() {

        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir("D:\\IDEAworkspace\\guli_parent\\service\\service-edu" + "/src/main/java");
        gc.setAuthor("chang");
        gc.setOpen(false); //生成后是否打开资源管理器
        gc.setFileOverride(false); //重新生成时文件是否覆盖
        gc.setServiceName("%sService");	//去掉Service接口的首字母I
        gc.setIdType(IdType.ID_WORKER_STR); //主键策略
        gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
        gc.setSwagger2(true);//开启Swagger2模式

        mpg.setGlobalConfig(gc);

        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/guli?useSSL=false&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("1234");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.chang"); //最外围包名
        pc.setModuleName("edu"); //模块名
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("edu_comment");//数据库中的表名
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
        strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀

        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作

        strategy.setRestControllerStyle(true); //restful api风格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符

        mpg.setStrategy(strategy);


        // 6、执行
        mpg.execute();
    }
}


版权声明:本文为m0_51505198原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。