Mybatis-Plus轻松上手笔记

2 篇文章 0 订阅
1 篇文章 0 订阅

简单上手

Maven配置
<dependencys>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.2</version>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </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
运行结果

在这里插入图片描述

测试插入

@Test
public void testInsert(){
    User user = new User();
    user.setName("sixsix");
    user.setAge(18);
    user.setName("1642443500@qq.com");
    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可以动态的拼接sql

自动填充

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

在这里插入图片描述

手动填充

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

结果

在这里插入图片描述

插入操作
@Test
public void testInsert(){
    User user = new User();
    user.setName("sixsix");
    user.setAge(18);
    user.setName("1642443500@qq.com");
    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)
    

在这里插入图片描述

在这里插入图片描述

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

再查询一下看看

在这里插入图片描述

条件构造器

练习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.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
   <groupId>org.apache.velocity</groupId>
   <artifactId>velocity-engine-core</artifactId>
   <version>2.2</version>
</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();
    }
}

在这里插入图片描述
生成成功

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值