小demo:
public static void main(String[] args) throws Exception {
SqlSessionFactory sessionFactory = null;
String resource = "mapper.config.xml";
sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
SqlSession sqlSession = sessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
System.out.println(userMapper.findUserById(1));
}
源码流程(简易分析)
1、获取SqlSessionFactory
-- sqlSessionFactoryBuilder.build
--- xmlConfigBuilder解析配置文件,把所有的信息封装在Configuration
--- build(Configuration)
----- return new DefaultSqlSessionFactory(config);
2、获取SqlSession ,通过SqlSession可以实现增删改查,实际上作用的是Executor
-- sessionFactory.openSession
---- openSessionFromDataSource
------- Executor executor = this.configuration.newExecutor
------- new DefaultSqlSessionFactory(executor)
3、MapperProxy,通过它动态代理我们的dao
-- sqlsession.getMapper
--- configuration.getMapper
----- mapperRegistry.getMapper
------- mapperProxyFactory.newInstance(sqlsession)
-------- mapperProxy.newInstance
--------- mapperProxy = new MapperProxy
--------- return newInstance(mapperProxy);
----------Proxy.newProxyInstance(mapperProxy)【返回动态代理对象】
4、Executor–sql的执行过程
-- mapperProxy.invoke
---- mapperMethod.execute(sqlSession,args)
-------- 先判断CRUD类型,然后根据类型去选择到底执行sqlSession中的哪个方法
------------ MappedStatement ms = configuration.getMappedStatement(statement);
------------ 调用executor的增删改查,入参为ms
---------------- StatementHandler handler = configuration.newStatementHandler(ms)
---------------- statement = this.prepareStatement(handler);
---------------- 调用handler的select或update,入参是statement
-------------------- PreparedStatement ps = (PreparedStatement) statement;
-------------------- ps.execute();
-------------------- return resultSetHandler.handleResultSets(ps);