细品mybatis源码系列(零):JDBC的流程

细品mybatis源码系列(零):JDBC的流程

前言

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的理解有帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值