目的
本文主要学习记录原生mybatis源码中sql解析的学习;
mybatis的核心原理,我的理解是这样的:
- 将xml中或者注解中配置的sql,以方法的维度,存入到mappedStatements这个map集合中,key是全类名+方法名,value是根据sql生成的MappedStatement类
- 将dao接口的动态代理工厂,存入knownMappers这个map中,key是接口的全类名,value是根据接口生成的动态代理工厂
- 在通过mybatis调用sql的时候,根据接口类型,从这两个map中获取对应的value
应用
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//查询sql的第一种方式
// List<OperChannel> list = sqlSession.selectList("com.springsource.study.mybatis.OperChannelMapper.selectAll");
// OperChannel operChannel = sqlSession.selectOne("com.springsource.study.mybatis.OperChannelMapper.selectAll",1);
System.out.println("+++++++++++++++++");
//查询sql的第二种方式:动态代理
OperChannelMapper operChannelMapper = sqlSession.getMapper(OperChannelMapper.class);
System.out.println(operChannelMapper.selectAll(1));
sqlSession.commit();
System.out.println(operChannelMapper.selectAll(1));
}
这是自己测试demo的main方法
源码
首先,我们要从SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
这行代码开始看起
在这个gif中,展示的是上面build方法里面的调用逻辑,我们看org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration
这个方法的代码
private void parseConfiguration(XNode root) {
try {
//issue #117 read properties first
propertiesElement(root.evalNode("properties"));
Properties settings = settingsAsProperties(roo