前言
公司一直在使用Jpa + Hibernate那一套东西,但是这套技术封装的太过后重。不利于开发人员掌握,而在优化sql方面也是蛋疼的很。所以在后台不是特别重要的项目中引入了MyBatis。当然光会使用,是满足不了本吊丝的胃口,所以走上了分析MyBatis源码的道路,并有了这一系列的文档,供志同道合的朋友参考和指证。
解析配制文件并返回SqlSessionFacotory的类SqlSessionFactoryBuilder
我们在使用MyBatis的时候一般都会提供一个mybatis-config.xml的配制文件,配制下如:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties>
<property name="username" value="root"/>
<property name="password" value="jianglei"/>
</properties>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<typeAlias alias="Blog" type="com.jianglei.example.Blog"/>
</typeAliases>
<environments default="prod">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username1:root}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="prod">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="jdbc:mysql://localhost:3306/prod"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/jianglei/example/BlogMapper.xml"/>
</mappers>
</configuration>
而在进行数据查询的时候一般是如下的代码:
public class InterfaceWithXMLTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void testInit() throws IOException {
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
Properties prop = new Properties();
prop.load(Resources.getResourceAsStream("mybatis-config.properties"));
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is, prop);
}
@Test
public void save() {
SqlSession session =
sqlSessionFactory.openSession();
try {
...
}finally {
session.close();
}
}
}
SqlSessionFactoryBuilder
解析了mybatis-config.xml文件,并返回了SqlSessionFactory
类
SqlSessionFactoryBuilder关键代码
查看该类的源码,就是一大堆build方法的重载,而最核心的方法如下:
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
先由XMLConfigBuilder
类解析配制文件转换为相应的XMLConfigBuilder
实例
调用parser.parse()
方法生成Configuration
类
调用new DefaultSqlSessionFactory(config)
返回SqlSessionFactory
实例