什么是MybatisPlus

为简化而生!

快速入门

1.创建一个springboot项目,记得修改默认的maven配置

2.导入依赖

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

<!-- mybatis-plus依赖,使用了plus就尽量不要导入mybatis的依赖了,避免版本冲突-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.4.3.4</version>
</dependency>

3.连接数据库以及编写数据库配置文件

spring.datasource.username=root
spring.datasource.password=Gyh!1027
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

4.编写pojo以及mapper

public class User {
    private int id;
    private String name;
    private int age;
    private String email;
}
// 在对应的Mapper上继承BaseMapper<T>,所有的CRUD就自动编写完成了
@Mapper
// 显示的指定要扫描的接口,否则会爆 could not autowired
@Component(value = "UserMapper")
public interface UserMapper extends BaseMapper<User> {

}

5.测试查询所有的用户及结果

    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads() {
        List<User> userList = userMapper.selectList(null);
        for (User user : userList) {
            System.out.println(user);
        }
    }

MyBatis-Plus_数据库

配置日志

由于mybatis-plus所有的sql不可见,需要配置才能看见,方便调试

# 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

主键生成策略

在测试插入方法时,出现了这种情况
User{id=1450026548601081857, name='yuu', age=18, email='3562090042@qq.com'}
这里的id生成使用的是twitter的雪花算法,是一个Long类型的ID

自动填充

在企业开发中,几乎所有的表都有gmt_create、gmt_modify字段,用来记录数据创建时间以及修改时间,而且是自动化填写的
首先在上面的数据库中新增两个字段,create_time和update_time,类型都为datetime

//实体类中的date属性,mybatis-plus官方给定的为LocalDateTime类型
@TableField(fill = FieldFill.INSERT)  //只在插入时填充
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)  //在插入和更新时都填充
private LocalDateTime updateTime;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

// 配置相应的填充策略类
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    //插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }

    //更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

分页查询

编写一个配置类

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisConfig {

    // 分页查询组件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));  // 这里是什么类型的数据库就用什么类型
        return interceptor;
    }
}
    // 分页查询
    @Test
    void selectUserByPage() {
        Page<User> page = new Page<>(1,5);
        userMapper.selectPage(page, null);
        List<User> userList = page.getRecords();
        for (User user : userList) {
            System.out.println(user);
        }
    }

条件构造器

用于复杂sql的处理

@SpringBootTest
public class WrapperTest {

    @Autowired
    private UserMapper userMapper;

    // 查询name和email不为空,年龄大于等于12岁的用户
    @Test
    void test1(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .isNotNull("name")
                .isNotNull("email")
                .ge("age",12);  // 大于等于 greater than和be equal to 的缩写
        List<User> userList = userMapper.selectList(wrapper);
        for (User user : userList) {
            System.out.println(user);
        }
    }

    // 查询年龄在20到30之间的用户数量
    @Test
    void test2(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.between("age",20,30);
        Long num = userMapper.selectCount(wrapper);
        System.out.println(num);
    }

    // 查询name中不含字母o,email为testxxx开头的用户
    @Test
    void test3(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .notLike("name","o")
                // likeRight代表模糊查询的%在右边,这里即 test%
                .likeRight("email","test");
        List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
        // forEach的lambda表达式
        maps.forEach(System.out::println);
    }

    // 内查询
    @Test
    void test4(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 在子sql语句中查询出符合条件的id
        wrapper.inSql("id","select id from user where id < 3");
        List<Object> obj = userMapper.selectObjs(wrapper);
        obj.forEach(System.out::println);
    }

    // 通过年龄降序排列
    @Test
    void test5(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("age");
        List<User> list = userMapper.selectList(wrapper);
        list.forEach(System.out::println);
    }
}

代码自动生成器

依赖包:mybatis-plus,自动生成器依赖,模板引擎

<!-- mybatis-plus依赖,使用了plus就尽量不要导入mybatis的依赖了,避免版本冲突-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.4.3.4</version>
</dependency>

<!--代码自动生成器依赖-->
<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.3</version>
</dependency>

需要先设计好数据库,连接数据库,配置数据库连接
模板

// 代码自动生成器
public class MyCodeAutoGenerator {
    public static void main(String[] args) {
        // 构建一个代码自动生成器的对象
        AutoGenerator generator = new AutoGenerator();

        // 1.全局配置
        GlobalConfig config = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");  // 得到当前工程根目录
        config.setOutputDir(projectPath+"/src/main/java");  // 生成的代码输出目录
        config.setAuthor("yuu");  // 作者签名
        config.setOpen(false);  // 生成后不打开资源文件夹
        config.setFileOverride(false);  // 覆盖已经有的文件
        config.setServiceName("%sService"); // 去掉Service的'I'前缀
        config.setIdType(IdType.AUTO);  // 设置主键自增
        config.setDateType(DateType.ONLY_DATE);  // 日期格式
        config.setSwagger2(true);  // 设置Swagger接口文档,需要导入对应的jar包
        generator.setGlobalConfig(config);

        // 2.数据源配置
        DataSourceConfig sourceConfig = new DataSourceConfig();
        sourceConfig.setDbType(DbType.MYSQL);
        sourceConfig.setUsername("root");
        sourceConfig.setPassword("Gyh!1027");
        sourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC");
        sourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        generator.setDataSource(sourceConfig);

        // 3.包的配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("com.yuu");
        packageConfig.setEntity("pojo");
        packageConfig.setService("service");
        packageConfig.setController("controller");
        packageConfig.setMapper("mapper");
        generator.setPackageInfo(packageConfig);

        // 4.数据库策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("user");  // 设置要映射的表名,可以一次性映射多个
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);  // 下划线转驼峰命名
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);  // 下划线转驼峰命名
        TableFill createTime = new TableFill("create_time", FieldFill.INSERT);  // 创建时间的自动填充
        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);  // 修改时间的自动填充
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(createTime);
        tableFills.add(updateTime);
        strategyConfig.setTableFillList(tableFills);
        generator.setStrategy(strategyConfig);

        generator.execute();
    }
}