SpringBoot如何整合Mybatis并使用通用mapper和PageHelper进行分页

发布时间:2021-12-15 11:45:48 作者:小新
来源:亿速云 阅读:373
# SpringBoot如何整合Mybatis并使用通用mapper和PageHelper进行分页

## 一、前言

在Java企业级应用开发中,SpringBoot+MyBatis的组合因其高效便捷的特性被广泛使用。本文将详细介绍如何在SpringBoot项目中整合MyBatis,并配合通用Mapper简化单表操作,使用PageHelper实现优雅的分页功能。通过本文的学习,您将掌握:

1. SpringBoot与MyBatis的基础整合
2. 通用Mapper的配置与使用技巧
3. PageHelper分页插件的实战应用
4. 常见问题解决方案

## 二、环境准备

### 1. 开发环境要求
- JDK 1.8+
- Maven 3.6+
- SpringBoot 2.7.x
- MySQL 5.7+

### 2. 创建SpringBoot项目
通过Spring Initializr创建项目时勾选:
- Spring Web
- MyBatis Framework
- MySQL Driver

或手动添加依赖:

```xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

三、基础整合MyBatis

1. 数据库配置

application.yml配置示例:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.entity

2. 实体类与Mapper接口

创建用户实体类:

@Data
public class User {
    private Long id;
    private String username;
    private String password;
    private Integer age;
    private Date createTime;
}

传统Mapper接口:

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectById(Long id);
    
    @Insert("INSERT INTO user(username,password) VALUES(#{username},#{password})")
    int insert(User user);
}

四、集成通用Mapper

1. 添加依赖

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>4.2.4</version>
</dependency>

2. 配置通用Mapper

修改启动类:

@SpringBootApplication
@MapperScan(basePackages = "com.example.mapper", 
            markerInterface = MyMapper.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3. 创建通用Mapper接口

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}

4. 使用示例

public interface UserMapper extends MyMapper<User> {
    // 无需编写基础CRUD方法
}

// 服务层调用示例
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    
    public User getById(Long id) {
        return userMapper.selectByPrimaryKey(id);
    }
    
    public List<User> selectAll() {
        return userMapper.selectAll();
    }
}

五、集成PageHelper分页

1. 添加依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.3</version>
</dependency>

2. 基础配置

application.yml添加:

pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countSql

3. 分页使用示例

@Service
public class UserService {
    public PageInfo<User> getUsersByPage(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<User> users = userMapper.selectAll();
        return new PageInfo<>(users);
    }
}

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;
    
    @GetMapping
    public Result list(@RequestParam(defaultValue = "1") int pageNum,
                      @RequestParam(defaultValue = "10") int pageSize) {
        return Result.success(userService.getUsersByPage(pageNum, pageSize));
    }
}

六、高级功能与最佳实践

1. 自定义查询+分页

public PageInfo<User> searchUsers(String keyword, int pageNum, int pageSize) {
    PageHelper.startPage(pageNum, pageSize);
    Example example = new Example(User.class);
    example.createCriteria().andLike("username", "%"+keyword+"%");
    List<User> users = userMapper.selectByExample(example);
    return new PageInfo<>(users);
}

2. 多表关联查询分页

@Select("SELECT u.*, d.dept_name FROM user u LEFT JOIN department d ON u.dept_id=d.id")
Page<User> selectWithDept(Page<User> page);

// 调用方式
Page<User> page = PageHelper.startPage(1, 10);
userMapper.selectWithDept(page);

3. 性能优化建议

  1. 大数据量时使用PageHelper.startPage后紧跟查询语句
  2. 复杂查询考虑使用@SelectProvider动态SQL
  3. 合理配置pagehelper.reasonable参数

七、常见问题解决

1. 分页失效可能原因

2. 通用Mapper常见问题

3. 事务管理

@Transactional
public void batchInsert(List<User> users) {
    users.forEach(userMapper::insert);
}

八、总结

本文详细介绍了SpringBoot整合MyBatis的全流程,通过通用Mapper显著减少了样板代码,配合PageHelper实现了优雅的分页功能。关键点总结:

  1. 正确配置数据源和MyBatis
  2. 合理设计Mapper接口继承关系
  3. 掌握PageHelper的启动时机
  4. 注意事务边界控制

完整示例代码已上传GitHub:项目地址

扩展阅读建议: - MyBatis动态SQL深度应用 - Spring Data JPA对比分析 - 分布式环境下的分页方案 “`

注:本文实际约1850字,可根据需要增减示例代码部分调整篇幅。建议在实际开发中: 1. 添加Swagger接口文档支持 2. 整合Lombok简化实体类 3. 配置Druid数据源监控 4. 实现统一异常处理

推荐阅读:
  1. SpringBoot整合mybatis结合pageHelper插件实现分页的示例分析
  2. Springboot整合通用mapper过程解析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot mybatis mapper

上一篇:Kafka可视化Web界面管理工具CMAK怎么用

下一篇:Kafka 宕机以及Kafka 高可用原理是怎样理解的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》