详解MyBatis工作原理

网友投稿 632 2023-01-15

详解MyBatis工作原理

详解MyBatis工作原理

一、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就代表和数据库进行会话,用完closNqHmrDJqCse

使用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";

sNqHmrDJqC 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();

}

}

二、Mybatis运行原理总结

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 sNqHmrDJqChandler = 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;

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:小程序生态发展(微信小程序已经迈入成熟期并形成了一定生态)
下一篇:银行小程序首页图片尺寸(小程序的页面尺寸)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~