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

​本文源自Recently祝祝,创自Recently祝祝。转载请标示出处。

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,真的好用

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

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

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

引进mysl或许oracle:

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

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

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

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关于大都据源的依靠

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

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

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

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

常规运用的话,装备枚举类包,实体类表(存储跟标明相关的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.3springboot发动类。

装备@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);
    }
}

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

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

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

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;
}

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

3.3.1 一些注解的解释

1.IdType

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

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;
    }
}

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

2. @TableFiled

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

@TableField 注解包括以下特点:

  • value:数据表中对应的列名,假如实体类中的字段名与数据表中的列名相同,则能够省略该特点。
  • exist:是否为数据库表字段,默以为 true。假如设置为 false,则表明该字段不是数据库表中的字段,不会进行增修正查操作。
  • select:是否进行查询操作,默以为 true。假如设置为 false,则表明查询操作不会查询该字段。
  • insert:是否进行刺进操作,默以为 true。假如设置为 false,则表明刺进操作不会刺进该字段。
  • update:是否进行更新操作,默以为 true。假如设置为 false,则表明更新操作不会更新该字段。

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

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);
}

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

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);
}

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

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);
    }
}

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

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);
    }
}

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

4. 主动填充

4.1FeildFill阐明:

实体类中有个注解叫:@TableFeild,其中有一个特点叫:fill,经过FieldFill设置特点,这个便是做主动填充用的。

FieldFill 是 Mybatis-Plus 供给的一个枚举类型,用于界说主动填充的字段类型。在运用 Mybatis-Plus 进行数据操作时,咱们一般会遇到一些需求主动填充的字段,比如创立时刻、更新时刻等。Mybatis-Plus 供给了 FieldFill 枚举类型来完结这些主动填充操作。

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

  • INSERT:表明在刺进数据时主动填充字段。
  • UPDATE:表明在更新数据时主动填充字段。
  • INSERT_UPDATE:表明在刺进或更新数据时都主动填充字段。

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

4.2 FeildFill完结

FeildFill是不能运用的,运用 FieldFill 需求经过完结 MyBatis-Plus 供给的接口来完结。

详细的过程如下:

1:界说枚举类型 FieldFill

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

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

2.实体类中的需求填充的字段上运用 @TableField 注解,加上 fill 特点,指定填充办法。能够指定一个或多个填充办法,多个填充办法之间用逗号分隔。

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

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

在这个示例中,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());
        }
    }
}

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

4.在发动类中运用 @MapperScan 注解,扫描包括 Mapper 接口和 MetaObjectHandler 接口完结类的包。

在2.3末节的装备项中有阐明

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

学习文章引证

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