spring源码之mybatis实例化Mapper

在项目中使用jdbc的时候,可以通过下面这种方式进行配置

@ComponentScan("com.spring.batis")
@MapperScan("com.spring.batis.dao")
public class BatisConfig {
          
   


	@Bean
	public DataSource dataSource(){
          
   
		DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
		driverManagerDataSource.setDriverClassName("");
		driverManagerDataSource.setPassword("");
		driverManagerDataSource.setUsername("");
		driverManagerDataSource.setUrl("");
		return driverManagerDataSource;
	}

	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception{
          
   
		SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
		factoryBean.setDataSource(dataSource());
		return factoryBean.getObject();
	}

}

@Mapper
public interface TMapper {
          
   

	/**
	 * fetch data by rule id
	 *
	 * @param id rule id
	 * @return Result<Map>
	 */
	@Select("select * from t where id = ${id}")
	Map<String, String> queryMap(String id);
}

但是这样看的我们是一头雾水,不清楚一个Mapper类怎么就可以直接注入调用了。 于是可以这样,绕过spring框架的注解,直接通过mybitas来调用,这样的最终实现效果和上面是一样的。

@Test
	public void onlyBatis(){
          
   
		BatisConfig batisConfig = new BatisConfig();
		//获取数据源
		DataSource dataSource = batisConfig.dataSource();
		//实现事务等内容,先不用管
		JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();
		Environment development = new Environment("development", jdbcTransactionFactory, dataSource);
		Configuration configuration = new Configuration(development);
		
		
		configuration.addMapper(TMapper.class);
		SqlSessionFactory build = new SqlSessionFactoryBuilder().build(configuration);
		SqlSession sqlSession = build.openSession();
		
		//主要看这里如何直接通过接口获取一个对象
		TMapper mapper = sqlSession.getMapper(TMapper.class);
		Map<String, String> stringStringMap = mapper.queryMap("1");
	}

那么我们可以点进这个源码看一下, sqlSession.getMapper() --> configuration.getMapper() --> mapperRegistry.getMapper() -->mapperProxyFactory.newInstance() 看到这里不就明白了,这就是动态代理的方式实现的呗,后面会再展开将jdbc的动态代理具体实现,里面会有如何解析sql,$符的替换,以及一级二级缓存等等。

总结:动态代理的方式实现Mapper

经验分享 程序员 微信小程序 职场和发展