百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

MyBatis 详细教程(mybatis.)

ztj100 2025-03-30 23:23 53 浏览 0 评论

MyBatis 详细教程

目录

  1. 简介
  2. 环境搭建
  3. 基本配置
  4. CRUD 操作
  5. 动态 SQL
  6. 缓存机制
  7. 分页插件
  8. 多表查询
  9. 高级映射
  10. 事务管理
  11. 性能优化
  12. 最佳实践

1. 简介

MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数及获取结果集。通过 XML 或注解的方式将接口和 SQL 映射成对象。

优点:

  • 简化数据库操作:通过 XML 或注解的方式,将 SQL 和 Java 对象进行映射。
  • 灵活性高:支持动态 SQL,可以根据条件生成不同的 SQL 语句。
  • 轻量级:不依赖于任何第三方框架,易于集成到各种项目中。
  • 支持多种数据库:兼容 MySQL、Oracle、SQL Server 等主流数据库。

2. 环境搭建

2.1 添加依赖

在 Maven 项目中添加 MyBatis 依赖:

org.mybatismybatis3.5.11
org.mybatis.spring.bootmybatis-spring-boot-starter2.2.0
mysqlmysql-connector-java8.0.26
org.springframework.bootspring-boot-starter-web 


2.2 配置数据库连接

在 application.properties 中配置数据库连接信息:

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



3. 基本配置

3.1 创建实体类

假设我们有一个 User 表,对应的实体类如下:

 public class User {  
   private Integer id; 
   private String name;  
   private String email;
// Getters and Setters
   } 


3.2 创建 Mapper 接口

创建一个 UserMapper 接口,用于定义与数据库交互的方法:

 public interface UserMapper { 
   List getAllUsers(); 
   User getUserById(Integer id); 
   void insertUser(User user); 
   void updateUser(User user); 
   void deleteUser(Integer id); 
                             }


3.3 编写 Mapper XML 文件

在 resources/mapper 目录下创建 UserMapper.xml 文件,定义 SQL 语句:


SELECT * FROM users
SELECT * FROM users WHERE id = #{id}
INSERT INTO users (name, email) VALUES (#{name}, #{email})
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
DELETE FROM users WHERE id = #{id}   


3.4 配置 MyBatis

在 application.properties 中配置 MyBatis:

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



4. CRUD 操作

4.1 查询所有用户

 @Autowired private UserMapper userMapper;
@GetMapping("/users") 
  public List getAllUsers() { 
  return userMapper.getAllUsers();
} 


4.2 根据 ID 查询用户

 @GetMapping("/users/{id}") 
   public User getUserById(@PathVariable Integer id) {
   return userMapper.getUserById(id);
 }


4.3 插入用户

 @PostMapping("/users")
   public void insertUser(@RequestBody User user) { userMapper.insertUser(user); 
                                                  }


4.4 更新用户

 @PutMapping("/users/{id}")
   public void updateUser(@PathVariable Integer id, @RequestBody User user) { 
   user.setId(id); 
                                                                              userMapper.updateUser(user);
                                                                            }


4.5 删除用户

 @DeleteMapping("/users/{id}") 
   public void deleteUser(@PathVariable Integer id) { userMapper.deleteUser(id); 
                                                    }



5. 动态 SQL

MyBatis 提供了强大的动态 SQL 功能,可以根据不同的条件生成不同的 SQL 语句。

5.1 使用 标签

 


5.2 使用 标签

类似于 Java 的 switch 语句:

 



6. 缓存机制

MyBatis 提供了两级缓存机制:一级缓存(SqlSession 级别)和二级缓存(Mapper 级别)。

6.1 一级缓存

一级缓存是默认开启的,作用范围是同一个 SqlSession 内。在同一个 SqlSession 中,如果执行了相同的查询语句,MyBatis 会从缓存中直接返回结果,而不会再次查询数据库。

6.2 二级缓存

二级缓存是跨 SqlSession 的,可以在多个 SqlSession 之间共享。需要手动开启:

在 MyBatis 中,二级缓存(也称为全局缓存或应用程序级别的缓存)是跨会话的缓存机制。它可以在多个 SqlSession 之间共享缓存数据,从而提高性能。要开启 MyBatis 的二级缓存,你需要按照以下步骤进行配置:

1. 在 MyBatis 配置文件中启用二级缓存

首先,在 MyBatis 的主配置文件(通常是 mybatis-config.xml)中,确保启用了二级缓存支持。你可以在 标签中添加以下配置:

  
    
      
      
   
 


2. 在 Mapper XML 文件中配置缓存

接下来,在每个需要使用二级缓存的 Mapper XML 文件中,添加 标签来启用缓存。你可以为每个 Mapper 单独配置缓存策略。

SELECT * FROM users WHERE id = #{id}


  • eviction:指定缓存回收策略,默认是 LRU(Least Recently Used),其他选项包括 FIFO、SOFT 和 WEAK。
  • flushInterval:指定每隔多久刷新一次缓存(毫秒)。如果不设置,则不会自动刷新。
  • size:指定缓存的最大条目数。
  • readOnly:如果为 true,则表示该缓存只读,MyBatis 不会尝试更新缓存中的对象。

3. 确保实体类实现序列化接口

为了使缓存能够正常工作,你的实体类(如 User 类)必须实现 Serializable 接口。因为缓存的数据会被序列化存储。

import java.io.Serializable;
public class User implements Serializable {  
private static final long serialVersionUID = 1L;
// 属性和方法 
} 


4. 管理缓存刷新

MyBatis 会在某些操作(如插入、更新或删除)后自动刷新缓存。如果你不想在某些情况下刷新缓存,可以在 SQL 语句上使用 flushCache 属性来控制。

例如:

 SELECT * FROM users WHERE id = #{id}
INSERT INTO users (name, email) VALUES (#{name}, #{email}) 


5. 使用自定义缓存实现(可选)

如果你想使用自定义的缓存实现(例如 Ehcache 或 Caffeine),可以在 标签中指定 type 属性,并提供相应的缓存实现类。

 



6.3 清除缓存

可以通过 clearCache() 方法清除当前 SqlSession 的一级缓存:

 sqlSession.clearCache();



7. 分页插件

MyBatis 自身没有提供分页功能,但可以通过插件来实现。常用的分页插件有 PageHelper。

7.1 添加依赖

  
   com.github.pagehelper
   pagehelper-spring-boot-starter 1.4.2 
 


7.2 使用分页

@Autowired private UserMapper userMapper;
@GetMapping("/users/page") 
public Page getUsersByPage(@RequestParam int pageNum, @RequestParam int pageSize) {    
PageHelper.startPage(pageNum, pageSize);  
return userMapper.getAllUsers(); 
}



8. 多表查询

8.1 关联查询

假设我们有两个表:users 和 orders,可以通过关联查询获取用户的订单信息。

SELECT u.*, o.order_id, o.amount     FROM users u     LEFT JOIN orders o ON u.id = o.user_id     WHERE u.id = #{id}



9. 高级映射

9.1 关联映射

MyBatis 支持一对多、多对一、多对多等复杂关系的映射。

一对多映射


   
   
     
     
   


多对多映射

 
    
    
      
      
    



10. 事务管理

MyBatis 可以与 Spring 集成,使用 Spring 的事务管理功能。

10.1 使用 @Transactional注解

@Service 
public class UserService {
@Autowired  
private UserMapper userMapper;
@Transactional 
public void addUserAndOrder(User user, Order order) {  userMapper.insertUser(user);  userMapper.insertOrder(order);  
} 
} 



11. 性能优化

11.1 批量插入

对于大量数据插入,可以使用批量插入来提高性能:

 
   INSERT INTO users (name, email) VALUES
    (#{user.name}, #{user.email})  
   


11.2 使用延迟加载

延迟加载可以减少不必要的查询,提升性能:

xml


12. 最佳实践

12.1 使用注解代替 XML

对于简单的 CRUD 操作,可以直接使用注解来替代 XML 文件:

 @Select("SELECT * FROM users WHERE id = #{id}") 
   User getUserById(Integer id);


12.2 统一异常处理

使用全局异常处理器来捕获并处理 MyBatis 抛出的异常:

@ControllerAdvice 
  public class GlobalExceptionHandler {
    @ExceptionHandler(MyBatisSystemException.class) 
    public ResponseEntity handleMyBatisException(MyBatisSystemException ex{     return ResponseEntity.status(HttpStatus.INTERNAL\_SERVER\_ERROR).body(ex.getMessage());     
                                                                          } 
  }




总结

通过本教程,你已经掌握了 MyBatis 的基本用法,并了解了一些高级特性,如动态 SQL、缓存、分页、多表查询等。希望这些内容能够帮助你在实际项目中更好地使用 MyBatis。

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: