MyBatisPlus特性
● 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
● 损耗小:启动即会自动注入基本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 操作智能分析阻断,也可自定义拦截规则,预防误操作
pom.xml添加依赖
<properties>
<mybatis.plus.version>3.0-RELEASE</mybatis.plus.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
//代码生成器
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
</dependencies>
在配置文件中配置数据库连接信息
properties文件:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name: com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot?serverTimezone=GMT%2B8&
spring.datasource.username=root
spring.datasource.password=admin
yml文件:
spring:
datasource:
type:com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springboot?serverTimezone=GMT%2B8&
username: root
password:
编码
1、POJO类
@Data
public class Book {
private Integer id;
private String name;
private String author;
private double price;
private Date publicationDate;
}
lombok 是一个工具类库,可以用简单的注解形式来简化代码,提高开发效率。
使用lombok必须要安装此插件,它提供的常用注解如下:
●@Data :注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
● @AllArgsConstructor : 注在类上,提供类的全参构造
● @NoArgsConstructor : 注在类上,提供类的无参构造
● @Setter : 注在属性上,提供 set 方法
● @Getter : 注在属性上,提供 get 方法
● @EqualsAndHashCode: 注在类上,提供对应的 equals 和 hashCode 方法
● @Log4j/@Slf4j : 注在类上,提供对应的 Logger 对象,变量名为 log
2、Mapper层
在mapper包下创建BookMapper.java编写Mapper类 UserMapper.java 继承 BaseMapper
@Mapper
public interface BookMapper extends BaseMapper<Book> {
}
① BaseMapper中
泛型 T 为实体对象
,代表CURD操作的对象。
②BaseMapper接口提供了基本的CURD方法,无需手动实现可以直接使用。
(BaseMapper提供的已经实现的方法)
③ 自己也可以在mapper中自定义方法。
3、扫描 Mapper 文件
在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件
@SpringBootApplication
@MapperScan("newstar.springboot.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(QuickStartApplication.class, args);
}
}
4、Service层和Controller层
同MyBatis
配置日志
properties文件:
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
yml文件:
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
ID生成策略及其配置
1、ID生成策略
①
数据库ID自增 AUTO
数据库需要支持主键自增(如MySQL),并设置主键自增
②未设置 NONE
该类型为未设置主键类型,默认使用雪花算法
生成(snowflake)
③用户输入ID INPUT
数据类型和数据库保持一致就行 ,该类型可以通过自己注册自动填充插件进行填充
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
④全局唯一ID (数值类型) ID_WORKER
数据库中也必须是数值类型,否则会报错 。mp自带策略,生成19位值,数字类型使用这种策略,比如long
⑤全局唯一ID UUID
每次生成随即唯一的值 。缺点:排序不方便
⑥字符串全局唯一ID (字符串类型) ID_WORKER_STR
数据库也要保证一样字符类型。mp自带策略,生成19位值。字符串类型使用这种策略。
2、配置ID生成策略
(1)默认
MybatisPlus默认使用全局唯一的数字类型 ID_WORKER
。
(2)注解配置
在bean的ID属性加@TableId注解的方式设置
@TableId(type = IdType.ID_WORKER_STR)
private String id;
(3)全局配置
properties文件
mybatis-plus.global-config.db-config.id-type = auto
yml文件:
mybatis-plus:
global-config:
db-config:
# 主键ID类型
id-type: auto
优先级:注解 > 全局 > 默认
关于驼峰命名
mybatis-plus对于驼峰式命名的处理:
对于驼峰式命名的实体名和字段名,mybatis-plus默认处理是通过下划线分隔。
比如SysUser实体名默认映射sys_user表;比如UserName字段名默认映射是 user_name表。
配置文件关闭驼峰式命名的处理:
properties:
mybatis-plus.configuration.map-underscore-to-camel-case=false
yml:
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
自动填充
1、什么时候用到自动填充
在对数据库进行一些操作的时候,有些公共字段基本是固定的(比如create_time创建时间、modify_time修改时间、create_name创建人、modify_name:修改人),我们可以利用mybatisplus的自动填充功能来实现。
2、实现流程
(1)在实体类中需要自动填充的字段属性上添加注解@TableField(fill = FieldFill.INSERT)
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date modifyTime;
①
实体类属性的驼峰命名映射到数据库中下划线命名的字段
。比如:createTime对应create_time
② 自动填充的时机:DEFAULT(默认不处理)、INSERT(插入时填充)、UPDATE(更新时填充)、INSERT_UPDATE(插入或更新时填充)
(2)编写处理器来处理注解
@Slf4j //打印日志注解
@Component //将配置类注入到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ...."); //打印日志
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
① 填充原理是直接给entity的属性设置值!!!
② 填充处理器MyMetaObjectHandler在 Spring Boot中需要声明@Component或@Bean注入
代码生成器
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
1、添加依赖
(1)添加 代码生成器 依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.2</version>
</dependency>
(2)添加 模板引擎 依赖
MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎。
① Velocity(默认)
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
② Freemarker
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
③ Beetl
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>3.3.2.RELEASE</version>
</dependency>
注意!如果您选择了非默认引擎,需要在 AutoGenerator 中 设置模板引擎
AutoGenerator generator = new AutoGenerator();
// set freemarker engine
generator.setTemplateEngine(new FreemarkerTemplateEngine());
// set beetl engine
generator.setTemplateEngine(new BeetlTemplateEngine());
// set custom engine (reference class is your custom engine class)
generator.setTemplateEngine(new CustomTemplateEngine());
2、编写配置
MyBatis-Plus 的代码生成器提供了大量的自定义参数供用户选择,能够满足绝大部分人的使用需求。
public class CodeGenerator {
public static void main(String[] args) {
// 代码生成器对象
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() { }
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
//配置执行生效
mpg.execute();
}
}
(1)全局配置
GlobalConfig globalConfig = new GlobalConfig();
//设置代码生成路径在该项目中,若不设置默认在D盘根目录下
globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
//设置代码文件的作者
globalConfig.setAuthor("lhj");
//设置生成文件后是否打开文件所在窗口
globalConfig.setOpen(false);
//设置是否覆盖
globalConfig.setFileOverride(false)
//设置所有的Service接口文件名字开头不是I
globalConfig.setServiceName("%sService")
//配置Id类型
globalConfig.setIdType(IdType.xxx)
//配置日期类型
globalConfig.setDateType()
mpg.setGlobalConfig(globalConfig)
(2)数据源配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/ant?useUnicode=true&useSSL=false&characterEncoding=utf8");
dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("admin");
dataSourceConfig.setDbType(DbType.MYSQL)
mpg.setGlobalConfig(globalConfig)
(3)包配置
PackageConfig packageConfig = new PackageConfig();
//设置包名
packageConfig.setModuleName("mybatisplus");
//设置包的父路径
packageConfig.setParent("com.newstar");
//设置实体类包名
packageConfig.setEntity("entity");
//设置Service层包名
packageConfig.setService("service");
//设置Mapper层包名
packageConfig.setMapper("mapper");
//设置Controller层包名
packageConfig.setController("controller") ;
mpg.setPackageInfo(packageConfig);
(4)策略配置
StrategyConfig strategy = new StrategyConfig();
//数据库表映射到实体的命名策略
strategy.setNaming(NamingStrategy.underline_to_camel);
//数据库表字段映射到实体的命名策略, 未指定按照 naming 执行
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//需要映射的表名
strategy.setInclude("Book","User");
//实体是否为lombok模型(默认 false)
strategy.setEntityLombokModel(true);
//生成 @RestController 控制器
strategy.setRestControllerStyle(true);
//设置url使用下划线命名
strategy.setControllerMappingHyphenStyle(true);
//自动填充
TableFill cTime = new TableFill("c_time",FieldFill.INSERT);
TableFill mTime = new TableFill("m_time",FieldFill.INSERT_UPDATE);
ArrayList<TableFill>tableFills = new ArrayList<>();
tableFills.add(cTime);
tableFills.add(mTime);
strategy.setTableFillList(tableFills);
//乐观锁设置
strategy.setVersionFieldName("version");
mpg.setStrategy(strategy);
注:代码生成器的自动填充只是生成了实体类,还需要自己完成处理器定义。
分页
1、配置类配置分页插件
@Configuration
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;
}
}
2、使用分页
Page<Book> page = new Page<>(1,5);
page = bookMapper.selectPage(page, Wrapper);
List<Book>list = page.getRecords();
① new Page<>(1,5) 的
参数分别为第几页和该页的数据条数
② 对象 Wrapper 为条件构造器表示查询条件,没有条件时可以设置为null