说明:Java-based Config。
不是通过 mybatis 的 SqlSessionFactoryBuilder 来创建 SqlSessionFactory ,而是通过 mybatis-spring 的 SqlSessionFactoryBean 来获取。
1、首先要有一个DataSource 。
需要注意,事务管理器也在这里注册。(mybatis-spring插件会自动调用该事务管理器)
@Bean(name = "transactionManager") public DataSourceTransactionManager dataSourceTransactionManager() { DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(this.dataSource()); return dataSourceTransactionManager; }
2、然后,注册SqlSessionFactoryBean(或者SqlSessionFactory,二选一,内容一致)。如下:
@Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(this.dataSource()); // sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); // 这里可以通过mybatis-config.xml 来设置 typeAliasPackage和mapper。 // Resource[] mapperLocations = new Resource[] { new ClassPathResource("com.expert.dao") }; // 这个和@MapperScan冲突吗?这个设置有问题。 // sqlSessionFactoryBean.setMapperLocations(mapperLocations);//<mappers> sqlSessionFactoryBean.setTypeAliasesPackage(PojoBasePackage); // sqlSessionFactoryBean.setCache(cache); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject(); // It can be specified a Configuration instance directly without MyBatis XML configuration file. sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);// 开启驼峰映射 sqlSessionFactory.getConfiguration().setCacheEnabled(true); sqlSessionFactory.getConfiguration().setLazyLoadingEnabled(true); sqlSessionFactory.getConfiguration().setAggressiveLazyLoading(false); // Class<Object> logImpl = sqlSessionFactory.getConfiguration().getTypeAliasRegistry().resolveAlias("SLF4J"); sqlSessionFactory.getConfiguration().setLogImpl(Slf4jImpl.class);// logImpl sqlSessionFactory.getConfiguration().setLogPrefix("###SPRING_BOOT###MYBATIS###"); sqlSessionFactory.getConfiguration().setDefaultExecutorType(ExecutorType.REUSE); sqlSessionFactory.getConfiguration().setUseGeneratedKeys(true); return sqlSessionFactory; }
这里还设置了一堆参数。需要注意的是,
①设置了 TypeAliasesPackage 。
②设置了 Configuration 。
③mybatis-spring会自动创建 Configuration 对象,所以通过 sqlSessionFactory.getConfiguration() 即可获取并进行设置。
3、再注册一个 SqlSessionTemplate,这是 mybatis-spring 的核心。
@Bean @Scope(BeanDefinition.SCOPE_PROTOTYPE) // 多例? public SqlSessionTemplate sqlSessionTemplate() throws Exception { return new SqlSessionTemplate(this.sqlSessionFactory()); }
4、设置mapper的位置,有两种方法。
①推荐这种,简单。
@Configuration @MapperScan(basePackages = { "com.expert.dao" }) public class DruidDataSourceConfig{ // ... }
②
@Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setBasePackage(DaoBasePackage); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); return mapperScannerConfigurer; }
至此,已可以成功运行。
但是,还有更简单的方法,那就是 MyBatis-Spring-Boot-Starter 。使用该Starter时,会自动查找DataSource,并自动创建SqlSessionFactoryBean 和 SqlSessionTemplate。所以,只需要设置mapper所在的位置和别名所在的包即可。