mybatis研究

Spring mybatis交互时序图
这里写图片描述

ContextLoadListener启动
这里写图片描述

这里写图片描述

MapperScannerConfigure实现了* ,其postProcessBeanDefinitionRegistry方法被调用,这个方法里有扫描包含mapper接口的动作,并动态创建bean,这个bean的名称是mapper接口的名称,class属性是org.mybatis.spring.mapper.MapperFactoryBean,同时它是Autowired
这里写图片描述

这里写图片描述
Spring对有Autowired注释的bean进行自动注入,这个过程中,需要对bean进行实例化
这里写图片描述
看看MapperFactoryBean中是怎样实例化bean的。
这里写图片描述

这里写图片描述

这里写图片描述
可见MapperFactoryBean是返回一个MapperProxy的代理对象,这是一个mapper接口的变量就是引用了一个MapperProxy的对象


Spring启动后,mybatis框架是怎样将mapper接口的方法绑定到具体的配置文件中的sql语句呢?一个请求过来,改请求涉及到数据查询,过程如下:

UserMapper的userMapper变量引用MapperProxy对象
这里写图片描述
执行queryAll方法后,由于是动态代理,会执行MapperProxy类的invoke方法,这个方法里就可以执行方法,并返回结果。
这里写图片描述
详细的看mapperMethod和mapperMethod.execute()
这里写图片描述

这里写图片描述

com.dao.UserMapper.queryAll
这里写图片描述

这里写图片描述


JDBC连接和执行过程
1.加载驱动
2.通过驱动建立连接
3.通过连接创建stateMent
4.执行stateMent
5.解析result

Mybatis
这里写图片描述

DataSourceUtil中通过dataSource.getConnetion()获取连接
这里写图片描述

从dbcp数据源的数据库连接池中获取连接
这里写图片描述

需要注意的是,第一次sql语句执行时连接数据库需要初始化,并建立数据库连接池,以后sql语句执行时,从数据库连接池中获取连接。

这里写图片描述

这里写图片描述


关于DataSource,目前常用的有三种
1.使用org.springframework.jdbc.datasource.DriverManagerDataSource
2.使用org.apache.commons.dbcp.BasicDataSource
3.使用com.mchange.v2.c3p0.ComboPooledDataSource
第一中没有数据库连接池的功能,不推荐;第二种和第三中都有数据库连接池的功能,Spring推荐使用第二种;据说dbcp比c3p0性能稍好,但是稳定性不如后者,后者在数据库重启和网络故障的情况下可以自动重连。
dbcp:

c3p0:
(1800s=30m)

spring使用哪种dataSource通过applicationContext.xml进行简单的配置即可,这些数据源都是实现了javax.sql.DataSource接口的类,DateSource接口主要提供getConnection()方法。


mybatis动态代理

这里写图片描述

看看MapperProxy类中的invoke方法是怎么执行sql语句的:
这里写图片描述

userMapper=new Proxy(),userMapper.queryAll() Proxy类的query方法,这个方法会执行MapperProxy类的invoke函数,proxy参数是生成的 Proxyproxymethod Proxy中的m1,MapperMethod里有一个org.apache.ibatis.session.Configuration类型config对象,这个对象里有一个map类型的mappedStatements变量,存储key,value为< MappedStatement obj.id, MappedStatement obj> ,obj.id为namespace的值拼接上sql的id值,这个id对应的value对象为MappedStatement,MappedStatement里面包含了sql语句。

Proxy中生成动态代理类的方法如下:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值