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

MyBatis入门指南:从零掌握数据库操作

这段文档是 MyBatis 框架的官方入门指南,它系统地介绍了如何从零开始使用 MyBatis 进行数据库操作。下面我们用通俗易懂、结构清晰的方式来逐步解析这段内容,帮助你真正理解 MyBatis 的核心概念和使用方式。


🌟 一、MyBatis 是什么?

MyBatis 是一个轻量级的持久层框架(ORM 框架),用于简化 Java 程序与数据库之间的交互。

它不像 Hibernate 那样完全自动化,而是 “半自动化” —— 你可以写 SQL,同时由 MyBatis 帮你完成参数设置、结果映射等工作。


🧩 二、核心组件概览

组件作用
SqlSessionFactoryBuilder用来创建 SqlSessionFactory,用完即可丢弃
SqlSessionFactory创建 SqlSession 的工厂,整个应用只应有一个实例
SqlSession执行 SQL 的会话对象,每个线程一个,用完必须关闭
Mapper 接口你定义的接口,MyBatis 自动实现它,用来调用 SQL

我们接下来就按这个流程一步步讲解。


🚀 三、第一步:引入 MyBatis(安装)

方法 1:Maven 添加依赖

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>x.x.x</version>
</dependency>

✅ 只需引入一个 JAR 包,就可以使用 MyBatis。


🔧 四、第二步:构建 SqlSessionFactory(核心工厂)

每个 MyBatis 应用都围绕一个 SqlSessionFactory 实例运行。

方式 1:通过 XML 配置文件构建

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

📌 关键点:

  • mybatis-config.xml 是主配置文件,包含:
    • 数据库连接信息(DataSource)
    • 事务管理器(TransactionManager)
    • 映射文件位置(Mappers)
示例配置文件(mybatis-config.xml):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>

📌 说明:

  • <environments>:定义环境(开发/测试/生产),可切换。
  • <dataSource type="POOLED">:使用连接池。
  • <mappers>:注册你的 SQL 映射文件。

方式 2:纯 Java 代码构建(不用 XML)

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class); // 注册 Mapper 接口
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

✅ 适用于不想用 XML 的场景,比如 Spring Boot 中常用 Java 配置。


💬 五、第三步:获取 SqlSession 并执行 SQL

方法 1:直接通过 SQL ID 执行(老式写法)

try (SqlSession session = sqlSessionFactory.openSession()) {Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}

⚠️ 缺点:

  • 使用字符串 "org.mybatis.example.BlogMapper.selectBlog" 容易拼错
  • 不类型安全,返回值需要强转

方法 2:使用 Mapper 接口(推荐!类型安全)

try (SqlSession session = sqlSessionFactory.openSession()) {BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);
}

✅ 优点:

  • 类型安全
  • IDE 支持自动补全
  • 不怕拼错
  • 更像调用方法,而不是写 SQL 字符串

📄 六、第四步:定义 SQL 映射(两种方式)

SQL 可以通过 XML 文件Java 注解 定义。

方式 1:XML 映射文件(BlogMapper.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" resultType="Blog">SELECT * FROM Blog WHERE id = #{id}</select>
</mapper>

📌 说明:

  • namespace:必须对应 Mapper 接口的全类名
  • id="selectBlog":对应接口中的方法名
  • #{id}:参数占位符(防 SQL 注入)
  • resultType="Blog":结果自动映射到 Blog

方式 2:Java 注解(更简洁)

package org.mybatis.example;public interface BlogMapper {@Select("SELECT * FROM Blog WHERE id = #{id}")Blog selectBlog(int id);
}

✅ 适合简单 SQL
❌ 不适合复杂 SQL(如多表关联、动态 SQL)

💡 实际项目中:简单 SQL 用注解,复杂 SQL 用 XML


🔄 七、命名空间(Namespace)的重要性

  • 以前版本中 namespace 是可选的,现在必须写
  • namespace 的作用:
    1. 避免 SQL ID 冲突(类似包名)
    2. 让 MyBatis 能把 XML 或注解绑定到对应的 Mapper 接口

例如:

namespace="org.mybatis.example.BlogMapper"

就会自动绑定到:

public interface BlogMapper { ... }

🔍 八、名称解析规则(避免重复写全路径)

MyBatis 支持两种方式调用 SQL:

写法示例说明
全限定名"org.mybatis.example.BlogMapper.selectBlog"绝对路径,不会冲突
短名称"selectBlog"必须保证项目中只有一个叫这个名字的 SQL

⚠️ 如果有两个 selectBlog,就不能用短名,必须用全限定名。


⚙️ 九、对象作用域与生命周期(非常重要!)

这是最容易出错的地方,必须严格遵守。

1. SqlSessionFactoryBuilder

  • 作用:用来创建 SqlSessionFactory
  • 生命周期:用完就扔
  • 范围:方法内(局部变量)
void buildFactory() {SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); // 方法内使用SqlSessionFactory factory = builder.build(inputStream);
}

2. SqlSessionFactory

  • 作用:生产 SqlSession
  • 生命周期:整个应用运行期间
  • 范围全局唯一,通常用单例模式
public class MyBatisUtil {private static SqlSessionFactory sqlSessionFactory;static {// 初始化一次sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}public static SqlSessionFactory getSqlSessionFactory() {return sqlSessionFactory;}
}

✅ 整个应用只创建一次,不要频繁重建。


3. SqlSession

  • 作用:执行 SQL
  • 生命周期:一次请求或一个方法
  • 范围每个线程一个,不能共享,不是线程安全的!
try (SqlSession session = sqlSessionFactory.openSession()) {BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);
} // 自动关闭(推荐用 try-with-resources)

✅ 必须在 finallytry-with-resources 中关闭,否则会导致连接泄漏!


4. Mapper 实例

  • 作用:调用 SQL 方法
  • 生命周期:在方法中创建,用完即弃
  • 范围:方法作用域
try (SqlSession session = sqlSessionFactory.openSession()) {BlogMapper mapper = session.getMapper(BlogMapper.class); // 方法内创建Blog blog = mapper.selectBlog(101);
} // mapper 自动失效

✅ 不需要手动关闭 Mapper。


🧠 十、总结:MyBatis 工作流程图

[ mybatis-config.xml 或 Java 配置 ]↓SqlSessionFactoryBuilder↓SqlSessionFactory(全局唯一)↓SqlSession(每次请求新建)↓Mapper 接口(getMapper)↓执行 SQL(XML 或注解定义)

✅ 十一、最佳实践建议

建议说明
✅ 使用 Mapper 接口 + XML/注解类型安全,易于维护
SqlSessionFactory 全局单例避免重复创建
SqlSessiontry-with-resources自动关闭,防止资源泄漏
✅ 复杂 SQL 用 XML,简单 SQL 用注解各取所长
✅ 使用 namespace 绑定接口避免命名冲突
✅ 不要共享 SqlSession非线程安全!

💡 十二、常见问题解答

Q1:为什么不能把 SqlSession 放在类成员变量里?

因为 SqlSession 不是线程安全的。多个线程同时使用会导致数据库连接混乱、事务错乱。

Q2:XML 和注解能混用吗?

✅ 可以!MyBatis 会自动查找同名的 XML 文件。例如:

  • 接口:BlogMapper.class
  • XML:BlogMapper.xml(在同一包下)
    两者会自动合并。

Q3:MyBatis 和 Spring 怎么整合?

使用 MyBatis-Spring 框架,Spring 会自动管理 SqlSessionFactoryMapper,你只需要注入即可。


🎯 最后一句话总结

MyBatis 的核心思想是:让你专注于 SQL,而把参数设置、结果映射、连接管理等琐事交给框架处理。

只要记住:

  • 一个 SqlSessionFactory
  • 每次请求一个 SqlSession
  • Mapper 接口调用 SQL
  • 用完 SqlSession 就关闭

你就已经掌握了 MyBatis 的精髓!


如果你有具体的代码或场景想优化,我可以帮你设计 MyBatis 的使用方案。

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

相关文章:

  • OpenTiny TinyVue组件有哪些常用组件?
  • 马鞍山市住房和城乡建设部网站软件公司宣传册设计样本
  • kafka3.9集群部署-kraft模式
  • 动态图表导出与视频生成:精通Matplotlib Animation与FFmpeg
  • 【ES实战】ES6.8到9.1.4的常用客户端变化
  • CFS三层靶机-内网渗透
  • 【智慧城市】2025年中国地质大学(武汉)暑期实训优秀作品(6):武汉视界
  • Redis的缓存更新策略
  • MarsEdit 5 for Mac 博客博文编辑管理工具
  • 蒙古语网站建设江西省飞宏建设工程有限公司 网站
  • 智能监控项目:Python 多目标检测系统 目标检测 目标跟踪(YOLOv8+ByteTrack 监控/交通 源码+文档)✅
  • 分布式光纤传感:照亮每一个角落的“温度感知神经”
  • 实测Triton-Copilot:AI如何助力高性能算子开发
  • 泰州网站专业制作能免费做片头的网站
  • 京东获取整站实时商品详情数据|商品标题|数据分析提取教程
  • 【Linux探索学习】第一篇Linux的基本指令(2)——开启Linux学习第二篇
  • Redisson 看门狗机制深度解析:分布式锁的守护者
  • 非预置应用使用platform签名并且添加了android.uid.system无法adb安装解决方法
  • 分布式光纤声波振动传感:守护智慧城市燃气管网安全的 “神经末梢”
  • Hadoop 3.3.5 伪分布式安装配置的完整过程
  • 郑州市中原区建设局网站南京市建设工程档案馆网站
  • Oracle PL/SQL Developer v16的安装以及导出导入表数据
  • 消防管理系统如何重构现代空间防御体系
  • Coze源码分析-资源库-编辑数据库-后端源码-流程/技术/总结
  • Linux之lvm存储卷管理篇
  • 数字大健康浪潮下:智能设备重构人力生态,传统技艺如何新生?
  • 郑州陆港开发建设有限公司网站西安有哪些家做网站的公司
  • 整体设计 逻辑系统程序 之19 内核层最大资本箱为核心的完整设计讨论— 含分层架构、CNN 数据处理支撑、监督闭环与多场景交付物
  • GPT系列模型-详解
  • 【pytest 】 pytest 生命周期