关于springboot2项目MyBatis-Plus支持多数据库
公司的项目一直使用的为mysql数据库,但是最新的客户已经购买ORACLE数据库,所以要求必须使用oracle数据库,为了兼容所以对项目进行改造让其可以支持多个数据库的切换,切记不是多数据源。
查找了帖子,对其进行了测试总结如下:
1、增加方言配置来适配不同的数据库,已对大部分数据库进行适配处理,建立MybatisPlusConfig配置类增加如下代码
/*
/** * 数据库方言配置 * @return */ @Bean public DatabaseIdProvider getDatabaseIdProvider() { VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider(); Properties properties = new Properties(); properties.setProperty("Oracle","oracle"); properties.setProperty("MySQL","mysql"); properties.setProperty("DM DBMS", "dm7"); properties.setProperty("PostgreSQL", "postgresql"); properties.setProperty("DB2", "db2"); properties.setProperty("SQL Server", "sqlserver"); databaseIdProvider.setProperties(properties); return databaseIdProvider; }
/**此处的keyvalue,key的值是对应的数据库的productName,value则是一个自定义的值可以对应到mapper.xml里面的databaseId。
productName获取方法如下:
public static void main(String[] args) throws Exception { String driver = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/数据库名"; String username = "root"; String password = "root"; Class.forName(driver); Connection con = (Connection) DriverManager.getConnection(url,username,password); DatabaseMetaData metaData = (DatabaseMetaData) con.getMetaData(); System.out.println("数据库的产品名称:" + metaData.getDatabaseProductName()); }
2、xxxMapper.xml中通过databaseId指定数据库类型
<select id="selectUser" resultMap="UserVO" databaseId="mysql"> SELECT * FROM 表名 </select> <select id="selectUser" resultMap="UserVO" databaseId="oracle">
也可以在具体语句中进行区分
<if test="_databaseId == oracle"> nvl(am.all_role,) AS "role", </if> <if test="_databaseId == mysql"> IFNULL(am.all_role,) AS "role", </if>
3、application.yml里面spring.profiles.active指定的数据库配置如果为Mysql则就会自动寻找databaseId为mysql的语句,如果数据源为oracle就会找对应oracle的语句。我在测试过程中发现不需要有些帖子指出的需要配置database-id。
这样就配置结束,下来会对转oracle时需要注意的点进行统计。
oracle和Mysql转换时注意点 :
对mybatisplus原sql注入的修改: * 数据库方言配置yml * @return */ @Bean public DatabaseIdProvider getDatabaseIdProvider() { VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider(); Properties properties = new Properties(); properties.setProperty("Oracle","oracle"); properties.setProperty("MySQL","mysql"); properties.setProperty("DM DBMS", "dm7"); properties.setProperty("PostgreSQL", "postgresql"); properties.setProperty("DB2", "db2"); properties.setProperty("SQL Server", "sqlserver"); databaseIdProvider.setProperties(properties); return databaseIdProvider; }
* 数据库方言配置 * @return */ @Bean public DatabaseIdProvider getDatabaseIdProvider() { VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider(); Properties properties = new Properties(); properties.setProperty("Oracle","oracle"); properties.setProperty("MySQL","mysql"); properties.setProperty("DM DBMS", "dm7"); properties.setProperty("PostgreSQL", "postgresql"); properties.setProperty("DB2", "db2"); properties.setProperty("SQL Server", "sqlserver"); databaseIdProvider.setProperties(properties); return databaseIdProvider; }