天天看点

mybatis执行dao层操作数据库的流程(使用Druid连接池)

( 1)获取到dao层的动态代理对象or[email protected],并执行其invoke方法,该方法是入口

( 2)执行org.apache.ibatis.binding.MapperMethod.execute()方法,根据sql语句执行select/update/delete之一

( 3)执行org.mybatis.spring.SqlSessionTemplate.insert()方法

( 4)执行org.mybatis.spring.SqlSessionTemplate中内部类SqlSessionInterceptor的invoke方法, 该invoke方法首先获取session(即连接),执行sql返回结果,关闭session(即连接)

( 5)执行org.apache.ibatis.session.defaults.DefaultSqlSession.insert()方法

( 6)执行org.apache.ibatis.executor.BaseExecutor.getConnection()方法获取connection

( 7)执行com.alibaba.druid.pool.DruidDataSource.getConnection()方法从Druid连接池获取一个connection

( 8)执行com.alibaba.druid.pool.DruidDataSource.takeLast()方法从connection[]数组中取得最后一个连接,并将该数组的最后一个元素置为null

( 9)org.mybatis.spring.SqlSessionTemplate中内部类SqlSessionInterceptor的invoke方法执行完sql拿到返回结果

(10)执行org.mybatis.spring.SqlSessionUtils.closeSqlSession()方法关闭session

(11)执行com.alibaba.druid.pool.DruidPooledConnection.close()方法将connection放回connection[]数组中

(12)执行com.alibaba.druid.pool.DruidDataSource.recycle()方法调整数据库连接池相关参数

(13)dao方法执行结束