MyBatis到MyBatis-Plus

134 阅读5分钟

第一节

MyBatis概念

官⽹: mybatis.plus/mp.baomidou.com/

MP是MyBatis增强工具,在其基础上只做增强不做改变,为了简化开发和提高开发效率

特性:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 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 操作智能分析阻断,也可自定义拦截规则,预防误操作 支持的数据库:
  • 任何能使用 mybatis 进行 crud, 并且支持标准 sql 的数据库

快速入门

导入依赖springboot

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

普通maven(spring/mybatis)

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.1.1</version>
    </dependency>
    

MyBatis+MP:

image.png image.png DeBug调试,发现除了自己定义的方法,statement里面还有很多其他方法

image.png

image.png

Spring+MyBatis+MP:

image.png

image.png

image.png

SpringBoot+MyBatis+MP:

导入依赖:

image.png

image.png

image.png

CRUD操作

增加

image.png

对应的sql :insert into t_user(user_id, username, age, email) values("自动生成的主键", "张三", 20, "zhangsan@qq.com")

注解:

  • @TableId(type = IdType.AUTO) //指定id类型为⾃增长
  • @TableName("")// 指定对应数据库表名
  • @TableField //1、对象中的属性名和字段名不⼀致的问题(⾮驼峰)2、对象中的属性字段在表中不存在的问题 应用:
  •      @TableField(value = "email")//解决字段不一致
    
  •      @TableField(exist = false) //表明数据库表中没有该字段
    
  •      @TableField(select = false//表示查询时不查该字段
    

主键id生成策略:枚举类

 /**
 * 数据库ID⾃增
 */
 AUTO(0),
 /**
 * 该类型为未设置主键类型修改User对象:
 */
 NONE(1),
 /**
 * ⽤户输⼊ID
 * <p>该类型可以通过⾃⼰注册⾃动填充插件进⾏填充</p>
 */
 INPUT(2),
 /* 以下3种类型、只有当插⼊对象ID 为空,才⾃动填充。 */
 /**
 * 全局唯⼀ID (idWorker)
 */
 ID_WORKER(3),
 /**
 * 全局唯⼀ID (UUID)
 */
 UUID(4),
 /**
 * 字符串全局唯⼀ID (idWorker 的字符串表示)
 */
 ID_WORKER_STR(5);

更新操作

UserMapper extends BseeMapper

第一种(根据id进行更新)
User user = new User();
// 主键id
user.setId(1);
user.setName("lisi");
// 根据id进行更新
userMapper.updateById(user);

sql:update t_user set username = ? where user_id = ?

第二种(wrapper条件)
User user = new User();
user.setName("zhangsan");
QueryWrapper wrapper1 = new QueryWrapper<User>();
wrapper1.eq("id", 1);
userMapper.update(user, wrapper);
UpdateWrapper wrapper2 = new UpdateWrapper<User>();
wrapper2.eq("id", 1).set("username", tom);
userMapper.update(null, wrapper);

sql: update t_user set username = ? where user_id = ?

删除操作

第一种(根据id进行删除)
userMapper.deleteById(1);

sql: delete from t_user where id = ?

第二种(Map集合)
Map<String, Object> map = new HashMap<>();
map.put("name", "zhangsan");
map.put("age", 100);
userMapper.deleteByMap(map);

sql: delete from t_user where username = ? and age = ?

第三种(wrapper)
QueryWrapper wrapper = new QueryWrapper<>();
userMapper.delete(wrapper);
第四种(批量删除)
userMapper.deleteBatchIds(Arrays.asList(1L,10L,20L));

sql: delete from t_user where id in(1,10,20);

查询操作

selectById

userMapper.selectById(1L);

selectBatchIds

userMapper.selectBatchIds(Arrays.asList(1L,2L,3L));

selectOne
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "tom");

// 根据条件查询,如果结果超过一条就报错
userMapper.selectOne(wrapper);
selectCount(查询数量)
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20);// 年龄大于20
userMapper.selectCount(wrapper);
selectList
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20);// 年龄大于20
userMapper.selectList(wrapper);
selectPage
QueryWrapper wrapper = new QueryWrapper();
wrapper.gt("age", 20); // 年龄⼤于20岁 
Page page = new Page<>(1,1); // 根据条件查询数据 
IPage iPage = this.userMapper.selectPage(page, wrapper);

ActiveRecord

ActiveRecord(简称AR)一直广受动态语言(PHP、Ruby等)喜爱。
ActiveRecord的主要思想:

  1. 数据库中每张表对应着一个类,该类的每个实体对象对应着表中的某一行。
  2. ActiveRecord负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CRUD;
  3. ActiveRecord是一种领域模型,封装了部分业务逻辑。

注: 意思就是能直接通过实体类进行CRUD。必须继承Model。

代码:

public class User extends Model<User> {
    private Long id; 
    private String userName;
    private String password;
    private String name; private Integer age;
    private String email;
}

使用方法:user.insert();
user.selectById();

MybatisX快速开发插件

安装方法:

  1. 打开IDEA,进入File->Settings->Plugins->Browse Repositories;
  2. 输入mybatisx搜索安装。

第二节

配置

基本配置

configLocation

如果单独的配置了一个Mybatis配置,需要把他的路径配置到configLocation,例如:
mybatis-plus.config-location = classpath:mybatis-config.xml

mapperLocations

#配置mapper的扫描,找到所有的mapper.xml映射文件
mapper-locations: classpath:mappers/*.xml

typeAliasesPackage

Mybatis别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML ⽂件 中可以直接使⽤类名,⽽不⽤使⽤全限定的类名(即 XML 中调⽤的时候不⽤包含包名)。

mybatis-plus.type-aliases-package = com.hellojava.common.domain

直接使用类名即可

进阶配置

mapUnderscoreToCamelCase

驼峰映射,默认为true。

#关闭⾃动驼峰映射,该参数不能和mybatis-plus.config-location同时存在 mybatis-plus.configuration.map-underscore-to-camel-case=false

cacheEnabled

全局地开启或关闭配置⽂件中的所有映射器已经配置的任何缓存,默认为 true。
mybatis-plus.configuration.cache-enabled=false

DB策略配置

idType

主键生成策略,一般用注解。

tablePreFix

表前缀配置,全局配置后可省略@TableName()配置,默认为空。
mybatis-plus.global-config.db-config.table-prefix=t_

插件

Sql注入器和自动填充

代码生成器