本文介绍springboot-集成mybatis-plus,(又出现很多以Mybatis开头的配置类),启动时如何加载各个类,解析配置文件,生成接口代理类。sql执行器。
自定配置入口
1.找到自动配置类MybatisPlusAutoConfiguration,会看到
@Bean @ConditionalOnMissingBean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {}
这里给出了,如果自己没有配置SqlSessionFactory,这个配置就会生效。断点调试。
这个方法配置MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(),里面设置dataSource,加载配置类信息MybatisPlusProperties,最后一行的factory.getObject(),方法,判断SqlSessionFactory==null ,会调用初始化方法afterPropertiesSet(),这个方法会构建SqlSessionFactory,
this.sqlSessionFactory = buildSqlSessionFactory();
进入方法,会看到这里解析xml,构建
MybatisConfiguration
MybatisXMLConfigBuilder
new DefaultSqlSessionFactory()
XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(..) 解析mapper.xml xmlMapperBuilder.parse();
SqlSessionFactory创建完毕,执行sql查询的时候进入MybatisMapperProxy类,找到invoke方法
会执行MybatisMapperMethod的excute方法。执行查询的时候,会执行
CachingExecutor类 @Override publicList query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException { BoundSql boundSql = ms.getBoundSql(parameterObject); //key==1862739912:3384727830:com.example.demo2.mybatisdemo.UserMapper.getUser:0:2147483647:SELECt COUNT(1) FROM t_user WHERe id > ?:1:MybatisSqlSessionFactoryBean CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql); return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql); }
我自己代码是这样写的,里面有事务,在同一个session里查询2次,一级缓存才生效。否则在sqlSession提交的时候会清空一级缓存。
@Transactional public int getUser() { userMapper.getUser(1); return userMapper.getUser(1); }
把事务去掉之后代码,一级缓存,在每次查询之后就被清空,一级缓存也没有用了。
public int getUser() { userMapper.getUser(1); return userMapper.getUser(1); }
mybatis的Executor这里没有介绍,可以查看其他文章。到这里就完毕了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)