前言
Mybatis在持久层框架中还是比较火的,经常在项目中需要创建很多的Bean,并在Xml中书写大量的sql语句进行CRUD。很多简单而频繁的SQL可以直接使用MyBatis-Plus去解决,下面就开始了解MyBatis-Plus。
初始MyBatis-Plus
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatis-Plus特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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-Plus官网,欢迎大家补充更多的特点。
快速开始
依赖
好了, MyBatis-Plus大体介绍已经完成了,大家也明白了MyBatis-Plus是为了简化新生代的农民工的码量而有的产物。本文将结合目前常用的Spring Boot进行项目开发,快速搭建一套Spring Boot集成MyBatis-Plus的简单Demo。 因为是基于Maven搭建的Spring Boot集成MyBatis-Plus的项目。所以首先是添加依赖,主要包含两部分依赖,依赖信息如下:
<!-- mybatis-plus --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <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.3.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.0</version> </dependency> <!-- mybatis-plus -->
设置application.yml
在 application.yml配置文件中添加MySql 数据库的相关配置:其中主要包含数据库的链接、用户名、用户密码、数据源类型,数据源驱动类名等基础信息。 当然也可以加入MyBatis-Plus的相关配置信息,
- db-type: 数据库的类型信息mysql
- id-type: 主键id的创建方式AUTO
- logic-delete-field: dataStatus #全局逻辑删除字段值 3.3.0开始支持,详情看下面。
- logic-delete-value: 0 # 逻辑已删除值(默认为 99)
- logic-not-delete-value: 1 # 逻辑未删除值(默认为 1)
- mapper-locations: 自动配置并扫描本地mapper.xml所在的文件路径,例如:sclasspath*:mapper/**/*.xml
- typeAliasesPackage:自动配置并扫描本地SQL实体对象所在的包信息,例如: java.zhan.entity
- typeEnumsPackage: 自动配置并扫描项目中使用的枚举信息所在的包,例如:java.zhan.enums;java.zhan.test.enums
spring: datasource: url: jdbc:p6spy:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true username: admin password: 123456 type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.p6spy.engine.spy.P6SpyDriver mybatis-plus: global-config: db-config: db-type: mysql id-type: AUTO logic-delete-field: dataState logic-delete-value: 0 logic-not-delete-value: 1 banner: false mapper-locations: classpath*:mapper/**/*.xml typeAliasesPackage: java.zhan.entity typeEnumsPackage: java.zhan.enums;java.zhan.test.enums
分页
Spring boot方式项目的分页方式需要设置MybatisPlusConfig,其中注解MapperScan扫描mapper文件所在的包
@EnableTransactionManagement @Configuration @MapperScan("java.zhan.**.mapper") public class MybatisPlusConfig { // 旧版 @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false // paginationInterceptor.setOverflow(false); // 设置最大单页限制数量,默认 500 条,-1 不受限制 // paginationInterceptor.setLimit(500); // 开启 count 的 join 优化,只针对部分 left join paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; } // 最新版 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
DemoMybatisPlusApplication
启动类中需要特别注意的是@MapperScan(value = "com.example.demo.mapper"),需要制定启动扫描包的路径。
@SpringBootApplication @MapperScan(value = "com.example.demo.mapper") public class DemoMybatisPlusApplication { public static void main(String[] args) { SpringApplication.run(DemoMybatisPlusApplication.class, args); } }
测试
本文基于以上搭建的简单的Spring Boot集成MyBatis-Plus进行单元测试,主要测试有新增用户,查询用户,查询所有用户等。更多测试需要根据业务需要进行测试。
/** * @MethodName: insertUser * @Description: 新增 * @param * @Return: void * @Author: JavaZhan @公众号:Java全栈架构师 * @Date: 2020/6/20 **/ @Test void insertUser(){ User user = new User(); user.setUsername("gust"); user.setName("测试"); user.setCreatetime(new Date()); user.setSalt(1+""); user.setPassword("1233123"); user.setState(0); userService.save(user); } /** * @MethodName: getUserByUserName * @Description: 获取单个对象 * @param * @Return: void * @Author: JavaZhan @公众号:Java全栈架构师 * @Date: 2020/6/20 **/ @Test void getUserByUserName() { QueryWrapper<User> quserQueryWrapper = new QueryWrapper<>(); quserQueryWrapper.lambda().eq(User::getUserName,"admin"); User user = userService.getOne(quserQueryWrapper); System.out.println(user); } /** * @MethodName: getAllUser * @Description: 获取所有的用户 * @param * @Return: void * @Author: JavaZhan @公众号:Java全栈架构师 * @Date: 2020/6/20 **/ @Test void getAllUser(){ List<User> userList = userService.list(); userList.forEach(user -> System.out.println(user)); }
结语
这样MyBatis-Plus与Spring Boot集成成功啦。MyBatis-Plus具有强大的功能,代码生成器、CRUD 接口、条件构造器、分页插件、 Sequence主键、自定义ID生成器、逻辑删除、通用枚举、字段类型处理器、自动填充功能、SQL注入器、执行SQL分析打印、数据安全保护、多数据源等更多的功能。大家可以参考MyBatis-Plus官网查询了解更多。