springboot整合mybatis-plus(03)

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

1.mybatis-plus快速入门

1.1导入相应jar包

<!--mybatis-plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.21</version>
        </dependency>

1.2配置数据源

spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.username=root
spring.datasource.druid.password=654123
spring.datasource.druid.url=jdbc:mysql:///mybatis_plus?characterEncoding=UTF8&&serverTimezone=Asia/Shanghai

1.3创建实体类以及dao 接口 必须继承BaseMapper接口

package com.ganin.springbootmp.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ganin.springbootmp.entity.User;

public interface UserDao extends BaseMapper<User> {
}

1.4在主启动类上添加dao接口的扫描

@SpringBootApplication
@MapperScan(basePackages = "com.ganin.springbootmp.dao")//开启接口的扫描
public class SpringbootMpApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMpApplication.class, args);
    }

}

1.5测试

@SpringBootTest
class SpringbootMpApplicationTests {
    @Resource
    private UserDao userDao;

    /*查询user 得到list*/
    @Test
    void contextLoads() {
        List<User> userList = userDao.selectList(null);
        System.out.println(userList);
    }

得到结果

2.自动填充功能

2.1在实体类上需要自动填充的字段 添加注解

package com.ganin.springbootmp.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    /*auto id为自动增长 数据库列也要设置为自增列*/
//    @TableId(type = IdType.AUTO )
    /*input:自行设置id  NONE≈input */
    /*默认为ASSIGN_ID   雪花算法*/
//    @TableId(type = IdType.INPUT)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    //插入时自动填充
    @TableField(fill = FieldFill.INSERT)
    private Date created;
    //插入、修改自动填充
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updated;
}

1.2自定义实现类

@Component
public class MyHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //                     固定不变       字段名   字段的类型   时间(当前)
        this.strictInsertFill(metaObject, "created", Date.class, new Date()); // 起始版本 3.3.0(推荐使用)
        this.strictInsertFill(metaObject, "updated", Date.class, new Date()); // 起始版本 3.3.0(推荐使用)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "updated", Date.class, new Date()); // 起始版本 3.3.0(推荐使用)
    }
}

之后 测试…

3.逻辑删除

3.1 在application.properties中配置文件

#全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
mybatis-plus.global-config.db-config.logic-delete-field= deleted
# 逻辑已删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-delete-value=0
# 逻辑未删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-not-delete-value=1

测试:/*根据ID删除用户 演变为逻辑删除*/ @Test void del(){ userDao.deleteById(1L); }

补充一个乐观锁
乐观锁:操作数据库时不会加任何的锁,只有当出现错误的时候,起作用会去检查。
1.实现乐观锁:在数据库中添加一个新的字段 version

 //锁
    @Version
    private int version;

2.创建一个配置类 配置内容

@Configuration
public class Page {

    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //乐观锁
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

3.测试

  @Test
    public void version(){
        User user = userDao.selectById(1377210369296994306L);
        user.setName("哈哈哈");

        User user1 = userDao.selectById(1377210369296994306L);
        user1.setName("嘻嘻嘻");

        userDao.updateById(user);
        userDao.updateById(user1);
    }
    //同时去操作updateById() 只有一条执行成功

看一下数据库
在这里插入图片描述执行测试代码(执行之后我们去看sql日志)
在这里插入图片描述
在这里插入图片描述看到数据库中的值已经修改为了5

4.条件构造器

 @Test
    void select(){
        QueryWrapper wrapper = new QueryWrapper();
        User user = new User();
        if (StringUtils.isNotEmpty(user.getName())){
            wrapper.select("name","email");
        }
        if (user.getAge()!=null){
            wrapper.between("age",1,25);
        }
        List list = userDao.selectList(wrapper);
        System.out.println(list);
    }

方法selectList() 参数是List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);因为public abstract class Wrapper<T> implements ISqlSegment Wrapper是一个抽象类 不能new 所以我们可以创建它的子类new QueryWrapper() 得到QueryWrapper wrapper 在子类中有我们需要的条件表达式供我们去使用 最后把wrapper放在selectList()方法中 就可以了

5.mybatis-plus分页查询

5.1创建一个配置类

@Configuration
public class Page {

    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //DbType默认是DB2.用的什么数据库要修改一下
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

单元测试

@Test
    public void selectByPage(){
        Page<User> page = new Page<>(1,5);
        page=userDao.selectPage(page,null);
        System.out.println("是否含有下一页"+page.hasNext());
        System.out.println("共有"+page.getTotal()+"条数据");
        System.out.println("本页包含的信息"+page.getRecords());
    }

结果图

6.代码生成器

6.1引入jar包

<!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.0</version>
        </dependency>

        <!--mybatis-plus模板引擎-->  <!--MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beet-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

6.2创建类 执行main方法 生成代码(这里使用的是velocity模板)

package com.ganin.springboot_mp3.codegenerator;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class CodeGenerator {

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("豆加宁");
        gc.setOpen(false);
         gc.setSwagger2(true); /*实体属性 Swagger2 注解*/
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&characterEncoding=utf8");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("654123");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("springboot_mp3");
        pc.setParent("com.ganin");
        mpg.setPackageInfo(pc);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

//         如果模板引擎是 velocity
         String templatePath = "/templates/mapper.xml.vm";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);

        mpg.setStrategy(strategy);
        mpg.execute();
    }

}

生成的工程目录
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值