SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
Department departmentById = mapper.getDepartmentById(1);
第一步,获得工厂
1、加载主配置文件,将配置信息封装到Confgtion当中
2、解析所有xxxxmapper.xml
3、将xxxMapper.xml信息当中所有SQL语句信息封装成一个StatementMapper,也添加到Configution当中
4、返回一个包含所有配置信息的DefaultSqlSessionFactory
第二步,获得SqlSession
1、根据Exector类型创建出Executor 默认是SIMPLE
2、判断是否开启二级缓存;如果开启将其包装成CachingExecutor
二级缓存的Executor执行器,执行之前会先从缓存中获取
3、执行插件的plugnAll方法;内部就是遍历所有interceptor#plugin方法
4、返回 new DefaultSqlSession(configuration, executor, autoCommit)
5、创建成功
第三步,创建mapper代理对象
1、MapperRgistry.getMapper(type,sqlSession)
2、 mapperProxyFactory.newInstance(sqlSession)内部就是基于jdk的动态代理的创建
3、返回一个MapperProxy动态代理
第四步,代理对象执行目标方法
1、mapperMethod执行excute方法
2、判断语句的类型INSERT|UPDATE|DELETE|SELECT
3、执行SELECT操作;并且判断用什么类型的结果集来接收
1、将参数转换成sql类型的参数。
封装到map当中:第一种{username=arg[0],age=arg[1],2=arg[2]}
第二种{param1=arg[0],param2=arg[1],param3=arg[3]}
返回param的map集合
2、如果是就是一个参数 那么直接返回,不用封装
4、执行原生的selectOne(command.getName(), param)操作
5、this.<T>selectList(statement, parameter)
6、执行executor.query()方法
7、执行query()方法
1、先从缓存中获取
2、缓存中没有,调用SimpleExexutor
8、 queryFromDatabase从数据库中查询 执行查询方法
1、获得configuration
2、创建StatementHandler;同时实例化也会创建parameterHandler,ResultSetHandler
3、获得原生prepareStatement
1、获得原生的connection
2、原生方式获得prepareStatement
3、handler.parameterize(stmt);
DefaultparamerHandler.setParameters
4、handler.<E>query(stmt, resultHandler)原生jdbc进行查询,并且返回结果
9、将查询出来的结果放置到缓存当中;并添加到一级缓存当中,返回查询出来的结果