你应该懂点Mybatis-plus,真的好用

目录

1.mybatis-plus是什么?

2.环境准备

2.1 依赖添加:

2.2 配置Mybatis-plus:

2.2.1 配置字段说明

 2.3 springboot启动类。

3.4数据源配置 

3.Mybatis-plus的简单使用 

3.1 定义实体类:

3.3.1 一些注解的解释 

3.2 定义Mapper接口:

3.3 定义service接口

3.3.1 继承IService定义服务接口

3.3.2 继承ServiceImpl 实现 service接口

3.4 使用Mybatis-plus:

4. 自动填充

4.1FeildFill说明:

 4.2 FeildFill实现


1.mybatis-plus是什么?

Mybatis-plus 是一个基于 Mybatis 的增强工具,提供了许多便捷的 CRUD 操作和其他实用功能,简化了数据库访问的开发工作。它是 Mybatis 的一个开源组件,遵循 Apache 2.0 协议。

Mybatis-plus 的主要功能包括:

  • 自动代码生成器:通过简单配置,可以快速生成 Mapper 接口和实体类的代码;
  • 便捷的 CRUD 操作:提供了多种查询和更新操作的 API,使操作数据库更加简单易用;
  • 通用分页插件:支持多种数据库的分页查询,并提供了丰富的分页参数设置和结果处理方法;
  • 条件构造器:可以根据复杂的查询条件动态生成 SQL,简化了查询操作;
  • 逻辑删除:支持逻辑删除,并提供了逻辑删除时自动填充字段的功能;
  • 乐观锁:支持基于版本号的乐观锁;
  • 序列生成器:支持多种数据库的序列生成策略。

Mybatis-plus 提供了丰富的文档和示例,使开发人员能够更快地上手和使用它的功能。它也得到了广泛的社区支持和贡献,成为了国内开发者广泛使用的数据库访问框架之一。

可以参考官方文档:官方参考文档http://baomidou.com/

2.环境准备

2.1 依赖添加:

 在Maven项目中,可以在pom.xml文件中添加以下依赖:

 关于依赖版本可以到,依赖库查看:maven依赖仓库https://mvnrepository.com/

引入mybatis-plus依赖: 

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>


或者
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>{latest-version}</version>
</dependency>

引入 Mybatis-plus 的代码生成器模块:

 <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-generator</artifactId>
      <version>3.2.0</version>
    </dependency>

 引入mysl或者oracle:

1:引入 MySQL 数据库的 JDBC 驱动

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
</dependency>

2.引入 Oracle 数据库的 JDBC 驱动 

 <dependency>
      <groupId>com.oracle.database.jdbc</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.4</version>
    </dependency>

目前,多数项目会有多数据源的要求,或者是主从部署的要求,所以我们还需要引入mybatis-plus关于多数据源的依赖

 引入mybatis-plus关于多数据源的依赖

<!-- mybatis-plus 多数据源 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

2.2 配置Mybatis-plus:

 在Spring Boot项目中,可以在application.yml文件中添加以下配置:

mybatis-plus:
  type-enums-package: com.zt.plant.traed.api.domain.*
  type-aliases-package: com.zt.plant.traed.*.domain
  mapper-locations: classpath:/mapper/**/*.xml

常规使用的话,配置枚举类包,实体类表(存储跟表明相关的DTO),映射文件位置(通用)

2.2.1 配置字段说明

Mybatis-plus 是一个 Mybatis 的增强工具,提供了很多实用的功能,同时也引入了一些新的配置项。下面是一些常用的 Mybatis-plus 中的配置项说明:

  • mapper-locations:指定 Mybatis XML 映射文件的位置,可以使用通配符。
  • type-aliases-package:指定实体类的包名,Mybatis-plus 会自动将这些实体类注册为别名,方便在 XML 映射文件中使用。
  • type-enums-package 是 Mybatis-plus 中的一个配置项,用于指定枚举类型所在的包名,以便 Mybatis-plus 在进行类型处理时能够自动将这些枚举类型注册为类型处理器。
  • type-handlers-package:指定类型处理器的包名,Mybatis-plus 会自动扫描该包下的类型处理器,并注册到 Mybatis 中。
  • configuration.cache-enabled:控制 Mybatis 是否启用二级缓存,默认为 true。
  • configuration.lazy-loading-enabled:控制 Mybatis 是否启用延迟加载,默认为 false。
  • configuration.map-underscore-to-camel-case:控制 Mybatis 是否开启驼峰命名自动映射,默认为 false。
  • configuration.default-fetch-size:设置默认的 JDBC fetchSize,默认为未设置。
  • configuration.default-statement-timeout:设置默认的 JDBC 查询超时时间,默认为未设置。
  • configuration.default-executor-type:设置默认的执行器类型,可选值为 SIMPLE、REUSE 和 BATCH,默认为 SIMPLE。
  • configuration.call-setters-on-nulls:控制 Mybatis 是否调用 setter 方法设置 null 值,默认为 false。
  • configuration.jdbc-type-for-null:控制 Mybatis 如何处理 null 值,可选值为 NULL、VARCHAR、OTHER(默认为 NULL)。
  • configuration.log-impl:指定 Mybatis 使用的日志框架,默认为 Log4j2。
  • configuration.wrap-result-maps:控制 Mybatis 是否对结果集进行包装,默认为 false。
  • configuration.default-statement-type:设置默认的语句类型,可选值为 STATEMENT、PREPARED 或 CALLABLE,默认为 PREPARED。
  • global-config.db-config.id-type:设置全局的 ID 生成策略,可选值为 AUTO、NONE、INPUT、ID_WORKER、UUID、ID_WORKER_STR,默认为 AUTO。
  • global-config.db-config.logic-delete-field:设置逻辑删除字段的名称,默认为 null,表示不使用逻辑删除。
  • global-config.db-config.logic-delete-value:设置逻辑删除标记的值,默认为 1。
  • global-config.db-config.logic-not-delete-value:设置未删除标记的值,默认为 0。

这些配置项可以在 mybatis-plus-config.xmlapplication.yml(或 application.properties)文件中进行配置。根据具体需求选择需要配置的配置项即可。

 2.3 springboot启动类。

 配置@MapperScan注解,用于扫描Mapper文件位置: 

@EnableScheduling
@SpringBootApplication
@EnableSwaggerBootstrapUI //开启swagger 增强, 排序等
@EnableDiscoveryClient //开启服务发现客户端
@MapperScan("com.zt.plant.traed.api.repository")//mybatis-plus扫描接口
@ComponentScan(basePackages = {"com.zt.plant.*"})
public class recentlyApplication {

    public static void main(String[] args) {
        SpringApplication.run(recentlyApplication.class, args);
    }


}

3.4数据源配置 

  # 数据库配置
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driverClassName: oracle.jdbc.OracleDriver
    url: jdbc:oracle:thin:@//110.111.10.10:1521/orcl
    username: system
    password: oracledba
    # Hikari 连接池配置
    hikari:
      # 最小空闲连接数量
      minimum-idle: 5
      # 空闲连接存活最大时间,默认600000(10分钟)
      idle-timeout: 900000
      # 连接池最大连接数,默认是10
      maximum-pool-size: 50
      # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
      auto-commit: true
      # 连接池名称      pool-name: MyHikariCP
      # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
      max-lifetime: 1800000
      # 数据库连接超时时间,默认30秒,即30000
      connection-timeout: 30000
      connection-test-query: SELECT 1 FROM DUAL
    schema-username: Recently

HikariCP 是一个高性能的 JDBC 连接池,是目前被广泛使用的连接池之一。它是一个轻量级的连接池,具有优异的性能表现和低资源消耗,能够极大地提高应用程序的数据库访问性能和并发处理能力。 

3.Mybatis-plus的简单使用 

3.1 定义实体类:

 使用Mybatis-plus需要定义实体类,通常会使用注解来描述表名、字段名等信息。例如:

@TableName 表名注解,用于标识实体类对应的表。

@Data
@TableName("user")
public class User {

    @TableId(type = IdType.AUTO)
    private Long id;

    @TableField(value = "diseasename")
    private String name;

    @TableField(value = "numberWin")
    private Integer win;

    @TableField(exist = false)
    private Integer age;



    /**
     * 创建时间
     */
    @TableField(value = "create_date", jdbcType = JdbcType.TIMESTAMP, fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间<新增/修改忽略>", position = 95)
    protected Date createDate;

    /**
     * 修改人
     */
    @TableField(value = "update_by", jdbcType = JdbcType.BIGINT, fill = FieldFill.UPDATE)
    @ApiModelProperty(value = "修改人<新增/修改忽略>", position = 96)
    protected Long updateBy;

    /**
     * 删除标记(0:正常;1:删除)
     */
    @TableLogic
    @TableField(value = "del_flag", jdbcType = JdbcType.VARCHAR, fill = FieldFill.INSERT)
    @ApiModelProperty(value = "删除标记(0:正常;1:删除)<新增/修改忽略>", position = 99)
    protected String delFlag;
}

3.3.1 一些注解的解释 

1.IdType

com.baomidou.mybatisplus.annotation.IdType 是 Mybatis-Plus 提供的一个枚举类型,用于定义主键的生成策略。 

IdType 枚举类型包括以下几种类型:

  • AUTO:自动增长,适用于 MySQL、SQL Server 等支持自动增长的数据库。
  • NONE:无主键,适用于一些没有主键的情况。
  • INPUT:手动输入,适用于手动输入主键值的情况。
  • ID_WORKER:全局唯一 ID,适用于分布式系统中的唯一 ID 生成。
  • UUID:全局唯一 UUID,适用于需要使用 UUID 作为主键的情况。
  • ID_WORKER_STR:字符串类型的全局唯一 ID,适用于分布式系统中的唯一 ID 生成,以字符串类型存储。

原代码:

import lombok.Getter;

/**
 * 生成ID类型枚举类
 */
@Getter
public enum IdType {
    /**
     * 数据库ID自增
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型(将跟随全局)
     */
    NONE(1),
    /**
     * 用户输入ID
     * <p>该类型可以通过自己注册自动填充插件进行填充</p>
     */
    INPUT(2),

    /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
    /**
     * 全局唯一ID (idWorker)
     */
    ID_WORKER(3),
    /**
     * 全局唯一ID (UUID)
     */
    UUID(4),
    /**
     * 字符串全局唯一ID (idWorker 的字符串表示)
     */
    ID_WORKER_STR(5);

    private final int key;

    IdType(int key) {
        this.key = key;
    }
}

2. @TableFiled

@TableField 是 Mybatis-Plus 提供的一个注解,用于标注实体类中的字段和数据表中的列之间的映射关系。

@TableField 注解包括以下属性:

  • value:数据表中对应的列名,如果实体类中的字段名与数据表中的列名相同,则可以省略该属性。
  • exist:是否为数据库表字段,默认为 true。如果设置为 false,则表示该字段不是数据库表中的字段,不会进行增删改查操作。
  • select:是否进行查询操作,默认为 true。如果设置为 false,则表示查询操作不会查询该字段。
  • insert:是否进行插入操作,默认为 true。如果设置为 false,则表示插入操作不会插入该字段。
  • update:是否进行更新操作,默认为 true。如果设置为 false,则表示更新操作不会更新该字段。

3.   @TableLogic 

 @TableLogic 是 Mybatis-Plus 提供的注解之一,用于实现逻辑删除功能。逻辑删除是指在数据库中标记一个数据已经被删除,而不是直接将其从数据库中删除。通过逻辑删除,可以在一定程度上保留数据的完整性,同时也方便数据恢复和审计等操作。

3.2 定义Mapper接口:

 使用Mybatis-plus需要定义Mapper接口,可以继承Mybatis-plus提供的BaseMapper接口,也可以定义自己的方法。例如:

只在代码种显示了主要的import  包,其他的没有加上,可以自行加上

mybatis-plus将常用的CRUD接口封装成了BaseMapper接口,我们只需要在自己的Mapper中继承它就可以了,也可以加上自己的其他: 


import com.baomidou.mybatisplus.core.mapper.BaseMapper;



@Repository
public interface UserMapper extends BaseMapper<User> {
    List<User> selectByName(String name);
}

3.3 定义service接口

3.3.1 继承IService定义服务接口

需要在自己定义的service接口当中继承IService接口: 

 在 Mybatis-Plus 中,通常需要定义一个 Service 接口,用于封装业务逻辑和数据访问操作。Service 接口通常需要继承 IService 接口,并定义相应的业务操作方法。 

import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {

    /**
     * 根据 ID 查询用户
     *
     * @param id 用户 ID
     * @return 用户信息
     */
    User getUserById(Long id);

    /**
     * 添加用户
     *
     * @param user 用户信息
     * @return 是否添加成功
     */
    boolean addUser(User user);

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return 是否更新成功
     */
    boolean updateUser(User user);

    /**
     * 删除用户
     *
     * @param id 用户 ID
     * @return 是否删除成功
     */
    boolean deleteUser(Long id);
}

IService 是 Mybatis-Plus 框架中的一个接口,是 Service 层的基础接口。IService 定义了一系列的 CRUD(增删改查)操作,包括插入、删除、修改、查询、分页等常用的数据操作方法。同时,IService 还提供了一些常用的数据操作辅助方法,如批量插入、批量更新等。

IService 的主要作用是为 Service 层的实现提供了一套统一的数据操作接口,简化了 Service 层的编码,同时提高了代码的可读性和可维护性。使用 IService 可以快速开发出满足业务需求的数据操作方法,同时还可以通过 Mybatis-Plus 提供的一系列辅助方法快速实现复杂的数据操作功能。

3.3.2 继承ServiceImpl 实现 service接口

同时要在我们的接口实现impl当中继承ServiceImpl,实现自己的接口: 

在实现具体的业务逻辑时,可以通过调用 IService 接口提供的方法来实现相应的数据操作。例如,在实现 getUserById 方法时,可以通过调用 IService 接口提供的 getById 方法来查询用户信息: 

import com.lz.platform.trauma.common.service.UserService ;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public User getUserById(Long id) {
        return getById(id);
    }

    @Override
    public boolean addUser(User user) {
        return save(user);
    }

    @Override
    public boolean updateUser(User user) {
        return updateById(user);
    }

    @Override
    public boolean deleteUser(Long id) {
        return removeById(id);
    }
}

ServiceImpl 是 Mybatis-Plus 提供的 Service 接口的默认实现,它实现了 IService 接口中定义的常用的增删改查方法。使用 ServiceImpl 可以避免编写大量的重复代码,提高代码的可读性和可维护性。 

 需要注意的是,ServiceImpl 实现的是 IService 接口中定义的常用方法,如果需要实现更复杂的业务逻辑,仍需要在 Service 接口中定义相应的方法并在ServiceImpl 中实现相应的业务逻辑。

3.4 使用Mybatis-plus:

 在业务代码中可以直接使用Mybatis-plus提供的方法,例如:

@Autowired
private UserMapper userMapper;

public void test() {
    User user = new User();
    user.setName("test");
    user.setAge(18);
    userMapper.insert(user);
    
    List<User> userList = userMapper.selectList(null);
    for (User u : userList) {
        System.out.println(u);
    }
    
    List<User> userList2 = userMapper.selectByName("test");
    for (User u : userList2) {
        System.out.println(u);
    }
}

4. 自动填充

4.1FeildFill说明:

实体类中有个注解叫:@TableFeild ,其中有一个属性叫:fill,通过FieldFill设置属性,这个就是做自动填充用的。

FieldFill 是 Mybatis-Plus 提供的一个枚举类型,用于定义自动填充的字段类型。在使用 Mybatis-Plus 进行数据操作时,我们通常会遇到一些需要自动填充的字段,比如创建时间、更新时间等。Mybatis-Plus 提供了 FieldFill 枚举类型来实现这些自动填充操作。

FieldFill 枚举类型包括以下几种类型:

  • INSERT:表示在插入数据时自动填充字段。
  • UPDATE:表示在更新数据时自动填充字段。
  • INSERT_UPDATE:表示在插入或更新数据时都自动填充字段。

 4.2 FeildFill实现

FeildFill是不能使用的,使用 FieldFill 需要通过实现 MyBatis-Plus 提供的接口来完成。

具体的步骤如下:

1:定义枚举类型 FieldFill 

public enum FieldFill {
    /**
     * 默认不处理
     */
    DEFAULT,
    /**
     * 插入时填充字段
     */
    INSERT,
    /**
     * 更新时填充字段
     */
    UPDATE,
    /**
     * 插入和更新时填充字段
     */
    INSERT_UPDATE
}

 2. 实体类中的需要填充的字段上使用 @TableField 注解,加上 fill 属性,指定填充方式。可以指定一个或多个填充方式,多个填充方式之间用逗号分隔。

@Data
@TableName("user")
public class User {
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

在这个示例中,User 类中的 updateTime 字段上加上了 @TableField(fill = FieldFill.INSERT_UPDATE) 注解,表示在插入和更新时都填充 updateTime 字段。 

3. 创建一个实现了 MetaObjectHandler 接口的类,用于处理实体类中的填充字段。MetaObjectHandler 接口包括两个默认方法:insertFillupdateFill,分别处理插入时的填充和更新时的填充。这两个方法都接收一个 MetaObject 参数,用于获取实体类中的填充字段。

package com.lz.platform.trauma.common.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.lz.platform.constant.Constant;

import com.lz.platform.trauma.common.domain.DataEntity;
import com.lz.platform.trauma.common.vo.LoginUserVO;
import com.lz.platform.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * 填充器
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private RedisUtils redisUtils;

    @Override
    public void insertFill(MetaObject metaObject) {
        try {
            if (metaObject.hasSetter("createDate")) {
                this.setFieldValByName("createDate", new Date(), metaObject);
            }
            if (metaObject.hasSetter("delFlag")) {
                this.setFieldValByName("delFlag", DataEntity.DEL_FLAG_NORMAL, metaObject);
            }
            String token = request.getHeader("token");
            LoginUserVO loginUserVO = (LoginUserVO) redisUtils.get(Constant.LOGININFO_KEY + "_" + token);
            if (loginUserVO != null) {
                if (metaObject.hasSetter("createBy")) {
                    this.setFieldValByName("createBy", loginUserVO.getUserId(), metaObject);
                }
            }
        }catch (Exception e){
            //log.error("获取用户信息失败,失败原因为:" + e.getMessage());
        }

    }

    @Override
    public void updateFill(MetaObject metaObject) {
        try {
            if (metaObject.hasSetter("updateDate")) {
                this.setFieldValByName("updateDate", new Date(), metaObject);
            }

            String token = request.getHeader("token");
            LoginUserVO loginUserVO = (LoginUserVO) redisUtils.get(Constant.LOGININFO_KEY + "_" + token);
            if (loginUserVO != null) {
                if (metaObject.hasSetter("updateBy")) {
                    this.setFieldValByName("updateBy", loginUserVO.getUserId(), metaObject);
                }
            }
        }catch (Exception e){
            //log.error("获取用户信息失败,失败原因为:" + e.getMessage());
        }
    }
}

 4.在启动类中使用 @MapperScan 注解,扫描包含 Mapper 接口和 MetaObjectHandler 接口实现类的包。

 在2.3小节的配置项中有说明

学习文章引用

不看山不见山,我自成青山

猜你喜欢

转载自blog.csdn.net/qq_45656077/article/details/129923785