你应该懂点Mybatis 您所在的位置:网站首页 logininfo字段是必需的 你应该懂点Mybatis

你应该懂点Mybatis

2023-12-11 02:22| 来源: 网络整理| 查看: 265

​ ​本文源自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依赖:

com.baomidou mybatis-plus-boot-starter 3.5.0 或者 com.baomidou mybatis-plus-boot-starter {latest-version}

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

com.baomidou mybatis-plus-generator 3.2.0

引入mysl或者oracle:

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

mysql mysql-connector-java 8.0.27

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

com.oracle.database.jdbc ojdbc6 11.2.0.4

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

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

com.baomidou dynamic-datasource-spring-boot-starter 3.5.0

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.xml 或 application.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 *

该类型可以通过自己注册自动填充插件进行填充

*/ 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 { List 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 { /** * 根据 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 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 userList = userMapper.selectList(null); for (User u : userList) { System.out.println(u); } List 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 接口包括两个默认方法:insertFill 和 updateFill,分别处理插入时的填充和更新时的填充。这两个方法都接收一个 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小节的配置项中有说明

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有