SpringBoot整合持久化层——MyBatisPlus

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&amp
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&amp
    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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值