序言
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:表名注解
属性 | 类型 | 必须指定值 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 表名 |
schema | String | 否 | “” | schema(@since 3.1.1) |
keepGlobalPrefix | boolean | 否 | false | 是否保持使用全局的 tablePrefix 的值(如果设置了 全局 tablePrefix 且自行设置了value 的值)(@since 3.1.1) |
resultMap | String | 否 | “” | xml 中 resultMap 的 id |
autoResultMap | boolean | 否 | false | 是否自动构建 resultMap 并使用(如果设置resultMap 则不会进行 resultMap 的自动构建并注入)(@since 3.1.2) |
- @TableId:主键注解
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 主键字段名 |
type | Enum | 否 | IdType.NONE | 主键类型 |
- @TableField:字段注解(非主键)
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 字段名 |
el | String | 否 | “” | 映射为原生 #{ … } 逻辑当于写在 xml 里的 #{ … 部分 |
exist | boolean | 否 | true | 是否为数据库表字段 |
condition | String | 否 | “” | 字段 where 实体查询比较件,有值设置则按设置的 值为没有则为默认全局的 %s=# {%s} |
update | String | 否 | “” | 字段 update set 部分注例如:update="%s+1": 表更新时会 set version=version+1(该属优先级高于 el 属性) |
strategy | Enum | 否 | FieldStrategy.DEFAULT | 字段验证策略 3.1.2+使用3个替代 |
insertStrategy | Enum | N | DEFAULT | 举例:NOT_NULL: insert into table_a(column) values (columnProperty ) |
updateStrategy | Enum | N | DEFAULT | 举例:IGNORED: update table_a set column=# {columnProperty} |
whereStrategy | Enum | N | DEFAULT | 举例:NOT_EMPTY: where colum {columnProperty} |
fill | Enum | 否 | FieldFill.DEFAULT | 字段自动填充策略 |
select | boolean | 否 | true | 是否进行 select 查询 |
keepGlobalFormat | boolean | 否 | false | 是否保持使用全局的 forma 进行处理(@since 3.1.1) |
- @Version:乐观锁注解、标记
- @EnumValue:通枚举类注解(注解在枚举字段上)
- @TableLogic:表字段逻辑处理注解(逻辑删除)
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 逻辑未删除值 |
delval | String | 否 | “” | 逻辑删除值 |
- SqlParser: 租户注解,目前只支持注解在mapper的方法上
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
filter | boolean | 否 | false | true: 表示过滤SQL解析,即不会进入ISqlParser解析链, 否则会进解析链并追加例如tenant_id等条件 |
- KeySequence:序列主键策略
- 属性:value、resultMap
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 序列名 |
clazz | Class | 否 | Long.class | id的类型, 可以指定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)