当前位置: 首页 > news >正文

第06章 MyBatisPlus概述

序言

1.内容介绍

​ 本章介绍了数据持久化的相关技术,对于什么是持久化、ORM原理、常用的ORM框架进行了一 一说明,对于MyBatisPlus的特点、MyBatisPlus架构以及MyBatisPlus的常用注解进行了详细的介绍,最后采用一个综合的案例对于MyBatisPlus的上机操作进行了实战演练。

2.理论目标

  • 了解什么是持久化?
  • 掌握ORM原理
  • 掌握常用ORM框架
  • 了解MyBatisPlus特性

3.技能目标

  • 熟练配置MyBatisPlus运行环境,为后期编码打好基础

4.实践案例

  • 采用MyBatisPlus实现用户列表检索操作

5.内容目录

  • 1.数据持久化概述
  • 2.MyBatisPlus概述
  • 3.MyBatisPlus初体验

第1节 数据持久化概述

1. 什么是持久化?

  • 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。
  • 持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等。

2. ORM原理

  • 即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。

3. 常用的ORM框架

  • Hibernate:全自动需要些hql语句
  • iBATIS:半自动自己写sql语句,可操作性强,小巧
  • MyBatis:是一个半自动的ORM持久层框架,内部封装了JDBC。
  • MyBatisPlus:是一个Mybatis的增强工具,它在Mybatis的基础上做了增强。

第2节 MyBatisPlus概述

1. 什么是MyBatisPlus?

  • Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
  • 已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就可以。

2. MyBatisPlus特点

  • 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring 。
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 。
  • 预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击 。
  • 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。
  • 分页插件支持多种数据库:支持MySQL,MariaDB,oracle,DB2,H2、HSQL,sQLite、Postgre,SQLServer等多种数据库
  • 内置性能分析插件:可输出Sq1语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表delete、update操作智能分析阻断,也可自定义拦截规则,预防误操作

3. 支持数据库

  • mysql、mariadb、oracle、db2 h2、hsql、sqlite、postgresql、sqlserver
  • 达梦数据库、虚谷数据库、人大金仓数据库

4. MyBatisPlus架构

5. MyBatisPlus注解

  • @TableName:表名注解
属性类型必须指定值默认值描述
valueString“”表名
schemaString“”schema(@since 3.1.1)
keepGlobalPrefixbooleanfalse是否保持使用全局的 tablePrefix 的值(如果设置了
全局 tablePrefix 且自行设置了value 的值)(@since 3.1.1)
resultMapString“”xml 中 resultMap 的 id
autoResultMapbooleanfalse是否自动构建 resultMap 并使用(如果设置resultMap
则不会进行 resultMap 的自动构建并注入)(@since 3.1.2)
  • @TableId:主键注解
属性类型必须指定默认值描述
valueString“”主键字段名
typeEnumIdType.NONE主键类型
  • @TableField:字段注解(非主键)
属性类型必须指定默认值描述
valueString“”字段名
elString“”映射为原生 #{ … } 逻辑当于写在 xml 里的 #{ … 部分
existbooleantrue是否为数据库表字段
conditionString“”字段 where 实体查询比较件,有值设置则按设置的
值为没有则为默认全局的 %s=# {%s}
updateString“”字段 update set 部分注例如:update="%s+1":
表更新时会
set version=version+1(该属优先级高于 el 属性)
strategyEnumFieldStrategy.DEFAULT字段验证策略 3.1.2+使用3个替代
insertStrategyEnumNDEFAULT举例:NOT_NULL: insert into table_a(column)
values (columnProperty )
updateStrategyEnumNDEFAULT举例:IGNORED: update table_a set column=# {columnProperty}
whereStrategyEnumNDEFAULT举例:NOT_EMPTY: where colum {columnProperty}
fillEnumFieldFill.DEFAULT字段自动填充策略
selectbooleantrue是否进行 select 查询
keepGlobalFormatbooleanfalse是否保持使用全局的 forma 进行处理(@since 3.1.1)
  • @Version:乐观锁注解、标记
  • @EnumValue:通枚举类注解(注解在枚举字段上)
  • @TableLogic:表字段逻辑处理注解(逻辑删除)
属性类型必须指定默认值描述
valueString“”逻辑未删除值
delvalString“”逻辑删除值
  • SqlParser: 租户注解,目前只支持注解在mapper的方法上
属性类型必须指定默认值描述
filterbooleanfalsetrue: 表示过滤SQL解析,即不会进入ISqlParser解析链,
否则会进解析链并追加例如tenant_id等条件
  • KeySequence:序列主键策略
    • 属性:value、resultMap
属性类型必须指定默认值描述
valueString“”序列名
clazzClassLong.classid的类型, 可以指定String.class,
这样返回的Sequence值是字符串"1"

第3节 MyBatisPlus初体验

1. 数据库准备

  • 构建数据表
DROP TABLE IF EXISTS user;

CREATE TABLE user
(
	id BIGINT(20) NOT NULL COMMENT '主键ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (id)
);
  • 初始化数据
DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

2. 添加依赖

 

<!-- MyBatisPlus依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <!-- 代码自动生成工具 mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.0</version> </dependency> <!-- mysql驱动依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!-- 数据连接池 druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.20</version> </dependency> <!-- lombok 实现实体类运行时添加构造器/setter/getter --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- lombok 实现实体类运行时添加构造器/setter/getter --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency>

3. 添加全局配置

 

spring: datasource: type: com.alibaba.druid.pool.DruidDataSource #Druid连接池类型 driver-class-name: com.mysql.jdbc.Driver #mysql驱动类 url: jdbc:mysql://localhost:3306/userdb #数据库url地址 username: root #数据库用户名 password: root #数据库密码 druid: validation-query: SELECT 1 FROM DUAL #验证的查询语句 initial-size: 10 #连接池启动时,创建的链接对象个数 min-idle: 10 max-active: 200 min-evictable-idle-time-millis: 300000 test-on-borrow: false test-while-idle: true time-between-eviction-runs-millis: 30000 pool-prepared-statements: true max-open-prepared-statements: 100 ....

4. 添加@MapperScan 注解

  • 在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹
 

@SpringBootApplication @MapperScan("cn.com.chinahitech.mybatisplus_demo.mapper") public class MybatisplusDemoApplication { public static void main(String[] args) { SpringApplication.run(MybatisplusDemoApplication.class, args); } }

5. 编码

  • 编写实体类User.java
 

@Data public class User { private Long id; private String name; private Integer age; private String email; }

  • 编写Mapper类 UserMapper.java
 

public interface UserMapper extends BaseMapper<User> { }

  • 添加测试类,进行功能测试
 

@RunWith(SpringRunner.class) @SpringBootTest class MybatisplusDemoApplicationTests { @Autowired private UserMapper userMapper; @Test public void testSelect() { System.out.println(("----- selectAll method test ------")); List<User> userList = userMapper.selectList(null); Assert.assertEquals(5, userList.size()); userList.forEach(System.out::println); } }

6. 执行单元测试

User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)

相关文章:

  • C语言-结构体
  • GlusterFS基本概念
  • Java 键盘输入n个数进行排序输出
  • Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第10章 Vuex状态管理 10.7 Vuex实例之登录退出
  • SpringBoot基础篇 (2)— REST讲解
  • 一次JAVA频繁写大文件的记录
  • 第16章大数据定制篇-Shell编程
  • 【Push Kit】推送返回80100016错误
  • 《三叶虫与其他故事》我的恐惧如涟漪扩散,荡漾过百万年的时光
  • 阿里云maven仓库地址
  • 【ENOVIA】MBOM经理概述 | 达索系统百世慧®
  • Gradle使用教程
  • 3dmax的Corona的渲染器材质要如何完全转换VRay材质?
  • 创建型模式-建造者模式(四)
  • 数智化发展助力建筑行业变革,B2B电子商务平台整合行业资源构筑B2B电商新格局
  • ----------
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • classpath对获取配置文件的影响
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • HTML5新特性总结
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript创建对象的四种方式
  • js递归,无限分级树形折叠菜单
  • Python中eval与exec的使用及区别
  • redis学习笔记(三):列表、集合、有序集合
  • Spring-boot 启动时碰到的错误
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • tensorflow学习笔记3——MNIST应用篇
  • 从零开始的无人驾驶 1
  • 高度不固定时垂直居中
  • 给新手的新浪微博 SDK 集成教程【一】
  • 两列自适应布局方案整理
  • 聊聊directory traversal attack
  • 前端性能优化--懒加载和预加载
  • 如何解决微信端直接跳WAP端
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 仓管云——企业云erp功能有哪些?
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #Linux(权限管理)
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (9)STL算法之逆转旋转
  • (C语言)逆序输出字符串
  • (libusb) usb口自动刷新
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (十五)使用Nexus创建Maven私服
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)SpringBoot3---尚硅谷总结
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)详解PHP处理密码的几种方式
  • (转载)利用webkit抓取动态网页和链接
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程