温馨提示×

温馨提示×

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

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

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

发布时间:2021-12-15 11:45:48 来源:亿速云 阅读:390 作者:小新 栏目:大数据
# 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. 分页失效可能原因

  • PageHelper.startPage()未紧邻查询语句
  • 线程池环境下线程复用导致ThreadLocal污染
  • 配置参数不正确

2. 通用Mapper常见问题

  • 实体类需要添加@Id注解标识主键
  • 字段名与数据库列名需保持一致(或通过@Column指定)
  • 继承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. 实现统一异常处理

向AI问一下细节

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

AI