一文搞懂MyBatis中的基础概念

大家好,我是Dog Lee 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实最严谨的方式分享给大家,共同进步👉💓👈
MyBatis源码与实战》专栏,会陆续更新关于MyBatis的源码讲解,实战使用等内容
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈



前言

MyBatis是一款JAVA持久层框架,内部将操作数据库需要的JDBC相关代码进行了封装,同时能将SQL语句执行结果与Pojo直接进行映射。本篇文章将先对JDBC进行学习,并在此基础上学习MyBatis中的基础概念。


正文

一. JDBC基础

JDBC全称为JavaDataBase Connectivity,即JAVA数据库连接,基于JDBC可以获取数据库连接并执行SQL语句,还能处理SQL语句的执行结果集。下面将对JDBC的操作步骤进行介绍。

1. 加载数据库驱动

首先需要加载数据库驱动,这里以MySQL数据库驱动为例,如下所示。

Class.forName("com.mysql.jdbc.Driver");
2. 获取数据库连接

然后需要获取数据库连接,如下所示。

// url用于标识数据库位置,即告诉JDBC连接哪个数据库
String url = "jdbc:mysql://192.168.101.7:3306/test";
// 数据库用户名和密码
String username = "root";
String password = "root";
// Connection是数据库编程中的一个重要对象,客户端与数据库的所有交互均依赖该对象
Connection connection = DriverManager.getConnection(url, username, password);

Connection对象部分重要方法如下所示。

方法描述
Statement createStatement()创建向数据库发送SQLStatement对象
PreparedStatement prepareStatement(String sql)创建向数据库发送预编译SQLPreparedStatement对象
commit()提交事务
rollback()回滚事务
3. 获取Statement对象

Statement对象用于向数据库发送SQL语句,获取方式如下所示。

Statement statement = connection.createStatement();

Statement对象的常用方法如下所示。

方法描述
ResultSet executeQuery(String sql)向数据库发送查询SQL语句
int executeUpdate(String sql)向数据库发送插入,更新或删除SQL语句
boolean execute(String sql)向数据库发送任意SQL语句

使用Statement的查询示例如下所示。

Statement statement = connection.createStatement();
String sql = "SELECT * FROM people";
ResultSet resultSet = statement.executeQuery(sql);

由于Statement的使用会引入安全效率问题,所以通常JDBC执行SQL语句是基于PreparedStatement对象。PreparedStatement继承于Statement,使用PreparedStatement的查询示例如下所示。

String sql = "SELECT * FROM people WHERE id = ?"
// 获取PreparedStatement对象时就需要传入SQL语句进行预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 设置参数,将第一个占位符替换为参数1
preparedStatement.setInt(1, 1);
// 执行查询,查询结果由ResultSet对象封装
ResultSet resultSet = preparedStatement.executeQuery();

相较于Statement对象,PreparedStatement对象执行效率更高(因为对SQL语句完成了预编译),并且可以防止SQL注入(因为获取PreparedStatement对象时就需要传入SQL语句进行预编译,此时不会产生用户输入数据改变SQL语句结构的现象)。

4. 处理执行结果

ResultSet代表JDBCSQL语句的执行结果。ResultSet封装执行结果时,采用的是表格的方式,ResultSet对象维护了一个指向表格数据行的游标,初始状态时,游标在第0行(此时没有指向结果数据),调用next()方法后,游标会指向结果数据里的第一行数据,此时可以通过ResultSet对象来操作游标指向的这一行数据。ResultSet的常用方法如下所示。

方法描述
boolean next()游标移动到下一行
boolean previous()游标移动到上一行
boolean absolute(int row)游标移动到指定行
Object getObject(int columnIndex)获取游标指向的行的第columnIndex列的任意类型数据
Object getObject(String columnLabel)获取游标指向的行的columnLabel列的任意类型数据
5. 释放连接

操作完数据库后,需要释放连接,如下所示。

if (resultSet != null) {
    resultSet.close();
}
if (preparedStatement != null) {
    preparedStatement.close();
}
if (connection != null) {
    connection.close();
}

二. MyBatis基础概念

MyBatis半自动ORM框架。ORM全称是Object Relational Mapping,主要实现实体对象到关系型数据库表之间的映射O表示对象M表示映射R表示关系型数据库ORM解决的问题如下所示。

  1. 代码重复JDBC原生操作数据库代码量大,重复代码多;
  2. 结果集处理复杂且繁琐JDBC中基于ResultSet处理查询结果需要自行判断类型并做转换,容易出错且繁琐;
  3. 数据库连接管理JDBC中需要自行创建连接,使用完毕后还需要关系连接;
  4. SQL语句与代码耦合JDBC中会将SQL语句硬编码到业务代码中,SQL与业务代码耦合,可维护性差。

MyBatis作为半自动ORM框架,不是完全面向对象操作数据库,也需要开发人员直接编写SQL语句。MyBatis特性如下。

  1. 使用连接池对数据库连接进行管理;
  2. SQL语句与代码去耦合;
  3. 参数映射;
  4. 结果集映射;
  5. 支持动态SQL
  6. 提供缓存机制;
  7. 提供<sql>标签完成重复SQL的提取;
  8. 提供可扩展的插件机制。

MyBatis的特性包括但不仅限于上面提及的特性,可以在MyBatis官方文档 中详细查阅。

MyBatis中,有很多重要组件,这些组件的一个协作关系图如下所示。

在这里插入图片描述

上图中出现的MyBatis的组件的说明如下。

组件说明
mybatis-config.xmlMyBatis的全局配置文件。配置MyBatis的日志打印和运行环境等。
Mapper.xml映射文件。映射文件中配置了操作数据库的SQL语句。
SqlSessionFactory通过mybatis-config.xml文件构建SqlSessionFactory,称为会话工厂。用于创建SqlSession
SqlSession通过SqlSessionFactory创建SqlSession,称为会话。操作数据库需要通过SqlSession进行。
ExecutorSqlSession内部通过Executor执行数据库操作。
MappedStatementExecutor通过MappedStatement在执行SQL语句前将输入的参数映射到SQL语句中,在执行SQL语句后将输出结果映射到设置的输出结果类型中。

总结

传统的基于JDBC操作数据库时,会涉及如下操作。

  1. 加载数据库驱动
  2. 获取数据库连接(Connection
  3. 获取Statement/PreparedStatement对象
  4. 处理执行结果(ResultSet
  5. 释放连接

传统的JDBC编程是繁琐且低效的,而且处理查询结果到实体对象的映射时极其麻烦。

MyBatis作为一款半自动ORM框架,能够完美解决传统JDBC编程中的各种痛点问题,其特性如下。

  1. 使用连接池对数据库连接进行管理
  2. SQL语句与代码去耦合
  3. 参数映射
  4. 结果集映射
  5. 支持动态SQL
  6. 提供缓存机制
  7. 提供<sql>标签完成重复SQL的提取
  8. 提供可扩展的插件机制

大家好,我是Dog Lee 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实最严谨的方式分享给大家,共同进步👉💓👈
MyBatis源码与实战》专栏,会陆续更新关于MyBatis的源码讲解,实战使用等内容
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱花祭的约定

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值