第一节
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:
DeBug调试,发现除了自己定义的方法,statement里面还有很多其他方法
Spring+MyBatis+MP:
SpringBoot+MyBatis+MP:
导入依赖:
CRUD操作
增加
对应的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的主要思想:
- 数据库中每张表对应着一个类,该类的每个实体对象对应着表中的某一行。
- ActiveRecord负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CRUD;
- 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快速开发插件
安装方法:
- 打开IDEA,进入File->Settings->Plugins->Browse Repositories;
- 输入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_