前言
mybatis是一款java编写的orm 开源框架,其底层是基于java的JDBC封装的,所以再了解mybatis之前,有必要了解一下JDBC的流程。
JDBC流程
一次完整JDBC查询操作要做哪些处理,如果读者写过基于原生JDBC进行数据库操作,应该很熟悉。
一次完整的JDBC查询流程如下:
- 首先,要获取到连接数据库的驱动
- 其次,获取到访问数据库的地址和账户密码,创建数据库连接
- 然后创建sql语句
- 接下来进行sql预编译处理
- 对sql中查询语句进行参数设置
- 最后执行sql后获取返回结果进行解析。
- 释放资源,关闭连接。
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 获取数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 建立连接根据数据库地址和账户密码
connection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?
characterEncoding=utf-8", "root", "root");
// 创建sql,查询参数使用支持的默认占位符
String sql = "select * from user where username = ?";
// 获取预处理statement
preparedStatement = connection.prepareStatement(sql);
// 对参数进行替换,将占位符替换成参数
preparedStatement.setString(1, "tom");
// 执行sql获取结果集
resultSet = preparedStatement.executeQuery();
// 解析结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
// 封装成返回类型User
user.setId(id);
user.setUsername(username);
}
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC的不便性
以上简单的演示了一次查询操作所需要的执行步骤,所以分析一下会存在哪些不便:
- 频繁的创建连接以及释放连接容造成资源浪费,影响系统性能。
- 存在硬编码问题,sql语句每次变化都需要更改代码,随着项目的扩大,修改和维护成本愈加夸张。
- 使用preparestatement的传参存在硬编码,你无法确定sql的where查询后面跟了多少个查询条件。
- 查询结果集解析存在硬编码问题,对结果集解析是基于sql 列名进行解析,sql改变要变动解析的代码。
针对以上的不便,也是有对应的解决方案:
- 使用连接池来代替开发者手动创建和释放连接
- sql语句硬编码问题,使用配置文件,从配置文件读取。
- 参数解析和结果解析的方式,使用反射和内省进行动态解析。
(p.s.:反射和内省的区别,反射能获取类的所有信息,内省也是基于反射上的封装,主要用于bean,获取getter ,setter方法来判断属性。比如说通过内省拿到一个bean 的getName()方法,就认为该bean存在一个name属性,但实际上可能不存在这个属性,所以内省是有错误的可能性。内省主要用于javabean上,所以针对javabean而言,内省可以只要获取到getter,setter方法,就可以认为该属性是确实存在bean中的)
自定义框架
JDBC的查询是一个模板模式,有固定的步骤,所以每次查询的代码都差不多,所以就需要进行封装和抽象,就衍生出了orm框架。
框架主要就是为了解决以上问题,让使用者不必写那么荣昌的代码去操作,也不必关系底层的查询实现和连接之类的信息。
所以使用端只需提供配置文件即可:
- 数据库连接的信息配置文件
- sql语句的配置文件
框架端所做的事如下
- 解析使用端提供的数据库连接配置文件,建立数据库连接。
- 解析sql的配置文件,获取用户传参执行sql查询并封装用户所需要的返回结果返回给客户。
后话
先简单介绍一下JDBC的流程有利于对后续mybatis的理解有帮助