开发Java程序都知道mybatis是ORM框架,对象-关系映射(Object-Relational Mapping,简称ORM),所谓的
ORM 框架就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述 Java 对象与数据库表之间的映射关系,自动将 Java
应用程序中的对象持久化到关系型数据库的表中。

        最早开发javaweb程序都是使用jdbc操作数据库,会有很多的弊病,之后ORM框架出现了解决了这些问题,本文主要介绍一下mybatis是怎么获取数据库连接的。如下是原生态jdbc的代码:
//注册驱动 Class.forName("com.mysql.jdbc.Driver");); //获取连接 Connection conn=
DriverManager.getConnection("jdbc:mysql://ip:3306/dbname", "username",
"password"); //获取预执行对象 PreparedStatement preparedStatement =
conn.prepareStatement("select * from t_user"); //执行结果, 获取结果集 ResultSet
resultSet = preparedStatement.executeQuery(); //遍历结果集 while(resultSet.next()){
System.out.println(resultSet.getString("username")); } //释放资源 conn.close();
preparedStatement.close(); resultSet.close();
一、获取数据库连接

如下是mybatis执行的一段代码

mybatis执行insert实际实现是在doUpdate()方法中,通过debug,我们可以看到prepareStatement方法,

接着debug,我们可以看到获取数据库连接的方法

再往里debug就可以看到,打开数据库连接的方法

至此,mybatis获取数据库连接调用就清晰了

二、数据库驱动Driver加载

        不管是mysql或者oracle等等数据库的连接,在我们Java程序中,都需要将相应的数据库驱动jar包加入到Java应用程序中

下面通过mybatis的两个DataSource数据源实现方式来看我们的数据库驱动是如何加载的呢?

先来看mybatis的UnpooledDataSource.java数据源

在以上static块中,通过使用DriverManager.getDrivers()
就能在Java程序中获取得到我们当前以及注册的数据库驱动Driver类,那么这些Driver类是何时注册的呢?

从registeredDrivers中遍历得到Driver的Vector集合,那么registeredDrivers是什么时候初始化进去的呢?在DriverManager.java静态代码块找到了loadInitialDrivers();

这就是我们要找的驱动加载方法了

 

从代码中我们看到通过ServiceLoader.load(Driver.class); ServiceLoader是实现了Iterable迭代器的,往下看:

 此处的hasNext()方法实际调用的是ServiceLoader中的内部类LazyIterator中的hasNext()方法。

接着往下我们找到了hasNextService()方法,因为传递过来的类是java.sql.Driver

所以此处fullName的全称是:META-INF/services/java.sql.Driver,此时我们去查看mysql的驱动jar包,看是否存在该文件

显然能够找到配置文件,看mysql的驱动代码

可见registeredDrivers集合在此处得到初始化,我们回过头来再看LazyIterator迭代器中的方法nextService(),可以看到从配置文件类中读取到驱动类Driver,通过反射调用产生Driver实例。
S p = service.cast(c.newInstance());

 总结:mybatis从配置文件类中读取到驱动类Driver,通过Class.forName方法将该类加载到JVM中,此时会调用执行Driver类中的static方法块,将Driver类驱动注册到DriverManager中。

至此驱动加载过程分析完毕。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信