依赖的导入

# 在项目的pom.xml文件中添加 mybatis-plus 的依赖
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.2</version>
        </dependency>

mybatis-plus的application.yml配置文件中的相关配置

# 设置数据源连接
spring:
  dataSource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://<host-ip>:<host-port>/<database-name>?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8

# mybatis-plus 的相关设置
mybatis-plus:
  configuration:
     # 设置使用mybatis-plus进行数据库操作的时候会在控制台打印出执行的sql语句
     log-impl: org.apache.ibatis.logging.stdout.StdOutImp
  global-config:
    db-config:
    # 分别指定mybatis-plus的逻辑删除字段为is_deleted,设置逻辑删除字段已删除的标记为1,为删除的标记为0。
      logic-deleted-field: deleted
      logic-deleted-value: 1
      logic-not-deleted-value: 0

项目的主配置类编写 `com/atguigu/mp/MyApplication.java`

package com.atguigu.mp;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
// 通过这个MapperScan来指定mapper接口文件的扫描位置
@MapperScan("com.atguigu.mp.mapper")
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

关于mybatis-plus的分页插件配置。编写mybatis-plus的配置类 `com/atguigu/mp/config/MPConfiguration.java`

(切记:使用mybatis的分页功能的时候一定要配置分页插件的组件)

package com.atguigu.mp.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 创建mp的分页插件,并且将分页插件加入到mybatis-plus的拦截器组件中。分页插件的原理就是通过拦截器拦截到sql语句,然后对sql语句拼接上分页条件
@Configuration
public class MPConfiguration {
    // @Bean注解,把该拦截器放入到IOC容器内。
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // 首先创建mp的拦截器,分页插件是基于拦截器的
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 在拦截器中配置mysql的分页插件,然后返回mp的拦截器。
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return mybatisPlusInterceptor;
    }
}

数据表的准备

mysql> show create table user;
CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  `age` int DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱',
  `deleted` int DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_cil;

项目中对应的 pojo类、通用mapper接口、service-mapper接口、service-mapper接口实现类 的准备

a.pojo类(com/atguigu/mp/pojo/User.java)

package com.atguigu.mp.pojo;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

@Data
// 使用该注解指定该pojo类对应的是指定数据库的 user 表。不过这个一般不需要指定,只要类名、属性名满足与表名、字段名 的驼峰命名转换要求即可。
@TableName(value = "user")
public class User {
     // 这个 @TableFiled 是用来把实体类的属性名和表中的字段名进行关联
    // 这个 @TableId 是用来指出该实体类中的哪一个属性是表中的主键字段

    // 使用该注解来指定 id对应 user表中的id字段,并且是主键,并且主键的类型是自增
    @TableId(value="id",type= IdType.AUTO)
    private long id;
    // 下边的@TableField 就是用来指定pojo类中的属性与表中普通字段的对应关系
    @TableField(value="age")
    private Integer age;
    @TableField(value="name")
    private String name;
    @TableField(value="email")
    private String email;
    // 这个@TableLogic 是用来指定该属性是与表中的deleted逻辑字段进行映射。
    @TableLogic(value="deleted")
    private Integer deleted;
}

/**  上边的关于pojo类中信息与表中信息都对应关系如果符合映射规则的话就不需要我们认为指定了。
*/

通用mapper接口(com/atguigu/mp/mapper/UserMapper.java)

package com.atguigu.mp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.atguigu.mp.pojo.User;

// 创建mapper接口并继承mp的Basemapper,可以使用BaseMapper中提供的通用的单表的crud方法。因为这里BaseMapper的泛型是User,所以该接口中的方法也是对 User类对应的user表进行操作。
public interface UserMapper extends BaseMapper<User> {
  // 通过继承BaseMapper<User> 就可以使用简单的对user表的单表操作。如果需要自定义操作方法的话可以在该方法体声明。
}

service-mapper接口(com/atguigu/mp/service/UserService.java)

package com.atguigu.mp.service;

import com.atguigu.mp.pojo.User;
import com.baomidou.mybatisplus.extension.service.IService;

// 该接口通过继承IService<User>,可以使用IService中提供的简单的对于User表的一些sql语句方法
public interface UserService extends IService<User> {

}

service-mapper接口的实现类(com.atguigu.mp.service.impl)

package com.atguigu.mp.service.impl;

import com.atguigu.mp.mapper.UserMapper;
import com.atguigu.mp.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.mp.pojo.User;
import org.springframework.stereotype.Service;

// 这个地方因为要使用的通用service的mapper的话就需要实现 UserService 接口,但是该接口又实现了IService,这样该实现类就需要实现很多方法,我们直接使用提供的
// ServiceImpl方法,直接继承该类,ServiceImpl类实现了Iservice中对应的方法,所以这个我们就不需要再实现IService中的方法而是直接从ServiceImpl中进行继承。

//
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

自定义mapper接口中的方法:

如果要自定义mapper接口中的方法的话,那么就需要在对应的mapper-xml文件中编写。例如

<!-- mapper接口与mapper-xml文件的路径是相同的,只不过前者在源码包,后者在resources包。
例如: src/main/java/com/atguigu/mp/mapper/UserMapper.java      对应
       src/main/resources/com/atguigu/mp/mapper/UserMapper.xml
-->

mybatis-plus中通用mapper接口和service-mapper接口的区别:

  在 MyBatis-Plus 中,提供了 通用 Mapper 和 Service 层封装 两种方式,它们的设计目的是为了满足不同场景下的开发需求,同时提高代码的复用性和开发效率。

1. 通用 Mapper 的作用
通用 Mapper 是 MyBatis-Plus 对 MyBatis 的增强功能,它通过继承 BaseMapper<T> 接口,为开发者提供了大量常用的 CRUD 方法,例如:
insert
deleteById
updateById
selectById
selectList 等等

优点:
简化了单表操作的代码,无需手动编写 SQL。
提供了强大的条件构造器(如 QueryWrapper、UpdateWrapper),可以灵活地构建查询条件。
适合简单的单表操作场景。

缺点:
通用 Mapper 主要针对单表操作,对于复杂的业务逻辑(如多表关联、事务管理)支持较弱。
如果直接在 Controller 或业务层调用 Mapper,可能会导致代码耦合性较高,不符合分层架构的设计原则。

2. Service 层封装的作用
MyBatis-Plus 提供了 IService<T> 接口和 ServiceImpl<M, T> 实现类,用于封装通用的 Service 层逻辑。开发者可以通过继承 ServiceImpl 来快速实现 Service 层。

优点:
业务逻辑分离:Service 层是业务逻辑的核心,将业务逻辑与数据访问层(Mapper)分离,符合分层架构的设计原则。
事务管理:Service 层可以方便地管理事务(通过 @Transactional 注解),而 Mapper 层通常不具备事务管理能力。
扩展性强:Service 层可以封装复杂的业务逻辑,例如多表操作、批量处理、缓存处理等。
代码复用:IService 提供了更多通用的方法(如 saveOrUpdateBatch、listByIds 等),进一步简化了开发。

缺点:
对于简单的单表操作,使用 Service 层可能会显得冗余。

总结:
通用 Mapper:适合简单的单表操作,快速开发。
Service 层:适合复杂的业务逻辑,符合分层架构,支持事务管理。
MyBatis-Plus 同时提供通用 Mapper 和 Service 层封装,是为了满足不同场景下的开发需求。通用 Mapper 适合简单的单表操作,而 Service 层适合复杂的业务逻辑和事务管理。在实际开发中,可以根据项目的复杂度选择合适的方案,或者结合两者使用,以达到代码简洁和规范性的平衡。

文章作者: 不破不立
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 寻梦
喜欢就支持一下吧