• Java--MybatisPlus入门;与Mybatis区别;简单使用(一)


    阅读前可先参考

    Java--MyBatis入门_MinggeQingchun的博客-CSDN博客_java mybatis

    一、MyBatis-Plus

    MyBatis-Plus(简称 MP)是一个 Mybatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生

    MyBatis-Plus在 MyBatis之上进行了封装,单表CURD的操作几乎都可以由MyBatis-Plus 代替执行。而且提供了各种查询方式,分页行为。作为使用者无需编写xml,直接调用MyBatis-Plus提供的API即可

    Mybatis-Plus官网:

    MyBatis-Plus

    简介 | MyBatis-Plus

    GitHub地址:

    GitHub - baomidou/mybatis-plus: An powerful enhanced toolkit of MyBatis for simplify development

    特性(摘自官网)

    • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
    • 损耗小:启动即会自动注入基本 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区别

    (一)Mybatis

    MyBatis 前身是iBatis,是一个基于 Java 的持久层框架。它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型。

    MyBatis提供的持久层框架包括SQL Maps(Mapper)和Data Access Objects(DAO),相对于Hibernate而言它提供的是一种把自动化的ORM实现。MyBatis中一级缓存会默认启用(本地缓存)且不受控制,一般说缓存时指的是MyBatis的二级缓存

    优点:

    1、MyBatis封装了JBDC底层访问数据库的细节,程序员不需要与JDBC API打交道,就可以访问数据库

    2、MyBatis简单易学,程序员直接编写SQL语句,适合于对SQL语句性能要求比较高的项目

    3、SQL语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度

    4、SQL代码从程序代码中彻底分离出来,可重用

    5、提供了动态SQL标签,支持编写动态SQL

    6、提供映射标签,支持对象与数据库的ORM字段关系映射

    缺点:

    1、过于依赖数据库SQL语句,导致数据库移植性差,更换数据库,如果SQL语句有差异,SQL语句工作量大

    2、由于xml里标签id必须唯一,导致DAO中方法不支持方法重载

    3、字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)

    4、DAO层过于简单,对象组装的工作量较大

    5、不支持级联更新、级联删除

    6、编写动态sql时,不方便调试,尤其逻辑复杂时

    7、提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低

    8、使用不当,容易导致N+1的sql性能问题

    9、使用不当,关联查询时容易产生分页bug

    10、若不查询主键字段,容易造成查询出的对象有“覆盖”现象

    11、参数的数据类型支持不完善(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)

    12、多参数时,使用不方便,功能不够强大(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)

    13、缓存使用不当,容易产生脏数据

    (二)MyBatis-Plus

    优点:

    1、依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring

    2、损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

    3、预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击

    4、通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

    5、多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题

    6、支持热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动

    7、支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作

    8、支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码(生成自定义文件,避免开发重复代码),支持模板引擎、有超多自定义配置

    9、支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

    10、支持关键词自动转义:支持数据库关键词(order、key…)自动转义,还可自定义关键词

    11、内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询

    12、内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询  

    13、内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作

    14、默认将实体类的类名查找数据库中的表,使用@TableName(value="table1")注解指定表名,@TableId指定表主键,若字段与表中字段名保持一致可不加注解

    (三)MyBatis-Plus 和 Mybatis区别

    MyBatis:

    1、所有SQL语句全部自己写

    2、手动解析实体关系映射转换为MyBatis内部对象注入容器

    3、不支持Lambda形式调用

    Mybatis Plus:

    1、强大的条件构造器,满足各类使用需求

    2、内置的Mapper,通用的Service,少量配置即可实现单表大部分CRUD操作

    3、支持Lambda形式调用

    4、提供了基本的CRUD功能,连SQL语句都不需要编写

    5、自动解析实体关系映射转换为MyBatis内部对象注入容器

    三、MyBatis-Plus快速开始

    快速开始 | MyBatis-Plus

    准备环境:

    • 拥有 Java 开发环境以及相应 IDE
    • 熟悉 Spring Boot
    • 熟悉 Maven

    注:

    官网快速开始 Spring Boot 工程以 H2 作为默认数据库进行演示,本Demo使用MySQL数据库

    1、准备数据库、表

    1. DROP TABLE IF EXISTS user;
    2. CREATE TABLE user
    3. (
    4. id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    5. name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    6. age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    7. email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    8. PRIMARY KEY (id)
    9. )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    ENGINE=InnoDB使用InnoDB引擎,InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一

    DEFAULT CHARSET=utf8 数据库默认编码为utf-8 

    2、设置Maven本地仓库

    3、创建SpringBoot工程,添加依赖

    (1)引入 Spring Boot Starter 父工程

    1. <parent>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-parentartifactId>
    4. <version>2.7.3version>
    5. <relativePath/>
    6. parent>

    (2)引入 spring-boot-starterspring-boot-starter-testmybatis-plus-boot-starter、mysql 依赖

    1. <parent>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-parentartifactId>
    4. <version>2.7.3version>
    5. <relativePath/>
    6. parent>
    7. <groupId>com.companygroupId>
    8. <artifactId>mybatis-plus-demoartifactId>
    9. <version>1.0.0version>
    10. <name>mybatis-plus-demoname>
    11. <description>Demo project for Spring Bootdescription>
    12. <properties>
    13. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    14. <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
    15. <java.version>1.8java.version>
    16. properties>
    17. <dependencies>
    18. <dependency>
    19. <groupId>org.springframework.bootgroupId>
    20. <artifactId>spring-boot-starterartifactId>
    21. dependency>
    22. <dependency>
    23. <groupId>com.baomidougroupId>
    24. <artifactId>mybatis-plus-boot-starterartifactId>
    25. <version>3.5.1version>
    26. dependency>
    27. <dependency>
    28. <groupId>mysqlgroupId>
    29. <artifactId>mysql-connector-javaartifactId>
    30. <scope>runtimescope>
    31. dependency>
    32. <dependency>
    33. <groupId>org.projectlombokgroupId>
    34. <artifactId>lombokartifactId>
    35. <optional>trueoptional>
    36. dependency>
    37. <dependency>
    38. <groupId>org.springframework.bootgroupId>
    39. <artifactId>spring-boot-starter-testartifactId>
    40. <scope>testscope>
    41. dependency>
    42. dependencies>
    43. <build>
    44. <plugins>
    45. <plugin>
    46. <groupId>org.springframework.bootgroupId>
    47. <artifactId>spring-boot-maven-pluginartifactId>
    48. <configuration>
    49. <excludes>
    50. <exclude>
    51. <groupId>org.projectlombokgroupId>
    52. <artifactId>lombokartifactId>
    53. exclude>
    54. excludes>
    55. configuration>
    56. plugin>
    57. plugins>
    58. build>

    4、在 application.yml 配置文件中添加 MySQL 数据库的相关配置 

    1. spring:
    2. datasource:
    3. driver-class-name: com.mysql.cj.jdbc.Driver
    4. url: jdbc:mysql://127.0.0.1:3306/mybatisplusdb?useUnicode=true&characterEncoding=utf-8
    5. username: root
    6. password: admin123456

    5、编写entity实体类(此处使用了 Lombok简化代码)

    属性名和表中的列名一样

    1. //实体类
    2. @Data
    3. public class User {
    4. //定义属性: 属性名和表中的列名一样
    5. /**
    6. * 指定主键的方式:
    7. * value:主键字段的名称, 如果是id,可以不用写。
    8. * type:指定主键的类型, 主键的值如何生成。 idType.AUTO 表示自动增长。
    9. */
    10. @TableId(
    11. value="id",
    12. type = IdType.AUTO
    13. )
    14. private Integer id;
    15. private String name; // null
    16. private String email;
    17. //实体类属性,推荐使用包装类型, 可以判断是否为 null
    18. private Integer age; // 0
    19. @Override
    20. public String toString() {
    21. return "User{" +
    22. "id=" + id +
    23. ", name='" + name + '\'' +
    24. ", email='" + email + '\'' +
    25. ", age=" + age +
    26. '}';
    27. }
    28. }

    @TableId 设置主键

    value:主键字段的名称, 如果是id,可以不用写

    type:指定主键的类型, 主键的值如何生成。 idType.AUTO 表示自动增长

    6、编写mapper

    继承MyBatis Plus 中的 BaseMapper,在UserMapper中使用MP中的方法,实现CURD

    1. /**
    2. * 自定义Mapper,就是Dao接口
    3. * 1、要实现BaseMapper
    4. * 2、指定实体类
    5. *
    6. * BaseMapper是MP框架中的对象,定义19个操作方法(CRUD)
    7. */
    8. public interface UserMapper extends BaseMapper {
    9. }

    7、添加@MapperScan 注解 扫描 mapper文件所在包

    1. /**
    2. * @MapperScan: 扫描器,指定Mapper类所在的包
    3. */
    4. @MapperScan(value = "com.company.mapper")
    5. @SpringBootApplication
    6. public class MybatisPlusDemoApplication {
    7. public static void main(String[] args) {
    8. SpringApplication.run(MybatisPlusDemoApplication.class, args);
    9. }
    10. }

    8、测试

    1. //抑制警告,不然 @Autowired 自动注入会警告
    2. @SuppressWarnings("all")
    3. @SpringBootTest
    4. class MybatisPlusDemoApplicationTests {
    5. @Autowired
    6. private UserMapper userMapper;
    7. @Test
    8. void testInsert(){
    9. User user = new User();
    10. user.setName("zhangsan");
    11. user.setEmail("zhangsan@163.com");
    12. user.setAge(20);
    13. //调用UserMapper的方法, 也就是父接口BaseMapper中的提供的方法
    14. int rows = userMapper.insert(user);
    15. System.out.println("insert 的结果:" + rows);
    16. }
    17. }

  • 相关阅读:
    剑指offer——JZ27 二叉树的镜像 解题思路与具体代码【C++】
    stable diffusion comfyui的api使用教程
    Mock使用场景
    Ajax学习:HTTP协议请求报文与响应文本结构
    Vue3基础看这一篇就够了(万字长篇,附实例代码及效果演示)
    DS复杂度详解
    Python 的基本数据类型
    服务的网关-Zuul(1.5.x)
    【博客495】k8s调度器如何自定义插件执行顺序
    s27.linux运维面试题分享
  • 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/126521908