dbapi是如何执行动态SQL的

dbapi可以解析类似MyBatis形式的SQL语句

整个执行过程分为两部分:

  • 1.解析SQL字符串
  • 2.执行SQL

本文将着重介绍它是如何执行SQL的

对标db-api版本:dfc0dac12d67e892e3ceb0b89dad773b2ab14642

解析

db-api使用orange解析字符串,将形如

1
2
3
4
5
6
7
select * from user
<where>
name in
<foreach collection='list' open='(' separator=',' close=')'>
#{item.name}
</foreach>
</where>

的SQL语句解析为SqlMeta对象,其中SqlMeta.sql属性为解析后的SQL字符串,SqlMeta.jdbcParamValues属性为解析后的参数列表

执行

通过分析找到真正执行的类com.gitee.freakchicken.dbapi.basic.servlet.APIServlet,这个类是一个HttpServlet

无论是get请求还是post请求,都会调用com.gitee.freakchicken.dbapi.basic.servlet.APIServlet#process方法

process方法分为以下几步:

  • 1.根据path获取API定义
  • 2.获取相关数据库配置
  • 3.从请求中获取参数
  • 4.缓存
  • 5.获取链接
  • 6.执行sql
  • 7.执行数据转换

以上各步,一旦出现异常就会发送提醒

这里最主要的就是第六步

executeSql执行sql

com.gitee.freakchicken.dbapi.basic.servlet.APIServlet#executeSql无非是根据配置设置连接是否自动提交事务,如果不是自动提交的事务,则按照执行结果提交或返回事务

这里最主要的是调用com.gitee.freakchicken.dbapi.basic.util.JdbcUtil#executeSql

而在JdbcUtil#executeSql里主要使用PreparedStatement执行sql