一、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 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 protected], managerId=null, createTime=null)
下一篇