mybatis运行原理图:
mybatis运行流程:
public SqlSession getSession() throws IOException { /** * 1、根据xml配置文件(全局配置文件),创建一个sqlSessionFactory对象 */ String resource = "src/main/resources/mybatis-config.xml"; Reader reader = Resources.getResourceAsReader(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);① //2、获取sqlSession实例,能直接执行已经映射的sql语句 SqlSession sqlSession = sqlSessionFactory.openSession();② return sqlSession; }
@Test public void test1() throws IOException { //获取sqlSession对象 SqlSession sqlSession = getSession(); try { //获取接口的实现类 //为接口创建一个代理对象,代理对象执行下面的操作 EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);③ Employee employee = mapper.getEmployeeById(1);④ System.out.println(employee); } finally { //关闭sqlSession对象 sqlSession.close(); } }
1、首先根据全局配置文件创建SqlSessionFactory对象
2、通过SqlSessionFactory获得SqlSession对象
3、获取接口的代理对象(MapperProxy)
4、执行增删改方法
接下来探究每一处都做了些什么
一、根据配置文件创建SqlSessionFactory
其中的Configuration包含了所有配置文件的详细信息
总结:把配置文件的信息解析保存在Configuration对象中,返回了包含Configuration的DefaultSqlSession对象。
二、openSesion获取SqlSession对象
返回SqlSession的实现类DefaultSqlSession,里面包含了Executor和Configuration,Executor在这一步会被创建。
三、getMapper获取到接口的代理对象
getMapper使用了MapperProxyFactory创建了一个MapperProxy的代理对象,包代理对象中包含了
DefaultSqlSession(Executor)
四、查询的实现(增删改查的实现)
流程总结:
大总结:
1、根据配置文件( 全局的和sql映射文件)初始化Configuration对象
2、创建一个DefaultSqlSession对象,它里面包含Configuration以及Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)
3、DefaultSqlSession.getMapper( )拿 到mapper接口对应的MapperProxy
4、MapperProxy里面有( DefaultSqlSession)
5、执行增删改查方法:
1)、调用DefaultSqlSession的增删改查(Executor)
2)、会创建一个StatementHandler对象( 同时也会创建出ParameterHandler和ResultSetHandler)
3)、调用StatementHandler预编译参数以及设置参数值,使用ParameterHandler来给sql设置参数
4)、调用StatementHandler的增删改查方法
5)、ResultSetHandler封装结果