当前位置: 首页 > news >正文

MyBatis-Plus 与 Spring 新手指南

MyBatis-Plus 与 Spring 新手指南

概述

本文档介绍 MyBatis-Plus 框架与 Spring 的集成方式,帮助新手快速理解数据访问层的设计模式和实现原理。

核心架构

1. 分层架构概念

Controller 层 (接口层)↓
Service 层 (业务逻辑层)↓
Repository 层 (数据访问层)↓
Mapper 层 (数据映射层)↓
Entity 层 (实体层) ← → Database (数据库)

2. Repository 模式

Repository 模式是领域驱动设计(DDD)中的重要概念,用于封装数据访问逻辑。

接口定义
public interface UserRepository {void save(User user);User findById(Long id);List<User> findByName(String name);void deleteById(Long id);
}
实现类
@Service
public class UserRepositoryImpl implements UserRepository {// 具体实现
}

MyBatis-Plus 核心组件

1. 实体类 (Entity)

@Data
@TableName("user_info")  // 指定数据库表名
public class User {@TableId(type = IdType.AUTO)  // 主键,自增private Long id;@TableField("user_name")      // 字段映射private String name;private String email;@TableLogic                   // 逻辑删除标记private Boolean deleted;@TableField(fill = FieldFill.INSERT)  // 插入时自动填充private LocalDateTime createTime;
}
常用注解说明
注解作用示例
@TableName指定数据库表名@TableName("user_info")
@TableId指定主键字段@TableId(type = IdType.AUTO)
@TableField字段映射和配置@TableField("user_name")
@TableLogic逻辑删除标记@TableLogic

2. Mapper 接口

@Mapper  // 标记为MyBatis的Mapper接口
public interface UserMapper extends BaseMapper<User> {// BaseMapper提供基础CRUD方法// 可以添加自定义查询方法@Select("SELECT * FROM user_info WHERE age > #{age}")List<User> findByAgeGreaterThan(@Param("age") Integer age);
}
BaseMapper 提供的方法
// 插入
int insert(T entity);// 删除
int deleteById(Serializable id);
int delete(Wrapper<T> wrapper);// 更新
int updateById(T entity);
int update(T entity, Wrapper<T> wrapper);// 查询
T selectById(Serializable id);
List<T> selectList(Wrapper<T> wrapper);
IPage<T> selectPage(IPage<T> page, Wrapper<T> wrapper);

3. Service 层

接口定义
public interface UserService {boolean saveUser(User user);User getUserById(Long id);List<User> getUsersByName(String name);boolean updateUser(User user);boolean deleteUser(Long id);
}
实现类 (继承 ServiceImpl)
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic boolean saveUser(User user) {return this.save(user);  // 继承自ServiceImpl的方法}@Overridepublic User getUserById(Long id) {return this.getById(id);}@Overridepublic List<User> getUsersByName(String name) {LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();wrapper.eq(User::getName, name);return this.list(wrapper);}
}

泛型机制详解

1. ServiceImpl 的泛型参数

public class ServiceImpl<M extends BaseMapper<T>, T> {// M: Mapper类型// T: 实体类型
}

2. 实际使用示例

// 明确指定泛型参数
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// UserMapper: 操作数据库的Mapper// User: 操作的实体类型
}

这样设计的优势:

  • 类型安全: 编译时检查类型匹配
  • 代码提示: IDE能提供准确的代码补全
  • 自动映射: 框架自动处理实体与数据库的映射

Spring 集成要点

1. 依赖注入

@Service
public class UserController {@Autowiredprivate UserService userService;  // Spring自动注入public User getUser(Long id) {return userService.getUserById(id);}
}

2. 配置类

@Configuration
@MapperScan("com.example.mapper")  // 扫描Mapper接口
public class MyBatisConfig {@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}

3. 配置文件 (application.yml)

mybatis-plus:configuration:map-underscore-to-camel-case: true  # 下划线转驼峰log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # SQL日志global-config:db-config:logic-delete-field: deleted  # 逻辑删除字段logic-delete-value: 1logic-not-delete-value: 0

查询构造器 (Wrapper)

1. LambdaQueryWrapper (推荐)

LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
wrapper.eq(User::getName, "张三")           // name = '张三'.gt(User::getAge, 18)                // age > 18.like(User::getEmail, "@gmail.com")  // email LIKE '%@gmail.com%'.orderByDesc(User::getCreateTime);   // ORDER BY create_time DESCList<User> users = userMapper.selectList(wrapper);

2. QueryWrapper

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "张三").gt("age", 18).like("email", "@gmail.com").orderByDesc("create_time");

3. 常用查询方法

方法说明示例
eq等于eq("name", "张三")
ne不等于ne("status", 0)
gt大于gt("age", 18)
ge大于等于ge("score", 60)
lt小于lt("price", 100)
le小于等于le("count", 10)
like模糊查询like("name", "张")
inIN查询in("id", Arrays.asList(1,2,3))
between范围查询between("age", 18, 30)

分页查询

// 创建分页对象
IPage<User> page = new Page<>(1, 10);  // 第1页,每页10条// 构建查询条件
LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
wrapper.gt(User::getAge, 18);// 执行分页查询
IPage<User> result = userMapper.selectPage(page, wrapper);System.out.println("总记录数: " + result.getTotal());
System.out.println("总页数: " + result.getPages());
System.out.println("当前页数据: " + result.getRecords());

最佳实践

1. 项目结构建议

src/main/java/
├── entity/          # 实体类
├── mapper/          # Mapper接口
├── service/         # Service接口
├── service/impl/    # Service实现类
├── controller/      # Controller层
└── config/          # 配置类

2. 命名规范

  • 实体类: UserUserInfo
  • Mapper接口: UserMapper
  • Service接口: UserService
  • Service实现: UserServiceImpl
  • 数据库表: useruser_info

3. 代码建议

// ✅ 推荐:使用Lambda表达式,类型安全
LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
wrapper.eq(User::getName, name);// ❌ 不推荐:字符串方式,容易出错
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", name);

常见问题

1. 实体类与数据库表名不匹配

@TableName("t_user")  // 指定实际的表名
public class User {// ...
}

2. 字段名不匹配

public class User {@TableField("user_name")  // 数据库字段名private String name;      // Java属性名
}

3. 主键策略选择

@TableId(type = IdType.AUTO)      // 数据库自增
@TableId(type = IdType.ASSIGN_ID) // 雪花算法
@TableId(type = IdType.INPUT)     // 手动输入

总结

MyBatis-Plus 通过以下机制实现了简洁高效的数据访问:

  1. 泛型机制: 确保类型安全和代码提示
  2. 继承体系: 提供丰富的基础功能
  3. 注解映射: 简化配置,提高开发效率
  4. Spring集成: 无缝融入Spring生态

掌握这些核心概念,就能快速理解和使用MyBatis-Plus进行数据访问层开发。

http://www.dtcms.com/a/298495.html

相关文章:

  • 利用 Google Guava 的令牌桶限流实现数据处理限流控制
  • linux修改用户名和主目录及权限-linux029
  • 商品的create
  • 求职招聘小程序源码招聘小程序开发定制
  • 矩阵的极分解
  • [Dify] -进阶13- 使用“知识库 + 工作流”打造智能推荐系统
  • 网络安全基础知识【1】
  • PHP插件开发中的一个错误:JSON直接输出导致网站首页异常
  • 零碳园区如何破局?安科瑞EMS3.0以智慧能源管理重构低碳未来
  • 焊接机器人节能先锋
  • Seaborn可视化
  • MYOJ_8516:CSP初赛题单8:计算机语言和信息编码
  • 工作学习笔记(深圳xxx公司软件工程师助理)
  • Map学习笔记
  • 扫描对方是否开启局域网远程桌面
  • Windows安装压缩包形式的PostgreSQL
  • Python 列表排序:快速上手指南
  • Palindrome Reorder
  • 腾讯研究院:AI Coding引发编程范式革命
  • 微信小程序动态切换窗口主题色
  • 多智能体强化学习入门:从基础到 IPPO 算法—强化学习(20)
  • 2507C++,C++协程的发送者
  • 浅谈生成式AI语言模型的现状与展望
  • haproxy七层代理(原理)
  • SawtoothSoftware 模板注入漏洞复现(CVE-2025-34300)
  • 8.异常处理:优雅地处理错误
  • ISIS高级特性GR
  • Springboot+activiti启动时报错XMLException: Error reading XML
  • 优思学院|QC七大手法之一的检查表应如何有效使用?
  • 【unitrix】 6.15 “非零非负一“的整数类型(NonZeroNonMinusOne)特质(non_zero_non_minus_one.rs)