本文我们深度探讨Mybatis-Plus技术在我们项目中的应用
目录
Mybatis-Plus(简称 MP)是一个Mybatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
特性
-
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
-
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
-
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
-
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
-
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
-
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
-
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
-
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
框架结构
支持数据库
-
mysql 、mariadb 、oracle 、db2 、h2 、hsql 、sqlite 、postgresql 、sqlserver 、presto 、Gauss 、Firebird
-
Phoenix 、clickhouse 、Sybase ASE 、 OceanBase 、达梦数据库 、虚谷数据库 、人大金仓数据库 、南大通用数据库
示例
以我们的代码为例,我们使用Mybatis-Plus只需要以下几个步骤。以我们的酒店部分为例。
1. 创建实体类
@Data @TableName("hotels") public class Hotel implements Serializable { @TableId private String hotelId; // 酒店ID private String hotelName; // 酒店名称 private String hotelHeadPicture; // 酒店头图 private String starLevelDes; // 星级描述 private BigDecimal commentScore; // 评论评分 private String commentScoreDes; // 评论评分描述 private String commentMainTag; // 评论主标签 private Integer commentCount; // 评论数量 private Integer historicalConsumer; // 历史消费者 private String promoteBooking; // 推广预订 private String hotelAddress; // 酒店地址 private String trafficInfo; // 交通信息 private String areaName; // 区域名称 }
上部分代码定义了一个名为Hotel
的Java类,用于表示酒店信息。代码和注解的部分解释如下:
-
@Data:
这是一个来自
lombok
库的注解,自动为类的字段生成标准的setter和getter方法,以及toString
、equals
和hashCode
方法。使用这个注解可以简化代码,避免手动编写这些方法。 -
@TableName("hotels"):
这是一个来自
MyBatis-Plus
库的注解,用于指定这个类对应的数据库表名。在这个例子中,Hotel
类对应于数据库中的hotels
表。 -
类字段:
每个字段代表数据库表中的一列,并具有相关的Java类型和描述,以以下几个字段举例:
private String hotelId;
:酒店ID,使用@TableId
注解标记为表的主键。private String hotelName;
:酒店名称。private BigDecimal commentScore;
:评论评分,使用BigDecimal
类型以精确表示分数。
这个类通过使用注解和字段定义,为数据库操作提供了一个结构化的Java表示,使得在应用程序中操作酒店数据变得简单和直接。尤其是在使用MyBatis-Plus框架时尤其见到。
2. 创建对应mapper
@Mapper public interface HotelMapper extends BaseMapper<Hotel> { }
上面的代码定义了一个名为 HotelMapper
的接口,用于处理与酒店相关的数据库操作。这是一个 Java 接口,它使用了 MyBatis-Plus 框架的功能,通过继承 BaseMapper
接口来实现。下面是对代码的详细解释:
-
@Mapper:
这是 MyBatis 的注解,用于标识这个接口是一个 MyBatis 的 Mapper 接口。这告诉 MyBatis 框架,此接口的实现应该自动创建并注册为 Spring 应用程序上下文中的一个 Bean,从而可以被自动依赖注入到其他的组件中。
-
接口定义:public interface HotelMapper extends BaseMapper<Hotel>定义了一个接口
HotelMapper它扩展了 MyBatis-Plus 的 BaseMapper 接口。
BaseMapper<Hotel>
:这是 MyBatis-Plus 提供的一个泛型接口,Hotel
类型参数表明这个 Mapper 将处理Hotel
类型的实体。BaseMapper
提供了一系列标准的数据库 CRUD(创建、读取、更新、删除)操作方法,如insert()
,delete()
,update()
, 和selectById()
等。
继承了BaseMapper之后,基本的CRUD操作我们就已经有了,如下图所示。
当我们注入mapper之后会发现他提供了一系列CRUD方法, 包括根据ID批量删除,插入,批量查找等等,这些方法不用我们再写sql语句实现。
3. 创建Service接口
public interface HotelService extends IService<Hotel> { }
上面的代码定义了一个名为 HotelService
的接口,用于处理与酒店实体相关的业务逻辑。它使用了 MyBatis-Plus 框架的功能,通过继承 IService
接口来实现。
-
接口定义:public interface HotelService extends IService<Hotel>定义了一个接口HotelService
,它扩展了 MyBatis-Plus 的 IService 接口。
IService<Hotel>
:这是 MyBatis-Plus 提供的一个泛型接口,Hotel
类型参数指明这个服务将处理Hotel
类型的实体。IService
接口提供了一系列标准的服务层操作方法,如save()
,removeById()
,update()
, 和getById()
等。 -
目的与功能:
通过继承
IService
,HotelService
接口自动继承了所有这些基础的服务操作方法,允许进行各种常见的业务操作,例如保存、删除、更新和查询酒店数据。服务层(Service Layer)通常被用于封装业务逻辑,处理业务规则,以及执行与数据访问层(如
HotelMapper
)的交互。这种设计模式有助于保持业务逻辑的独立性,从而使得代码更易于管理和维护。
4. 创建Service接口的实现类
@Service public class HotelServiceImpl extends ServiceImpl<HotelMapper, Hotel> implements HotelService{ }
这段代码定义了 HotelServiceImpl
类,这是 HotelService
接口的一个实现。这个类使用了 MyBatis-Plus 框架的 ServiceImpl
类作为基类,以便提供标准的业务逻辑方法。
-
这是一个 Spring 框架的注解,用于标记此类为一个服务组件。标记为
@Service
的类会被 Spring 自动检测并注册为一个 Bean,这样它就可以被自动注入到其他组件中。 -
类定义:public class HotelServiceImpl extends ServiceImpl<HotelMapper, Hotel> implements HotelService
HotelServiceImpl
:这是类的名称,它实现了HotelService
接口。extends ServiceImpl<HotelMapper, Hotel>表明 HotelServiceImpl 继承自 MyBatis-Plus 的 ServiceImpl类。ServiceImpl 是一个通用的服务实现类,提供了一系列基于 CRUD 的方法。
HotelMapper
:指定这些服务方法将使用HotelMapper
作为数据访问层的接口,以便进行数据库操作。Hotel
:指定实体类型为Hotel
,这意味着提供的服务将针对Hotel
实体。implements HotelService
:表明这个类实现了HotelService
接口,承诺提供接口中定义的所有业务逻辑方法。 -
功能:
由于继承自
ServiceImpl
,HotelServiceImpl
自动获得了许多标准的业务方法,如增加、删除、修改和查询等,这些方法直接利用HotelMapper
来访问数据库。实现
HotelService
接口确保HotelServiceImpl
必须提供接口中定义的所有方法,此外还可以在此类中添加特定的业务逻辑方法,以满足特定的业务需求。
5.创建对应控制器
@Controller public class HotelController { @Autowired private HotelService hotelService; }
上面的代码定义了一个名为 HotelController
的 Spring 控制器类,用于处理与酒店相关的HTTP请求。这个类使用了 Spring MVC 框架的一些基本特性。
-
@Controller:
这是一个 Spring 框架的注解,用于标记该类为一个控制器(Controller)。在 Spring MVC 中,控制器负责处理由 DispatcherServlet 接收的请求,并返回响应。控制器中通常包含一个或多个用于处理特定请求的方法。
-
类定义:
public class HotelController
:这是类的定义,命名为HotelController
。它用于组织处理与酒店相关的HTTP请求的逻辑。 -
依赖注入:
@Autowired
:这是 Spring 的自动注入标注。通过此注解,Spring 将自动查找并注入与声明的类型匹配的 Bean。在这种情况下,它将自动注入一个HotelService
类型的 Bean。private HotelService hotelService;
:这是一个私有字段,用于存储注入的HotelService
实例。HotelService
是之前定义的服务接口,负责提供与酒店相关的业务逻辑操作。在这个控制器中,通过hotelService
字段,控制器可以访问所有定义在HotelService
接口中的业务方法。
通过上面的操作,我们在controller中就可以调用service里面的方法,因为继承了IService类,所以我们只需要调用其中定义好的方法就可以完成CRUD需求,如果涉及到复杂操作,则可以编写函数调用mapper层进行操作处理。