本文源自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 的代码生成器模块:
<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.xml
或 application.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);
}
}
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
接口包括两个默许办法: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末节的装备项中有阐明 修正
学习文章引证
不看山不见山,我自成青山