这篇文章给大家分享的是有关MyBatis工作原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
Mybatis分层框架图
Mybatis工作原理图
源码分析:一般都是从helloworld入手
1、根据xml配置文件(全局配置文件mybatis-config.xml)创建一个SqlsessionFactory对象,mybatis-config.xml有数据源一些环境信息
2、sql映射文件EmployeeMapper.xml配置了每一个sql,以及sql的封装规则等。
3、将sql映射文件注册在全局配置文件中
4、写代码:
根据全局配置文件得到sqlsessionFactory
使用SqlSession工程进行crud、sqlseesion就代表和数据库进行会话,用完close
使用sql标识告知mybatis来执行哪个sql,sql都是保存在sql映射文件中
测试类SqlSessionFactoryBuilder处打断点
/** * 1、根据xml配置文件(全局配置文件mybatis-config.xml)创建一个SqlsessionFactory对象,mybatis-config.xml有数据源一些环境信息 * 2、sql映射文件EmployeeMapper.xml配置了每一个sql,以及sql的封装规则等。 * 3、将sql映射文件注册在全局配置文件中 * 4、写代码: * 4.1.根据全局配置文件得到sqlsessionFactory * 4.2.使用SqlSession工程进行crud,sqlseesion就代表和数据库进行会话,用完close * 4.3.使用sql标识告知mybatis来执行哪个sql,sql都是保存在sql映射文件中 * * @throws IOException */ @Test public void test() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、获取SqlSession实例,能直接执行已经映射了的sql语句,selectOne:sql唯一标识,执行sql要用到的参数 SqlSession openSession = sqlSessionFactory.openSession(); try { Employee employee = openSession.selectOne("com.ming.dao.EmployeeMapper.getEmpByID", 1); System.out.println(employee); } finally { openSession.close(); } }
1、获取SqlsessionFactory对象
XPathParser作用:用dom解析mybatis-config.xml标签的configuration标签
public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; parseConfiguration(parser.evalNode("/configuration")); return configuration; }
一个MappedStatement对象代表一个增删改查标签的详细信息(id sqlResource等)
全局configuation的一个重要属性MappedStatement
KonwnMappers生成一个Mapper接口的代理工厂
总结:
第一步:根据mybatis-config.xml全局配置文件创建SqlSessionFactory对象、就是把配置文件的详细信息解析保存在了configuration对象中,返回包含了configuration的defaultSqsessionFactory对象
注意:mappedSatement对象代表一个增删改查的详细标签
2、获取sqlsession对象
mybatis-openSession
总结:
返回sqlsession的实现类defaultSqlsession对象,defaultSqlsession对象包含了executor和configuration,Executor(四大对象)对象会在这一步被创建
3、获取Mapper接口代理对象(MapperProxy)
返回getMapper接口的代理对象、包含了SqlSession对象
4、执行增删改查方法
查询流程
@Test public void testInterface() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession sqlSession = sqlSessionFactory.openSession(); try { EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); Employee employee = employeeMapper.getEmpByID(1); System.out.println(employee); Employee employee2 = employeeMapper.getEmpByID(5); System.out.println(employee2); System.out.println(employee==employee2); }finally { sqlSession.close(); } }
1、根据配置文件(全局、SQL映射文件)初始化出configuration对象
2、创建一个defaultSqlSession对象,它里面包含configuration和executor(根据配置文件中的defaultEXecutorType创建出对应的Executor)
3、defaultSqlSession.getMapper()获取Mapper接口对应的MapperProxy
4、MapperProxy里面有defaultSqlSession
5、执行增删改查方法:
调用的是defaultSqlsesion的增删改查(会调用Executor的crud)
会创建一个statementhandler对象(同时也会创建出parameterHandler和resultSetHandler)
调用StatementHandler的prepareStatement()方法进行预编译handler.prepare()和参数设置handler.parameterize(stmt)
设置完成后调用StatementHandler的增删改查方法query()
参数预编译完成后使用resultSetHandler封装结果集
注意:四大对象每个创建的时候都有一个interceptorChain.pluginAll()方法
例如StatementHandler 对象的创建
StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql); public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql); statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler); return statementHandler; }
感谢各位的阅读!关于“MyBatis工作原理的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。