MyBatis基础入门篇
MyBatis基础入门篇
AlanMayBatis基础快速入门
简介
如下教程学习自尚硅谷杨博超老师的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 操作智能分析阻断,也可自定义拦截规则,预防误操作
支持数据库支持数据库
- MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb,informix,TDengine,redshift
- 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库
框架结构
快速开始
我们将通过一个简单的 Demo 来阐述 MyBatis-Plus 的强大功能,在此之前,我们假设您已经:
- 拥有 Java 开发环境以及相应 IDE
- 熟悉 Spring Boot
- 熟悉 Maven
现有一张 User
表,其表结构如下:
id | name | age | |
---|---|---|---|
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 |
其对应的数据库 Schema 脚本如下:
1 | DROP TABLE IF EXISTS user; |
其对应的数据库 Data 脚本如下:
1 | DELETE FROM user; |
初始化工程
创建一个空的 Spring Boot 工程(工程将以 H2 作为默认数据库进行演示)
添加依赖
引入 Spring Boot Starter 父工程:
1 | <parent> |
引入 spring-boot-starter
、spring-boot-starter-test
、mybatis-plus-boot-starter
、h2
1 | <dependencies> |
配置
在 application.yml
配置文件中添加 H2 数据库的相关配置:
1 | # DataSource Config |
在 Spring Boot 启动类中添加 @MapperScan
注解,扫描 Mapper 文件夹:
1 |
|
编码
编写实体类 User.java
(此处使用了 Lombok 简化代码)
1 |
|
编写 Mapper 包下的 UserMapper
接口
1 | public interface UserMapper extends BaseMapper<User> { |
开始使用
添加测试类,进行功能测试:
1 |
|
控制台输出:
1 | User(id=1, name=Jone, age=18, email=test1@baomidou.com) |
安装
全新的 MyBatis-Plus
3.0 版本基于 JDK8,提供了 lambda
形式的调用,所以安装集成 MP3.0 要求如下:
- JDK 8+
- Maven or Gradle
Release
Spring Boot
Maven:
1 | <dependency> |
Gradle:
1 | //Gradle Version:<4.1 |
Spring
Maven:
1 | <dependency> |
Gradle:
1 | //Gradle Version:<4.1 |
Snapshot
快照 SNAPSHOT 版本需要添加仓库,且版本号为快照版本 点击查看最新快照版本号
Maven:
1 | <repository> |
Gradle:
1 | repositories { |
配置
MyBatis-Plus 的配置异常的简单,我们仅需要一些简单的配置即可使用 MyBatis-Plus 的强大功能!
Spring Boot 工程
- 配置 MapperScan 注解
1 |
|
Spring 工程
- 配置 MapperScan
1 | <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> |
- 调整 SqlSessionFactory 为 MyBatis-Plus 的 SqlSessionFactory
1 | <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> |
注解
本文将介绍 MybatisPlus
注解包相关类详解(更多详细描述可点击查看源码注释)
@TableName
- 描述:表名注解,标识实体类对应的表
- 使用位置:实体类
1 |
|
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 表名 |
schema | String | 否 | “” | schema |
keepGlobalPrefix | boolean | 否 | false | 是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时) |
resultMap | String | 否 | “” | xml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定) |
aytoResultMap | boolean | 否 | false | 是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入) |
excludeProperty | String[] | 否 | {} | 需要排除的属性名 @since 3.3.1 |
关于 autoResultMap
的说明:
MP 会自动构建一个 resultMap
并注入到 MyBatis 里(一般用不上),请注意以下内容:
因为 MP 底层是 MyBatis,所以 MP 只是帮您注入了常用 CRUD 到 MyBatis 里,注入之前是动态的(根据您的 Entity 字段以及注解变化而变化),但是注入之后是静态的(等于 XML 配置中的内容)。
而对于 typeHandler
属性,MyBatis 只支持写在 2 个地方:
- 定义在 resultMap 里,作用于查询结果的封装
- 定义在
insert
和update
语句的#{property}
中的property
后面(例:#{property,typehandler=xxx.xxx.xxx}
),并且只作用于当前设置值
除了以上两种直接指定 typeHandler
的形式,MyBatis 有一个全局扫描自定义 typeHandler
包的配置,原理是根据您的 property
类型去找其对应的 typeHandler
并使用。
@TableId
- 描述:主键注解
- 使用位置:实体类主键字段
1 |
|
属性 | 类型 | 必须指定 | 默认值 | 属性 |
---|---|---|---|---|
value | String | 否 | “” | 主键字段名 |
type | Enum | 否 | idType.NOME | 指定主键类型 |
IdType
值 | 描述 |
---|---|
AUTO | 数据库 ID 自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
INPUT | insert 前自行 set 主键值 |
ASSIGN_ID | 分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator 的方法nextId (默认实现类为DefaultIdentifierGenerator 雪花算法) |
ASSIGN_UUID | 分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator 的方法nextUUID (默认 default 方法) |
分布式全局唯一 ID 长整型类型(please use ASSIGN_ID ) | |
32 位 UUID 字符串(please use ASSIGN_UUID ) | |
分布式全局唯一 ID 字符串类型(please use ASSIGN_ID ) |
@TableField
- 描述:字段注解(非主键)
1 |
|
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 数据库字段名 |
exist | boolean | 否 | true | 是否为数据库表字段 |
condition | String | 否 | “” | 字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 `%s=# |
- 0鼓励
- 0菜狗
- 0正确
- 0错误
- 0思考
- 0无聊