Mybatis Plus 10分钟上手

mybatis plus 是一款mybatis增强插件,可以在mybatis基础上来进行灵活的单表操作,不用再写SQL语句(仅限于单表),是一款简单易用的工具,本文结合SpringBoot来对Mybatis plus进行一个详细的讲解。

1、初始化

1.1 选择一个数据库,然后创建表

CREATE TABLE `student`  (
  `id` bigint(20) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `create_time` datetime(0) NULL DEFAULT NULL,
  `update_time` datetime(0) NULL DEFAULT NULL,
  `status` int(1) NULL DEFAULT NULL,
  `version` int(255) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

1.2 使用IDEA来创建SpringBoot项目

在这里插入图片描述

1.3 引入POM依赖

 <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.14</version>
        </dependency>
        <!--mybatis plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>
        <!--freemarker对自动生成代码支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>

1.4 修改配置文件application.yml

spring:
  application:
    name: mybatis-plus-practise
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
server:
  port: 8080
logging:
  level:
    cn.amoqi.mybatis.plus : debug
    org.springframework: warn
mybatis-plus:
  # mybatis的xml文件位置
  mapper-locations: classpath:/mapper/**/*Mapper.xml
  # entity实体类包位置
  typeAliasesPackage: cn.amoqi.mybatis.plus.api.entity
  global-config:
    db-config:
      # 数据库主键生成方式:AUTO:数据库自增,ID_WORKER:雪花算法生成(框架默认),
      #可在字段上加@TableId(type = IdType.ID_WORKER) 覆盖
      id-type: AUTO
      # 影响添加、更新、Wapper生成条件,not_empty字段为空的不进行操作,IGNORED忽略判断
      #可在字段上加@TableField(strategy = FieldStrategy.IGNORED)覆盖默认
      field-strategy: not_empty
      # 数据库字段强行按照java实体的骆驼式命名法大写字母前转化为下划线加小写
      column-underline: true
      # 逻辑删除有效为1 删除为0
      logic-not-delete-value: 1
      logic-delete-value: 0
    # 是否自动刷新 Mapper 对应的 XML 文件,
    # Mapper 对应的 XML 文件会自动刷新,更改 XML 文件后,无需再次重启工程,由此节省大量时间。
    refresh: true
  configuration:
    # 开启驼峰,数据库字段转换为驼峰命名
    map-underscore-to-camel-case: true
    cache-enabled: false

使用CodeGenerator类来生成controller、service、entity、mapper等,因为篇幅原因暂时就不列出代码生成器了,代码会传到gitee上,地址放到底部,需要的可以自取。

1.5 为启动类添加注解@MapperScan注解,指向mapper接口路径

@SpringBootApplication
@MapperScan("cn.amoqi.mybatis.plus.api.mapper")
public class MybatisPlusPractiseApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusPractiseApplication.class, args);
    }
}

1.6 目录如下

在这里插入图片描述

2、基本功能

2.1 添加

@Test
public void add(){
    Student student = new Student();
    student.setName("赵六");
    student.setAge(23);
    student.setAddress("广东");
    studentService.save(student);
}

2.2 修改

@Test
public void edit(){
    Student student = new Student();
    student.setName("赵六111");
    student.setId(1288121141721862146L);
    studentService.updateById(student);
}

2.3 删除

@Test
public void del(){
	studentService.removeById("1288121141721862146");
}

2.4 列表

@Test
public void list(){
    List<Student> list = studentService.list(Wrappers.<Student>lambdaQuery()
    .ge(Student::getAge, 5));
    System.out.println(list);
    //复杂的
    /*SELECT id,name,age,address FROM student WHERE name = ? AND ( age = ? OR address = ? ) */
    List<Student> list1 = studentService.list(Wrappers.<Student>lambdaQuery().eq(Student::getName, "张三")
    .and(wrapper -> wrapper.eq(Student::getAge, 3).or().eq(Student::getAddress, "山东")));
    System.out.println(list1);
}

2.5 分页

引入Mybatis plus分页插件

@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {
    /**
     * mybatis-plus配置
     */
    public class MybatisPlusConfig {
        /**
         * 分页插件
         */
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    }
}

分页测试1

    @Test
    public void pageList(){
        IPage<Student> page = studentService.page(new Page<Student>(1, 10),
                Wrappers.<Student>lambdaQuery().ge(Student::getAge, 3));
        System.out.println(page.getRecords());
    }

复杂分页查询,使用xml关联别的表,查询列表分页的情况

创建一个school

CREATE TABLE `school`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of school
-- ----------------------------
INSERT INTO `school` VALUES (1, '明天中学');

为Student实体类中添加

private Integer schoolId;

@TableField(exist = false)
private String schoolName;

mapper

public interface StudentMapper extends BaseMapper<Student> {
    @Select("select st.*,sc.name school_name from student st left join school sc on st.school_id = sc.id")
    IPage<Student> selectListWithSchool(Page page);
}

service

@Override
public IPage<Student> selectListWithSchool(Integer page){
    Page<Student> studentPage = new Page<Student>(page, 10);
    IPage<Student> studentIPage = this.baseMapper.selectListWithSchool(studentPage);
    return studentIPage;
}

分页测试2

@Test
    public void pageList2(){
        IPage<Student> studentIPage = studentService.selectListWithSchool(1);
        System.out.println(studentIPage.getRecords());
    }

3、其他

3.1 逻辑删除

配置mybatis-plus

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)

在实体类字段上加上

@TableLogic
private Integer deleted;

3.2 生成主键

mybatis-plus:
  global-config:
    db-config:
      # 数据库主键生成方式:AUTO:数据库自增,ID_WORKER:雪花算法生成(框架默认),
      #可在字段上加@TableId(type = IdType.ID_WORKER) 覆盖
      id-type: AUTO

3.3 自动填充功能

实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");  //日志
        this.setFieldValByName("create_time",new Date(),metaObject);
        this.setFieldValByName("update_time",new Date(),metaObject);
        this.setFieldValByName("status",1,metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.setFieldValByName("update_time", new Date(), metaObject);
    }
}

字段上加入

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

    @TableField(fill = FieldFill.INSERT_UPDATE)

Gitee地址

结语
一名四年工作经验的程序猿,目前从事物流行业的工作,有自己的小破网站amoqi.cn。欢迎大家关注公众号【CoderQi】,一起来交流JAVA知识,包括但不限于SpringBoot+微服务,更有奇奇学习过程中学习的视频、面试资料和专业书籍等免费放送,希望大家能够喜欢。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是刘奇奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值