Mybatis-Plus轻松上手笔记

简单上手

Maven配置

<dependencys>
    <dependency>
        <groupId>com.baomidougroupId>
        <artifactId>mybatis-plus-boot-starterartifactId>
        <version>3.3.2version>
    dependency>
    
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>5.1.49version>
    dependency>
    <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
        <optional>trueoptional>
    dependency>
dependencys>

yml配置

spring:
  datasource: 
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    url: jdbc:mysql://localhost:3306/mybatisplus?useSSL=false&useUnicode=true&characterEncoding=utf-8
    password: 123456

创建实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    private static final long serialVersionUID = -56168317199630804L;
    /**
    * 主键ID
    */
    private Long id;
    /**
    * 姓名
    */
    private String name;
    /**
    * 年龄
    */
    private Integer age;
    /**
    * 邮箱
    */
    private String email;

}

编写Dao接口

@Repository     // 代表持久层
public interface UserDao extends BaseMapper<User> {

}

测试一下

@SpringBootTest
class MybatisPlusApplicationTests {

    @Autowired
    private UserDao userDao;

    @Test
    void contextLoads() {

        // 参数wrapper,条件构造器,这里先不用,先置为null
        // 查询所有用户
        List<User> list = userDao.selectList(null);
        list.forEach(System.out::println);
    }

}

配置日志

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

运行结果

Mybatis-Plus轻松上手笔记_第1张图片

测试插入

@Test
public void testInsert(){
    User user = new User();
    user.setName("sixsix");
    user.setAge(18);
    user.setName("[email protected]");
    int insert = userDao.insert(user);
    System.out.println(insert);
    System.err.println(user);
}

数据库中插入的id默认值为:全局唯一的id

主键生成策略

雪花算法

默认ID_WORK全局唯一

分布式系统唯一id生成:http://www.machengyu.net/tech/2019/12/04/snowflake.html

@TableId(type = IdType.AUTO) 	// 主键自增,数据库的主键一定也要是自增的
private Long id;

其余源码解释

public enum IdType {
    AUTO(0),		// 自增
    NONE(1),		// 未设置主键
    INPUT(2),		// 手动输入,必须初始化值
    ID_WORKER(3),	// 默认全局id
    UUID(4),		// 全局唯一id UUID
    ID_WORKER_STR(3);	// ID_WORKER的字符串表示法
}

CRUD扩展

更新操作

先修改一个值
Mybatis-Plus轻松上手笔记_第2张图片

修改两个值

Mybatis-Plus轻松上手笔记_第3张图片

不难发现mybatis-plus可以动态的拼接sql

自动填充

创建时间、修改时间这些操作一般都是自动化完成的,不要手动更新

Mybatis-Plus轻松上手笔记_第4张图片

手动填充

1.先设置数据库

在这里插入图片描述

2.在实体类上需要添加注解

/**
    * 创建时间
    */
@TableField(fill = FieldFill.INSERT)
private Date createtime;
/**
    * 修改时间
    */
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updatetime;

3.编写handler

package com.six.handler;

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

import java.util.Date;

@Slf4j
@Component  // 一定不要忘记把处理器加到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
    // 插入时的注解
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill......");
        this.setFieldValByName("createtime",new Date(),metaObject);
        this.setFieldValByName("updatetime",new Date(),metaObject);
    }

    // 更新时的注解
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill......");
        this.setFieldValByName("updatetime",new Date(),metaObject);
    }
}

结果

Mybatis-Plus轻松上手笔记_第5张图片

插入操作

@Test
public void testInsert(){
    User user = new User();
    user.setName("sixsix");
    user.setAge(18);
    user.setName("[email protected]");
    int insert = userDao.insert(user);
    System.out.println(insert);
    System.err.println(user);
}

查询操作

基本的查询操作

// 测试单个查询
@Test
public void testSelectById(){

    User user = userDao.selectById(1L);
    System.out.println(user);

}

// 测试多个查询
@Test
public void testSelectBatchId(){

    List<User> users = userDao.selectBatchIds(Arrays.asList(1, 2, 3));
    users.forEach(System.out::println);
}


// 测试条件查询
@Test
public void testSelectBatchIds(){
    HashMap<String, Object> map = new HashMap<>();
    map.put("name","sixsix1");
    List<User> users = userDao.selectByMap(map);
    users.forEach(System.out::println);
}

分页查询

1.原始的limit进行分页

2.pagehelper第三方插件

3.Mybatis-Plus内置分页插件

Mybatis-Plus内置分页插件的使用

  1. 配置拦截器组件即可

    @EnableTransactionManagement
    @Configuration
    @MapperScan("com.six.dao")
    public class MybatisPlusConfig {
    
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
            // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
            // paginationInterceptor.setOverflow(false);
            // 设置最大单页限制数量,默认 500 条,-1 不受限制
            // paginationInterceptor.setLimit(500);
            // 开启 count 的 join 优化,只针对部分 left join
            paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
            return paginationInterceptor;
        }
    }
    
  2. 直接使用配置对象即可

     @Test
        public void testPage(){
    
            // 参数1:当前页
            // 参数2:页面大小
            Page<User> page = new Page<>(1,5);
            Page<User> users = userDao.selectPage(page, null);
    
            page.getRecords().forEach(System.out::println);
        }
    
  3. 简单的测试一下

    // 测试分页查询
    @Test
    public void testPage(){
    
        // 参数1:当前页
        // 参数2:页面大小
        Page<User> page = new Page<>(1,5);
        Page<User> users = userDao.selectPage(page, null);
    
        page.getRecords().forEach(System.out::println);
        System.err.println(page.getCurrent());      // 获取当前页数
        System.err.println(page.getOrders());       // 获取排序字段信息
        System.err.println(page.getSize());         // 获取分页大小
        System.err.println(page.getTotal());        // 获取总记录数
        System.err.println(page.getPages());    	// 获取总页数
    }
    

删除操作

基本的删除操作

// 测试单个删除
@Test
public void testDeleteById(){

    userDao.deleteById(1286267879763136513L);
}

// 测试批量删除
@Test
public void testDeleteBatchIds(){

    userDao.deleteBatchIds(Arrays.asList(1286267879763136513L,1286267879763136514L));
}

// 测试通过map删除
@Test
public void testDeleteMap(){

    HashMap<String, Object> map = new HashMap<>();
    map.put("name","sixsix");
    userDao.deleteByMap(map);
}

逻辑删除

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

逻辑删除:在数据库中没有删除,而是通过一个变量使他失效

管理员可以查看被删除的记录,防止数据丢失,类似于回收站

测试一下:

  1. 在数据库中加一个字段为deleted

  2. 同步实体类数据

    /**
    * 逻辑删除
    */
    @TableLogic
    private Integer deleted;
    
  3. 高版本不需要再写Bean了,只在配置文件中配置好即可

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

Mybatis-Plus轻松上手笔记_第6张图片

在这里插入图片描述

从图中可以发现并没有走删除操作,而是更新操作!!!

再查询一下看看

Mybatis-Plus轻松上手笔记_第7张图片

条件构造器

练习1

@Test
void contextLoads() {
    // 查询name不为空的,并且邮箱不为空并且年龄大于15岁的
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper
        .isNotNull("name")
        .isNotNull("email")
        .ge("age",15);
    userDao.selectList(wrapper).forEach(System.out::println);
}

练习2

@Test
void test2() {
    // 查询name为sixsix的
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("name","sixsix");
    System.out.println(userDao.selectList(wrapper));
}

练习3

@Test
void test3() {
    // 查询年龄在20-30岁之间的
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.between("age",20,30);
    System.out.println(userDao.selectList(wrapper));
}

练习4

@Test
void test4() {
    // 模糊查询
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper
            .notLike("name","e")
            .likeRight("email","t");    // like的right和left分别对于%在元素的左右
    userDao.selectMaps(wrapper).forEach(System.out::println);
}

练习5

@Test
void test5() {
    // 嵌套查询
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.inSql("id","select id from user where id < 3");
    List<Object> objects = userDao.selectObjs(wrapper);
    objects.forEach(System.out::println);
}

练习6

@Test
void test6() {
    // 通过id降序排序
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.orderByDesc("id");
    userDao.selectList(wrapper).forEach(System.out::println);
}

等等…

代码生成器

添加依赖

<dependency>
    <groupId>com.baomidougroupId>
    <artifactId>mybatis-plus-generatorartifactId>
    <version>3.3.2version>
dependency>
<dependency>
   <groupId>org.apache.velocitygroupId>
   <artifactId>velocity-engine-coreartifactId>
   <version>2.2version>
dependency>

写自动生成代码类

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
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.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

// 代码自动生成器
public class AutoCode {
    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("Venom");
        gc.setOpen(false);      // 是否打开资源管理器
        gc.setFileOverride(false);  // 是否覆盖之前生成的
        gc.setServiceName("%Service");  // 去掉service的I前缀
        gc.setDateType(DateType.ONLY_DATE); // 日期的格式
        gc.setSwagger2(true);       // 开启swagger

        mpg.setGlobalConfig(gc);    // 设置全局配置
        // 2.设置数据源
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/blog?useSSL=false&useUnicode=true&characterEncoding=utf-8");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setDbType(DbType.MYSQL);

        mpg.setDataSource(dsc);
        // 3.设置包
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("blog");
        pc.setParent("com.six");
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);


        // 4.策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("user,comment");    // 设置要映射的表名
        strategy.setNaming(NamingStrategy.underline_to_camel);  // 下划线转驼峰
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);        // 自动生成lombok

        // 自动装填配置
        strategy.setLogicDeleteFieldName("deleted");    // 设置自动删除配置
        TableFill createtime = new TableFill("createtime", FieldFill.INSERT);// 设置自动填充配置
        TableFill updatetime = new TableFill("updatetime", FieldFill.INSERT);// 设置自动填充配置
        ArrayList<TableFill> list = new ArrayList<>();
        list.add(createtime);
        list.add(updatetime);
        strategy.setTableFillList(list);

        // 乐观锁
        strategy.setVersionFieldName("version");

        strategy.setRestControllerStyle(true);
        strategy.setControllerMappingHyphenStyle(true);     // localhost:hello_id_3


        mpg.setStrategy(strategy);

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

Mybatis-Plus轻松上手笔记_第8张图片
生成成功

你可能感兴趣的:(java,笔记,mybatisplus)