工作中遇到一个问题,就是使用mybatis的时候,要兼容多种数据库,要根据不同的数据库写不同的sql。
在网上找了很多资料,一个是要求需要mybatis3.1.1及其以上版本。一个是和spring整合后不能直接配置mybatis.xml,而是要直接配置SqlSessionFactoryBean。
打开SqlSessionFactoryBean我们能看到很多成员变量。
private Resource configLocation; private Resource[] mapperLocations; private DataSource dataSource; private TransactionFactory transactionFactory; private Properties configurationProperties; private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); private SqlSessionFactory sqlSessionFactory; private String environment = SqlSessionFactoryBean.class.getSimpleName(); private boolean failFast; private Interceptor[] plugins; private TypeHandler [] typeHandlers; private String typeHandlersPackage; private Class [] typeAliases; private String typeAliasesPackage; private Class typeAliasesSuperType; private DatabaseIdProvider databaseIdProvider; private ObjectFactory objectFactory; private ObjectWrapperFactory objectWrapperFactory;
我们可以看到DatabaseIdProvider,这个就是配置数据方言的。
我们只要构造这个bean赋值给SqlSessionFactoryBean就可以使用了。DatabaseIdProvider只是个接口,我们直接找实现类,很容易找到VendorDatabaseIdProvider。这个类有一个成员变量Properties就是用来设置方言名字和值的。
oracle mysql
剩下的就是把对象赋值给SqlSessionFactoryBean
然后在编写mapper文件的时候就需要加databaseId就可以,这样在加载不同的数据库的时候就会加载不同的配置项。