有关模板(template)的理解
一般使用模板(template)来操作数据库的话,都需要给template设置一个连接工厂,告诉这个模板从什么地方获取连接,比如像RedisTemplate、HibernateTemplate(hibernate3)
@Bean
public RedisTemplate<String, Product> redisTemplate(RedisConnectionFactory cf){
RedisTemplate<String, Product> redis = new RedisTemplate<>();
redis.setConnectionFactory(cf);
return redis;
}
// HibernateTemplate的构造函数
public HibernateTemplate(SessionFactory sessionFactory) {
this.setSessionFactory(sessionFactory);
}
// 同时Session工厂bean的配置如下
@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource){
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean();
sfb.setDataSource(dataSource);
sfb.setMappingResources(new String[]{"Spitter.hbm.xml"});
Properties props = new Properties();
props.setProperty("dialect", "org.hibernate.dialect.H2Dialcet");
sfb.setHibernateProperties(props);
return sfb;
}
// 使用LocalSessionFactoryBean来构建HibernateTemplate
配置mybatis
遇到一个问题,就是mybatis的配置<setting name="mapUnderscoreToCamelCase" value="true" />
不生效,经过分析,发现之前的代码中配置过SqlSessionFactory,但是没有给SqlSessionFactory配置Configuration,所以不生效。最后自己写了个数据源配置。这种写法参考于
https://gitee.com/dlutysc/springboot-learning-example/tree/master/springboot-mybatis-mutil-datasource
//@Configuration
@ConfigurationProperties(prefix = "my.datasource")
@MapperScan(basePackages = {DataSourceConfig.PACKAGE}, sqlSessionFactoryRef = "mySqlSessionFactory")
@Component
@Data
public class DataSourceConfig {
static final String PACKAGE = "gov.df.myepay.dao";
static final String MAPPER_LOCATION = "classpath:gov/df/myepay/dao/*.xml";
// @Value("${my.datasource.jdbcUrl}")
private String jdbcurl;
// @Value("${my.datasource.username}")
private String username;
// @Value("${my.datasource.password}")
private String password;
// @Value("${my.datasource.driverClassName}")
private String driverClassName;
// @Value("${my.datasource.maximum-pool-size}")
private int maximumPoolSize;
// @Value("${my.datasource.minimum-idle}")
private int minimumIdle;
@Bean(name = "myDataSource")
public DataSource myDataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setJdbcUrl(jdbcurl);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setMaximumPoolSize(maximumPoolSize);
dataSource.setMinimumIdle(minimumIdle);
return dataSource;
}
@Bean(name = "myTransactionManager")
public DataSourceTransactionManager clusterTransactionManager() {
return new DataSourceTransactionManager(myDataSource());
}
@Bean(name = "mySqlSessionFactory")
public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("myDataSource") DataSource myDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(myDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(DataSourceConfig.MAPPER_LOCATION));
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
sessionFactory.setConfiguration(configuration);
return sessionFactory.getObject();
}
}