背景 Seata对业务无侵入是通过数据源代理实现的,从下图中可看出,数据源代理的实现涉及到DataSource、Connection以及Statement,这几个关键知识属于JDBC的范畴,所以本篇从JDBC的视角对他们进行介绍。 一、JDBC概述 JDBC代表Java数据库连接。JDBC是一种JavaAPI,用于连接数据库并执行查询。它是JavaSE(Java标准版)的一部分。JDBCAPI使用JDBC驱动程序连接数据库。 在JDBC之前,ODBCAPI是连接数据库并执行查询的数据库API。但是,ODBCAPI使用用C语言编写的ODBC驱动程序(即依赖于平台且不安全)。这就是为什么Java定义了自己的API(JDBCAPI),它使用JDBC驱动程序(用Java语言编写)。当前的JDBC基于XOpenSQL调用级别接口。java。sql包包含JDBCAPI的类和接口。下面给出了JDBCAPI的流行接口列表:DriverinterfaceConnectioninterfaceStatementinterfacePreparedStatementinterfaceCallableStatementinterfaceResultSetinterfaceResultSetMetaDatainterfaceDatabaseMetaDatainterfaceRowSetinterface 我们可以使用JDBCAPI来使用Java程序处理数据库,使用JDBC操作数据源大致需要以下几个步骤:与数据源建立连接。执行SQL语句,检索SQL执行结果关闭连接。二、与数据源建立链接 Connection是JDBC对数据源连接的抽象,一旦建立了连接,使用JDBCAPI的应用程序就可以对目标数据源执行查询和更新操作。 获取Connection有两种途径2。1DriverManager 这是一个在JDBC1。0规范中就已经存在、完全由JDBCAPI实现的驱动管理类。MYSQL5之前需要Class。forName(com。mysql。cj。jdbc。Driver)的方式主动注册驱动。MYSQL5之后的驱动包可以省略注册驱动的步骤,会自动加载jar包中METAINFservicesjava。sql。Driver文件中的JDBC驱动类。通过getConnection获取数据库连接,如下:ConnectionconnDriverManager。getConnection(url,username,password);复制代码2。2DataSource: DataSource接口是JDBC2。0API中的新增内容,它提供了连接到数据源的另一种方法。使用DataSource对象是连接到数据源的首选方法。需要注意JDBCAPI中只提供了DataSource接口,DataSource具体的实现由JDBC驱动程序提供。JDBCAPI中定义了两个DataSource接口比较重要的扩展,用于支撑企业级应用。这两个接口分别为:ConnectionPoolDataSource支持缓存和复用Connection对象,主流的数据库连接池也提供了DataSource接口的具体实现,如Druid提供了DruidDataSource,生产中我们会使用数据库连接池所提供的池化的Connection。连接池通过对连接的复用,而不是每次需要操作数据源时都新建一个物理连接来显著地提高程序的效率,这样能够在很大程度上提升应用性能和伸缩性XADataSource该实例返回的Connection对象能够支持分布式事务;如Druid中会提供DruidXADataSource。XAConnection接口继承了PooledConnection接口,因此它具有所有PooledConnection的特性三、执行sql、检索结果3。1创建Statement 获取到JDBC中的Connection对象之后,我们可以通过Connection对象设置事务属性,并且可以通过Connection接口中提供的方法创建Statement、PreparedStatement或者CallableStatement对象。如:java。sql。ConnectioncreateStatement()复制代码 PreparedStatement和CallableStatement是Statement的子接口,Statement接口中定义了执行SQL语句的方法,但这些方法不支持参数输入。PreparedStatement接口继承自Statement接口,增加了参数占位符功能,当执行SQL语句时,可使用?作为参数占位符,然后使用其提供的其他方法为占位符设置参数值。其实例对象包含已编译的SQL语句,由于已预编译过,所以其执行速度要快于Statement对象。因此,多次执行的SQL语句经常创建为PreparedStatement对象,以提高效率。(这里挖个坑,因为其参数设置机制,在实践中也可能会遇到其带来的问题)CallableStatement接口继承自PreparedStatement接口,在PreparedStatement的基础上增加了调用存储过程并检索调用结果的功能。3。2执行sql Statement接口可以理解为JDBCAPI中提供的SQL语句的执行器,我们调用Statement接口中定义的不同方法以实现不同的结果:调用executeQuery()方法执行查询操作调用executeUpdate()方法执行更新操作调用executeBatch()方法执行批量处理3。3获取结果 对结果的处理则:通过getResultSet()方法来获取查询结果集,ResultSet对象代表查询操作的结果集通过ResultSet对象的getMetaData()方法获取结果集元数据信息,该方法返回一个ResultSetMetaData对象,我们可以通过ResultSetMetaData对象获取结果集中所有的字段名称、字段数量、字段数据类型等信息通过getUpdateCount()方法来获取更新操作影响的行数3。4Connection、Statement、ResultSet之间的关系 四关闭Connection对象 当使用完Connection对象后,需要显式地关闭该对象。Connection中的close()方法用于关闭Connection对象,由该Connection对象创建的所有Statement对象也都会被关闭。连接池的实现的close()方法中会把Connection回收到连接池中。五、最后说一句 我是石页兄,如果这篇文章对您有帮助,或者有所启发的话,欢迎关注笔者的微信公众号【架构染色】进行交流和学习。您的支持是我坚持写作最大的动力