SqlSessionFactoryBuilder
mybatis中文文档
快速启动
实体类
@Data
public class User implements Serializable{
private Long id ;
private String userName ;
private Date createTime;
}
mapper接口
public interface UserMapper {
User selectById(Long id);
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.my.mapper.UserMapper">
<resultMap id="result" type="User">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="user_name" jdbcType="VARCHAR" property="userName"/>
<result column="create_time" jdbcType="DATE" property="createTime"/>
</resultMap>
<select id="selectById" resultMap="result">
select id,user_name,create_time from user
<where>
<if test="param1>0">
and id=#{param1}
</if>
</where>
</select>
</mapper>
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 resource="db.properties"></properties>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.my.entity"/>
</typeAliases>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${mysql.driverClass}"/>
<property name="url" value="${mysql.jdbcUrl}"/>
<property name="username" value="${mysql.user}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.my.mapper"/>
</mappers>
</configuration>
db.properties
mysql.driverClass=com.mysql.jdbc.Driver
mysql.jdbcUrl=jdbc:mysql://地址/mybatis_test?characterEncoding=utf8
mysql.user=root
mysql.password=密码
启动类
public class Bootstrap {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectById(1L);
System.out.println(user.getUserName());
} finally {
session.close();
}
}
}
源码路程图
SqlSessionFactoryBuilder执行流程
总览图:
详细执行流程:
源码解析
构建SqlSessionFactory
调用new SqlSessionFactoryBuilder().build(reader);
执行下面代码:
public SqlSessionFactory build(Reader reader) {
return build(reader, null, null);
}
继续调用
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
//创建xmlConfig构造器
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
//parser.parse()解析成Configuration
//根据Configuration构造SqlSessionFactory
return build(parser.parse());
} ...
}
XMLConfigBuilder构造函数
public XMLConfigBuilder(Reader reader, String environment, Properties props) {
//创建XPathParser,并且给XMLConfigBuilder属性赋值
this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props);
}
XPathParser构造函数
public XPathParser(Reader reader, boolean validation, Properties variables, EntityResolver entityResolver) {
commonConstructor(validation, variables, entityResolver);
//将xml文件转成org.w3c.dom.Document
this.document = createDocument(new InputSource(reader));
}
parser.parse()
public Configuration parse() {
//如果解析过,抛异常
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
parsed = true;
//解析xml中configuration节点
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
parseConfiguration
private void parseConfiguration(XNode root) {
try {
//解析properties节点
propertiesElement(root.evalNode("properties"));
//解析settings节点
Properties settings = settingsAsProperties(root.evalNode("settings"));
loadCustomVfs(settings);
//覆盖日志实现类
loadCustomLogImpl(settings);
//解析别名
typeAliasesElement(root.evalNode("typeAliases"));
//解析插件
pluginElement(root.evalNode("plugins"));
//解析对象工厂类,创建对象时通过此类创建
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
reflectorFactoryElement(root.evalNode("reflectorFactory"));
//覆盖默认settings
settingsElement(settings);
//根据环境加载数据源
environmentsElement(root.evalNode("environments"));
//供应商
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
//加载自定义typeHandlers
typeHandlerElement(root.evalNode("typeHandlers"));
//解析mapper.xml
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}