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, 'Jack@baomidou.com', NULL),
(2, 'Tom', 28, 'Tom@baomidou.com', 1),
(3, 'Sandy', 21, 'Sandy@baomidou.com', 2),
(4, 'Billie', 24, 'Billie@baomidou.com', 2),
(5, 'Lida', 24, 'Lida@baomidou.com', 2);

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>

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

第三步: 配置
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<User> {

}

第五步:测试

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

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List<User> 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=Jack@baomidou.com, managerId=null, createTime=null)
User(id=2, name=Tom, age=28, email=Tom@baomidou.com, managerId=1, createTime=null)
User(id=3, name=Sandy, age=21, email=Sandy@baomidou.com, managerId=2, createTime=null)
User(id=4, name=Billie, age=24, email=Billie@baomidou.com, managerId=2, createTime=null)
User(id=5, name=Lida, age=24, email=Lida@baomidou.com, 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<T> extends Mapper<T> {

    /**
     * 插入一条记录
     *
     * @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<String, Object> columnMap);

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

    /**
     * 删除(根据ID 批量删除)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> 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=Jack@baomidou.com, managerId=null, createTime=null)

下一篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容