目录
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实现
Mybatis-plus 是一个基于 Mybatis 的增强工具,提供了许多便捷的 CRUD 操作和其他实用功能,简化了数据库访问的开发工作。它是 Mybatis 的一个开源组件,遵循 Apache 2.0 协议。
Mybatis-plus 的主要功能包括:
Mybatis-plus 提供了丰富的文档和示例,使开发人员能够更快地上手和使用它的功能。它也得到了广泛的社区支持和贡献,成为了国内开发者广泛使用的数据库访问框架之一。
可以参考官方文档:官方参考文档http://baomidou.com/
在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
在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),映射文件位置(通用)
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
)文件中进行配置。根据具体需求选择需要配置的配置项即可。
配置@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);
}
}
# 数据库配置
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 连接池,是目前被广泛使用的连接池之一。它是一个轻量级的连接池,具有优异的性能表现和低资源消耗,能够极大地提高应用程序的数据库访问性能和并发处理能力。
使用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;
}
1.IdType
com.baomidou.mybatisplus.annotation.IdType
是 Mybatis-Plus 提供的一个枚举类型,用于定义主键的生成策略。
IdType
枚举类型包括以下几种类型:
原代码:
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
注解包括以下属性:
3. @TableLogic
@TableLogic
是 Mybatis-Plus 提供的注解之一,用于实现逻辑删除功能。逻辑删除是指在数据库中标记一个数据已经被删除,而不是直接将其从数据库中删除。通过逻辑删除,可以在一定程度上保留数据的完整性,同时也方便数据恢复和审计等操作。
使用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);
}
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 提供的一系列辅助方法快速实现复杂的数据操作功能。
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
中实现相应的业务逻辑。
在业务代码中可以直接使用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);
}
}
实体类中有个注解叫:@TableFeild ,其中有一个属性叫:fill,通过FieldFill
设置属性,这个就是做自动填充用的。
FieldFill
是 Mybatis-Plus 提供的一个枚举类型,用于定义自动填充的字段类型。在使用 Mybatis-Plus 进行数据操作时,我们通常会遇到一些需要自动填充的字段,比如创建时间、更新时间等。Mybatis-Plus 提供了FieldFill
枚举类型来实现这些自动填充操作。
FieldFill
枚举类型包括以下几种类型:
- INSERT:表示在插入数据时自动填充字段。
- UPDATE:表示在更新数据时自动填充字段。
- INSERT_UPDATE:表示在插入或更新数据时都自动填充字段。
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
接口实现类的包。
学习文章引用
不看山不见山,我自成青山