Mybatis愿景:
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
特性:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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的区别
自定义mapper接口,继承BaseMapper<T>
明确指定泛型:当前操作类的实体对象
不需要我们编写mapper.xml,sql 语句的拼接,MyBatis-plus框架帮我们写。
使用(基于Spring boot)
- 建库建表
- 引入依赖 :Spring boot 相关依赖 ,MySQL驱动,连接池,集成Mybatis-plus
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <!--SpringBoot版本--> <version>2.4.3</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> <scope>provided</scope> </dependency> </dependencies>
- 编写application.properties
- 创建实体类
@Setter @Getter @ToString public class Employee { private Long id; private String name; private String password; private String email; private int age; private int admin; private Long deptId; }
- 创建mapper接口并继承BaseMapper
public interface EmployeeMapper extends BaseMapper<Employee> { }
- 编写测试类
@SpringBootTest public class CRUDTest { @Autowired private EmployeeMapper employeeMapper; @Test public void testSave(){ Employee employee = new Employee(); employee.setAdmin(1); employee.setAge(18); employee.setDeptId(1L); employee.setEmail("rjylf@126.com"); employee.setName("rjylf"); employee.setPassword("111"); employeeMapper.insert(employee); } @Test public void testUpdate(){ Employee employee = new Employee(); employee.setId(1327139013313564673L); employee.setAdmin(1); employee.setAge(18); employee.setDeptId(1L); employee.setEmail("rjylf@126.com"); employee.setName("rjlyf"); employee.setPassword("111"); employeeMapper.updateById(employee); } @Test public void testDelete(){ employeeMapper.deleteById(1327139013313564673L); } @Test public void testGet(){ System.out.println(employeeMapper.selectById(1327139013313564673L)); } @Test public void testList(){ System.out.println(employeeMapper.selectList(null)); } }
思考
(一)EmployeeMapper接口中没有定义CRUD方法,为什么测试类中就可以使用CRUD方法
原因:EmployeeMapper接口继承BaseMapper父接口
(二)源码中没有编写CRUD SQL ,为什么可以通过Mapper接口执行 CRUD 逻辑呢?
原因:mysql执行必须编写sql语句,但源码中没有sql语句 -> SQL语句已经帮写好了
(三)mybatis-plus 框架,怎么知道执行sql,怎么拼写sql
解析:SELECT id,name,email,age FROM employee
SQL语句的核心数据是什么:
表名:employee 列名:id,name,email,age
分析:结合ORM思想
O:对象 ----- 实体类 :employee
R:关系 ----- 表:employee
M:映射 ----- 一 一对应: 实体类----->表
属性---------->列名
关键所在:只需要获取到当前接口操作的实体类对象,通过内省(反射)解析出类名,属性名来获取操作。
mybatis 会对属性值不为null的属性进行拼接
new Employee(1L,"人间一两风",null,null)
UPDATE employee SET name=? WHERE id=?
mybatis-plus 只是对 mybatis 进行增强,底层最终的操作还是用 mybatis 来完成