在项目中使用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,$符的替换,以及一级二级缓存等等。