Mybatis Plus学习总结 (上)

一、Mybatis Plus简介
Mybatis-Plus(简称MP)是一个mybtis的增强工具,在 MyBatis 的基础上只做增强不做改变。MP针对mybatis,做了很多改进,简单来说就是:hibernate的优点+mybatis的优点=mybatis plus,增强mybatis的更改数据库时SQL的兼容性(hibernate优点mybatis缺点),以及封装一些简单SQL(hibernate优点mybatis缺点),提升mybatis的开发效率,且性能没有降低。MP兼容mybatis的相关配置和使用方式,除了generator不同。

官方中文文档:https://mp.baomidou.com/
代码托管地址:码云: https://gitee.com/baomidou/my...
      Github: https://github.com/baomidou/m...

二、MP的特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord(AR) 模式:支持 AR 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,还有很多自定义配置
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

三、环境搭建
涉及软件:数据库:MySQL、开发软件:idea
项目框架:Spring Boot
管理项目工具:maven

第一步:新建数据库、表,并插入信息,脚本如下:

create database mp;
CREATE TABLE mp.user (
    id BIGINT(20) PRIMARY KEY NOT NULL COMMENT '主键',
    name VARCHAR(30) DEFAULT NULL COMMENT '姓名',
    age INT(11) DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    manager_id BIGINT(20) DEFAULT NULL COMMENT '直属上级id',
    create_time DATETIME DEFAULT NULL COMMENT '创建时间',
    CONSTRAINT manager_fk FOREIGN KEY (manager_id)
        REFERENCES user (id)
)  ENGINE=INNODB CHARSET=UTF8;

#初始化数据:
INSERT INTO mp.user (id, name, age, email, manager_id)
VALUES 
(1, 'Jack', 20, '[email protected]', NULL),
(2, 'Tom', 28, '[email protected]', 1),
(3, 'Sandy', 21, '[email protected]', 2),
(4, 'Billie', 24, '[email protected]', 2),
(5, 'Lida', 24, '[email protected]', 2);

第二步:创建Spring Boot项目,并引入依赖

        
            org.projectlombok
            lombok
            1.18.12
            provided
        

        
            com.baomidou
            mybatis-plus-boot-starter
            3.3.1
        

        
            mysql
            mysql-connector-java
            8.0.19
        

第三步: 配置
SpringBoot配置文件:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT
    username: root
    password: 990921

启动类配置

@MapperScan("com.mp.demo1.dao")
@SpringBootApplication
public class Demo1Application {

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

}

第四步:编码
实体类 User, 使用注解@Data简化代码

@Data
public class User {

    private Long id;
    
    private String name;
    
    private Integer age;
    
    private String email;
    
    private String managerId;
    
    private LocalDateTime createTime;    
}

Mapper类,UserMapper

public interface UserMapper extends BaseMapper {

}

第五步:测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List userList = userMapper.selectList(null);
        Assert.assertEquals(5, userList.size());
        userList.forEach(System.out::println);
    }
}

控制台输出结果

----- selectAll method test ------
2020-03-30 22:33:14.691  INFO 15784 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-03-30 22:33:14.857  INFO 15784 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
User(id=1, name=Jack, age=20, [email protected], managerId=null, createTime=null)
User(id=2, name=Tom, age=28, [email protected], managerId=1, createTime=null)
User(id=3, name=Sandy, age=21, [email protected], managerId=2, createTime=null)
User(id=4, name=Billie, age=24, [email protected], managerId=2, createTime=null)
User(id=5, name=Lida, age=24, [email protected], managerId=2, createTime=null)

四、常用注解

注解名 应用场景
@TableName 表名与实体类中的类名不一致
@TableId 表主键与实体类主键不一致
@TableField 表字段名与实体类成员名不一致

排除实体类中非表字段

  • 使用transient关键字修饰非表字段,但是被transient修饰后,无法进行序列化。
  • 使用static关键字,因为我们使用的是lombok框架生成的get/set方法,所以对于静态变量,我们需要手动生成get/set方法。
  • 使用@TableField(exist = false)注解(说明:@TableField(exist = false) 注解加在bean属性上,表示当前属性不是数据库的字段,但在项目中必须使用,这样在新增等使用bean的时候,mybatis-plus就会忽略这个,不会报错)

五、利用CURD进行增删改查
BaseMapper(说明:BaseMapper是MP中自带的)中封装了很多关于增删改查的方法,后期自动生成,我们直接调用接口中的相关方法即可完成相应的操作。
部分源码:

public interface BaseMapper extends Mapper {

    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     */
    int insert(T entity);

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     */
    int deleteById(Serializable id);

    /**
     * 根据 columnMap 条件,删除记录
     *
     * @param columnMap 表字段 map 对象
     */
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map columnMap);

    /**
     * 根据 entity 条件,删除记录
     *
     * @param wrapper 实体对象封装操作类(可以为 null)
     */
    int delete(@Param(Constants.WRAPPER) Wrapper wrapper);

    /**
     * 删除(根据ID 批量删除)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection idList);

    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     */
    int updateById(@Param(Constants.ENTITY) T entity);

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    T selectById(Serializable id);
    ......
}

测试

@Test
    public void test() {
        //增
        User user = new User();
        user.setAge(21);
        user.setManagerId("2");
        user.setCreateTime(LocalDateTime.now());
        int insert = userMapper.insert(user);
        System.out.println("新增条数:"+insert);

        //删
        int delete = userMapper.deleteById(1244644545065476098L);
        System.out.println("删除条数"+delete);

        //改
        User user1 = new User();
        user1.setAge(20);
        user1.setManagerId("2");
        user1.setCreateTime(LocalDateTime.now());
        int update = userMapper.updateById(user1);
        System.out.println("更新条数:"+update);

        //查
        User user2 = userMapper.selectById(1);
        System.out.println("查询结果:"+user2);
    }

控制台输出

2020-03-30 23:24:33.227  INFO 16360 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-03-30 23:24:33.399  INFO 16360 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
新增条数:1
删除条数1
更新条数:0
查询结果:User(id=1, name=Jack, age=20, [email protected], managerId=null, createTime=null)

下一篇

你可能感兴趣的:(Mybatis Plus学习总结 (上))