MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MP的特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
MybatisPlus实现原理
核心:
- 表与对象建立关联关系
对象名称 ---------> 表名
对象的属性 -------> 数据表中的字段. - 采用第三方接口 规范所有的单表操作规则.(封装思想)
- 将CURD接口方法,必须按照sql的规范转化为指定的sql语句.
理论依据:
userMapper.insert(user); //程序员只写到这里.
sql: insert into 表名(字段名…) values (属性值…);
按照用户的调用发方法,动态拼接sql.之后交给Mybatis去执行.
拼接sql:
insert into user表(字段A,字段B,字段C…) values (属性值A,属性B,属性C…);
MP入门案例
1.导入jar包
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
2.配置User对象
@Data
@Accessors(chain = true)
@TableName //与表进行关联 如果名称一致,则可以省略不写.
public class User {
//属性一般都与表字段对应
@TableId(type = IdType.AUTO) //主键自增标识.
private Integer id;
//@TableField(value = "name") //如果属性名称与字段名称一致(包含驼峰规则) 可以省略不写
private String name;
private Integer age;
private String sex;
}
3.继承BaseMapper接口
4.修改YML配置文件
5.测试
@SpringBootTest //springBoot测试注解 开启了spring容器
public class TestMybatis {
@Autowired
private UserMapper userMapper;
/**
* 以MP方式操作数据库,则以后单表操作不写sql.
*/
@Test
public void findAll() {
List<User> userList = userMapper.selectList(null);
System.out.println(userList);
}
}
MybatisPlus API说明实例
/**
* 1.新增
*/
@Test
public void insert() {
User user = new User();
user.setName("MybatisPlus入门")
.setAge(18)
.setSex("女");
userMapper.insert(user);
System.out.println("入库成功!!!");
}
/**
* 案例:查询Id=53的用户信息
* 参数充当where条件
*/
@Test
public void select01() {
User user = userMapper.selectById(53);
System.out.println(user);
}
/**
* 案例:查询name="孙尚香" sex=女性 用户.
* queryWrapper:条件构造器 拼接where条件
* 逻辑运算符 = eq, > gt , < lt
* >= ge, <= le
*/
@Test
public void select02() {
//1.利用对象封装参数,实现数据查询
//注意事项:利用对象只能实现 "="号操作
User user = new User();
user.setName("孙尚香")
.setSex("女");
//根据对象中不为null的元素拼接where条件,默认条件下使用and连接符
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
//2.方法2 利用条件构造器构建where条件
QueryWrapper<User> queryWrapper2 = new QueryWrapper<User>();
queryWrapper2.eq("name", "孙尚香")
.eq("sex", "女");
List<User> userList2 = userMapper.selectList(queryWrapper2);
System.out.println(userList2);
}
/**
* 查询用户age<18岁 或者 age >100岁
*/
@Test
public void select03() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.lt("age", 18)
.or()
.gt("age", 100);
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/**
* 查询id= 1,3,6的用户
*/
@Test
public void select04() {
//1.api进行封装
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(6);
List<User> userList = userMapper.selectBatchIds(list);
//2.条件构造器进行封装
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.in("id", 1,3,4,5);
userMapper.selectList(queryWrapper);
}
@Test
public void select05() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.between("字段", "值1", "值2");
queryWrapper.like("name","精"); //包含精字 %精%
queryWrapper.likeRight("name","精"); //以精开头 精%
//queryWrapper.groupBy(column) //分组查询!!!
}