MyBatis-Plus:强大的Java持久化框架,让你告别手写sql语句

1.1.简介

1.2.特性

1.3.结构

1.4.支持数据库

2.快速开始

3.安装与配置

4.代码生成

5.综合案例

5.1.主键生成策略

5.2.自动填充


1.1.简介

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了一些常用功能的增强,使得开发者可以更加便捷地进行数据库访问操作。

我们的愿景是成为MyBatis最好的搭档,就像魂斗罗中的 1P2P,基友搭配,效率翻倍。

1.2.特性

  • CRUD操作的增强Mybatis-Plus通过提供通用的Mapper接口和封装的CRUD方法,简化了数据库的增删改查操作。开发者可以通过继承通用Mapper接口,无需编写SQL语句,就能完成基本的CRUD操作。

  • 条件构造器Mybatis-Plus提供了强大的条件构造器,使得构建复杂的查询条件变得更加灵活和易于维护。条件构造器支持链式调用,可以根据需求动态添加查询条件,包括等值条件、范围条件、模糊查询等。

  • 自动分页Mybatis-Plus可以自动处理分页查询,开发者只需要在查询方法中添加分页参数,即可实现数据的分页查询。它支持多种数据库的分页方式,如MySQL的LIMIT语句、Oracle的ROWNUM等。

  • 代码生成器Mybatis-Plus提供了一个代码生成器,可以根据数据库表结构自动生成实体类、Mapper接口、XML映射文件等基本代码。开发者可以通过简单的配置,快速生成大量的基础代码,减少了手写重复代码的工作量。

  • 全局通用操作Mybatis-Plus还提供了一些全局通用操作的增强,如逻辑删除、字段自动填充、乐观锁等。这些功能可以通过注解或配置进行开启,并且可以自定义实现,以满足不同业务场景的需求。

总的来说,Mybatis-Plus简化了Mybatis的开发流程,提高了开发效率。它提供了一些常用功能的增强,使得开发者无需编写繁琐的SQL语句,即可完成常见的数据库操作。同时,它也提供了一些附加功能,如条件构造器、自动分页、代码生成器等,进一步提升了开发效率和代码质量。

1.3.结构

  1. 核心模块(Core Module):核心模块包含了Mybatis-Plus的核心功能和基本组件。它提供了通用的Mapper接口、通用的CRUD方法的实现、条件构造器、分页插件等核心功能的实现。核心模块是整个框架的基础,其他模块都依赖于它。

  2. 代码生成器(Code Generator):代码生成器是一个可选的辅助工具,用于根据数据库表结构自动生成实体类、Mapper接口、XML映射文件等基础代码。通过代码生成器,开发者可以快速生成基础代码,减少手写重复代码的工作量。

  3. 扩展模块(Extension Module):扩展模块是Mybatis-Plus提供的一些扩展功能和增强组件的集合。它包括了一些常用的增强功能,如逻辑删除、字段自动填充、乐观锁等。开发者可以通过引入扩展模块,轻松地增加这些功能的支持。

  4. 注解(annotation):用于对实体类、Mapper接口以及SQL语句进行配置和标记。通过使用注解,可以简化配置文件的编写,提高代码的可读性和可维护性。

1.4.支持数据库

  • MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb,informix,TDengine,redshift

  • 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库

2.快速开始

使用Spring Initializer快速初始化一个 Spring Boot 工程(工程将以 MySQL 作为默认数据库)

基于Spring Boot 2.7.12MyBatis-Plus 3.5.2配置项目依赖。

添加依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
​
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
​
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
​
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
​
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.2</version>
</dependency>
​
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.44</version>
</dependency>

3.安装与配置

application.yml 配置文件中添加 MySQL 数据库的相关配置:

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 1234
    url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=false
mybatis-plus:
  # Mybatis Mapper所对应的XML位置
  mapper-locations: classpath:mapper/*.xml
  # 别名包扫描路径
  type-aliases-package: com.zking.spbootmp.model
  # 是否开启自动驼峰命名规则(camel case)映射
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    com.zking.spbootmp.mapper: debug

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

注意这里的包路径名必须和自己项目中的路径名相同否则会报错

@MapperScan({"com.zking.spbootmp.mapper"})
@SpringBootApplication
public class SpbootMpApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpbootMpApplication.class, args);
    }
}

4.代码生成

导入CodeGenerator.java代码生成类。

private final static String URL = "jdbc:mysql://localhost:3306/bookshop";
private final static String USERNAME = "root";
private final static String PASSWORD = "sasa";

private final static DataSourceConfig.Builder DATA_SOURCE_CONFIG =
        new DataSourceConfig.Builder(URL, USERNAME, PASSWORD);

public static void main(String[] args) {
    FastAutoGenerator.create(DATA_SOURCE_CONFIG)
            .globalConfig(//全局配置
                    (scanner, builder) ->
                            builder.author(scanner.apply("请输入作者名称?"))
                                    //生成的目录 拿到代码的工作路径
                                    .outputDir(System.getProperty("user.dir") + "\\src\\main\\java")
                                    .commentDate("yyyy-MM-dd")
                                    .dateType(DateType.TIME_PACK)
                    /*.disableOpenDir() 关闭打开文件夹*/
            )
            .packageConfig((builder) ->
                    builder.parent("com.zking.mybatisplus")
                            .entity("pojo")
                            .service("service")
                            .serviceImpl("service.impl")
                            .mapper("mapper")
                            .xml("mapper.xml")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "\\src\\main\\resources\\mapper"))
            )
            .injectionConfig((builder) ->
                    builder.beforeOutputFile(
                            (a, b) -> log.warn("tableInfo: " + a.getEntityName())
                    )
            )
            //策略配置
            .strategyConfig((scanner, builder) ->
                    builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
                            .addTablePrefix("tb_", "t_", "lay_", "meeting_", "sys_")
                            .entityBuilder()
                            .enableChainModel()
                            .enableLombok()
                            .enableTableFieldAnnotation()
                            .controllerBuilder()
                            .enableRestStyle()
                            .enableHyphenStyle()
                            .build()
            )
            //模板引擎是freemarker 所以要引入依赖
            .templateEngine(new FreemarkerTemplateEngine())
            .execute();
}

protected static List<String> getTables(String tables) {
    return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}

需要修改CodeGenerator.java类中的数据库名数据库账号密码作者包名即可。

代码生成后需要手动在mapper层增加@Repository 注解,让mapper交给spring管理

5.综合案例

5.1.主键生成策略

@TableId主键注解,放置于实体类中的主键字段上。

@Getter
@Setter
@TableName("t_book")
public class Book implements Serializable {
​
    private static final long serialVersionUID = 1L;
​
    /**
     * 书本编号
     */
    @TableId("bookid")
    private String bookid;
    
    ...
}

  • @TableId注解属性

属性类型必须指定默认值描述
valueString""主键字段名
typeEnumIdType.NONE指定主键类型

@TableId注解type属性IdType主键生成策略介绍:

描述
AUTO数据库 ID 自增
NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUTinsert 前自行 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 方法)

5.2.自动填充

@TableField字段注解(非主键),其中fill字段自动填充策略,具体策略如下:

 @TableField(value = "info",fill = FieldFill.INSERT_UPDATE)
    private String info;
描述
DEFAULT默认不处理
INSERT插入时填充字段
UPDATE更新时填充字段
INSERT_UPDATE插入和更新时填充字段

注解则是指定该属性在对应情况下必有值,如果无值则入库会是null

  • 自定义实现类 MyMetaObjectHandler

在pojo包上添加了fill属性需要在实现类这里修改成自己想要自动填充的属性

@Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始新增操作自动填充 ....");
        this.strictInsertFill(metaObject, "info", String.class, "自动填充insert");
    }
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
​
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始新增操作自动填充 ....");
        this.strictInsertFill(metaObject, "createdate", LocalDateTime.class, LocalDateTime.now());
    }
​
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始更新操作自动填充 ....");
        this.strictUpdateFill(metaObject, "createdate", LocalDateTime.class, LocalDateTime.now());
    }
}

情况一:fill = FieldFill.DEFAULT,无论是新增和更新都不进行自动填充;

情况二:fill = FieldFill.INSERT,执行新增操作自动填充数据;

情况三:fill = FieldFill.UPDATE,执行更新操作,若字段不为空则自动填充数据;再次执行更新操作不会刷新数据。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值