一 JDBC的规范操作及问题回顾
假设数据库test中有一张表account
直接使用JDBC,dao层的实现类可能会是如下的写法:
public class AccountDaoImpl implements AccountDao {
//问题1:数据库配置信息,存在硬编码问题,修改信息就要重新编译
private String driver = "com.mysql.jdbc.driver";
private String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf-8";
private String username = "root";
private String password = "root";
public List<Account> findAll() throws Exception{
//注册mysql驱动
Class.forName(driver);
//问题2:频繁获取/释放数据库连接
Connection connection = DriverManager.getConnection(url, username, password);
//问题3:sql语句存在硬编码,改动sql语句需要改动,另外拼接不同条件的sql语句,填充参数都比较繁琐。
String sql = "select * from account";
//String sql = "select * from account where cardNo=?"
//获取操作数据库的预处理对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
//preparedStatement.setInt(1,2);
List<Account> accountList = new ArrayList<Account>();
//问题4:需要手动解析结果集,如果表中的列很多会很繁琐
while (resultSet.next()) {
Account account = new Account();
account.setCardNo(resultSet.getString("cardNo"));
account.setName(resultSet.getString("name"));
account.setMoney(resultSet.getInt("money"));
accountList.add(account);
}
resultSet.close();
preparedStatement.close();
connection.close();
return accountList;
}
}
从中可以分析出一些问题,并且我们也可以发现已有的对应解决方案:
-
数据库配置信息,存在硬编码问题。
解决:将配置信息写入配置文件中,而Mybatis就有配置解析的功能,可以在运行时解析配置文件。
-
每次调用dao层方法都要建立和关闭数据库连接,影响数据库和应用的性能。
解决:利用数据库连接池。
-
与sql语句有关的问题:
(1) sql语句硬编码。
解决:Mybatis提供了sql解析的功能,允许调用方使用映射配置文件或者注解来编写sql语句。
(2) 使用?占位符进行参数的填充方式较为繁琐。
解决:Mybatis提供了参数映射的功能,允许调用方使用#{}或${}占位符,直接在{}中写要传入的参数。
(3) 在实际业务中,对同一数据集的查询条件可能是动态变化的,根据不同那个条件拼接SQL语句是一件非常麻烦的事情。
解决:Mybatis提供了动态sql功能,使拼接sql变得更加轻松。
-
需要手动解析结果集,如果表中的列很多会很繁琐。
解决:基于ORM,Mybatis提供了结果集映射的功能,调用方不需要手动解析结果集。
ORM(Object Relational Mapping,对象-关系映射),包含对象->关系数据和关系数据->对象两方面映射。Mybatis实际上只完成了关系数据->对象,也就是结果集映射的功能,并没有完成对象->关系数据映射,不能像Hibernate一样通过操纵java对象实现操纵数据库表的目的,依然要编写sql语句,因此Mybatis也被认为是半自动的ORM框架。
Mybatis本质上也就是对jdbc进行了封装,但是它作为一个框架而非工具类,必定有它的强大之处。jdbc的这些解决方案中提到的Mybatis功能,会在之后章节的源码分析中分别提及,接下来先对Mybatis的整体架构做一个概览。
二 Mybatis整体架构概览
Mybatis的设计也遵循了模块化和分层的思想,整体架构分为三层,如下图所示:

接口层:核心是SqlSession接口,是上层应用和Mybatis交互的桥梁。SqlSession的创建过程还涉及SqlSessionFactoryBuilder和SqlSessionFactory,前者利用建造者模式创建后者,而后者是“单个数据库映射关系经过编译后的内存镜像”。SqlSession接收调用请求后,会调用核心处理层的相应模块进行具体的数据库操作。
核心处理层:这一层基本上包含了上一节中提到了mybatis的功能,体现了完成一次数据库操作所涉及的全部流程。
基础支持层:这一层包含了Mybatis的基础模块,为核心处理层的功能提供了良好的支持。
参考资料
徐郡明.mybatis技术内幕[m].北京:电子工业出版社,2017.
网友评论