大家好,我是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() | 创建向数据库发送SQL的Statement 对象 |
PreparedStatement prepareStatement(String sql) | 创建向数据库发送预编译SQL的PreparedStatement 对象 |
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
代表JDBC中SQL语句的执行结果。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解决的问题如下所示。
- 代码重复。JDBC原生操作数据库代码量大,重复代码多;
- 结果集处理复杂且繁琐。JDBC中基于
ResultSet
处理查询结果需要自行判断类型并做转换,容易出错且繁琐; - 数据库连接管理。JDBC中需要自行创建连接,使用完毕后还需要关系连接;
- SQL语句与代码耦合。JDBC中会将SQL语句硬编码到业务代码中,SQL与业务代码耦合,可维护性差。
而MyBatis作为半自动ORM框架,不是完全面向对象操作数据库,也需要开发人员直接编写SQL语句。MyBatis特性如下。
- 使用连接池对数据库连接进行管理;
- SQL语句与代码去耦合;
- 参数映射;
- 结果集映射;
- 支持动态SQL;
- 提供缓存机制;
- 提供
<sql>
标签完成重复SQL的提取; - 提供可扩展的插件机制。
MyBatis的特性包括但不仅限于上面提及的特性,可以在MyBatis的官方文档 中详细查阅。
在MyBatis中,有很多重要组件,这些组件的一个协作关系图如下所示。
上图中出现的MyBatis的组件的说明如下。
组件 | 说明 |
---|---|
mybatis-config.xml | MyBatis的全局配置文件。配置MyBatis的日志打印和运行环境等。 |
Mapper.xml | 映射文件。映射文件中配置了操作数据库的SQL语句。 |
SqlSessionFactory | 通过mybatis-config.xml文件构建SqlSessionFactory ,称为会话工厂。用于创建SqlSession 。 |
SqlSession | 通过SqlSessionFactory 创建SqlSession ,称为会话。操作数据库需要通过SqlSession 进行。 |
Executor | SqlSession 内部通过Executor 执行数据库操作。 |
MappedStatement | Executor 通过MappedStatement 在执行SQL语句前将输入的参数映射到SQL语句中,在执行SQL语句后将输出结果映射到设置的输出结果类型中。 |
总结
传统的基于JDBC操作数据库时,会涉及如下操作。
- 加载数据库驱动;
- 获取数据库连接(
Connection
); - 获取
Statement
/PreparedStatement
对象; - 处理执行结果(
ResultSet
); - 释放连接。
传统的JDBC编程是繁琐且低效的,而且处理查询结果到实体对象的映射时极其麻烦。
MyBatis作为一款半自动ORM框架,能够完美解决传统JDBC编程中的各种痛点问题,其特性如下。
- 使用连接池对数据库连接进行管理;
- SQL语句与代码去耦合;
- 参数映射;
- 结果集映射;
- 支持动态SQL;
- 提供缓存机制;
- 提供
<sql>
标签完成重复SQL的提取; - 提供可扩展的插件机制。
大家好,我是Dog Lee 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实,最严谨的方式分享给大家,共同进步👉💓👈
《MyBatis源码与实战》专栏,会陆续更新关于MyBatis的源码讲解,实战使用等内容
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈