MyBatis配置文件(八)--databaseIdProvider数据库厂商标识

摘要:
databaseIdProvider元素主要是为了支持不同厂商的数据库,比如有时候我们在公司内部开发使用的数据库都是PG,但是客户要求使用MySql,那就麻烦了是吧?其实在mybatis中我们可以使用databaseIdProvider这个元素实现数据库兼容不同厂商,即配置多中数据库。--数据库厂商标示--˃2345672、在SQL中通过别名标识适用的数据库12SELECT*FROMproduct3这样就能获取正确结果了。通过上面的实践知道了:使用多数据库SQL时需要配置databaseIdProvider属性。

databaseIdProvider元素主要是为了支持不同厂商的数据库,比如有时候我们在公司内部开发使用的数据库都是PG(Postgresql),但是客户要求使用MySql,那就麻烦了是吧?其实在mybatis中我们可以使用databaseIdProvider这个元素实现数据库兼容不同厂商,即配置多中数据库。

看一下配置方式:

1 <!--数据库厂商标示 -->
2     <databaseIdProvider type="DB_VENDOR">
3         <property name="Oracle"value="oracle"/>
4         <property name="MySQL"value="mysql"/>
5         <property name="DB2"value="d2"/>
6     </databaseIdProvider>

1⃣️databaseIdProvider的type属性是必须的,不配置时会报错。上面这个属性值使用的是VendorDatabaseIdProvider类的别名,这个可以参考我之前写的文章https://www.cnblogs.com/hellowhy/p/9668096.html中系统别名打印结果查看。

2⃣️property子元素是配置一个数据库,其中的name属性是数据库名称,value是我们自定义的别名,通过别名我们可以在SQL语句中标识适用于哪种数据库运行。如果不知道数据库名称,我们可以通过以下代码获取:

1 /**
2 * 获取数据库名称
3      */
4     public static voidgetDbInformation() {
5         SqlSession sqlSession = null;
6         Connection connection = null;
7         try{
8             sqlSession =getSqlSession();
9             connection =sqlSession.getConnection();
10             String dbName =connection.getMetaData().getDatabaseProductName();
11             String dbVersion =connection.getMetaData().getDatabaseProductVersion();
12             System.out.println("数据库名称是:" + dbName + ";版本是:" +dbVersion);
13         } catch(SQLException e) {
14 e.printStackTrace();
15 }
16     }

下面我们就可以在自己的sql语句中使用属性databaseId来标示数据库类型了。如下:

1 <select id="getAllProduct"resultType="product"databaseId="mysql">
2 SELECT * FROM product
3 </select>

注意⚠️:在上面的SQL中,我配置的databaseId是mysql,但是我的实际的数据库是pg,看一下执行结果:

MyBatis配置文件(八)--databaseIdProvider数据库厂商标识第1张

可以看到,当数据库名称与实际配置不符时会抛出异常,所以我的配置应该是这样的:

1、在数据库厂商配置中增加postgresql的配置

1 <!--数据库厂商标示 -->
2     <databaseIdProvider type="DB_VENDOR">
3         <property name="Oracle"value="oracle"/>
4         <property name="MySQL"value="mysql"/>
5         <property name="DB2"value="d2"/>
6         <property name="PostgreSQL"value="pg"/>
7     </databaseIdProvider>

2、在SQL中通过别名标识适用的数据库

1 <select id="getAllProduct"resultType="product"databaseId="pg">
2 SELECT * FROM product
3 </select>

这样就能获取正确结果了。除上述方法之外,我们还可以不在SQL中配置databaseId,这样mybatis会使用默认的配置,也是可以成功运行的。

通过上面的实践知道了:使用多数据库SQL时需要配置databaseIdProvider 属性。当databaseId属性被配置的时候,系统会优先获取和数据库配置一致的SQL,否则取没有配置databaseId的SQL,可以把它当默认值;如果还是取不到,就会抛出异常。

同之前介绍的配置类似,除了系统自定义的标识外,我们也可以自定义一个规则,需要实现MyBatis提供的DatabaseIdProvider接口,如下:

1 /**
2 * 自定义一个数据库标示提供类,实现DatabaseIdProvider接口
3 * 
4 * @authorhyc
5 *
6  */
7 public class MyDatabaseIdProvider implementsDatabaseIdProvider {
8     private static final String DATABASE_MYSQL = "MySQL";
9     private static final String DATABASE_POSTGRESQL = "PostgreSQL";
10     private static final String DATABASE_ORACLE = "Oracle";
11     private static final String DATABASE_DB2 = "DB2";
12 
13 @Override
14     public voidsetProperties(Properties p) {
15         System.out.println(p.getProperty("Oracle"));
16 }
17 
18 @Override
19     public String getDatabaseId(DataSource dataSource) throwsSQLException {
20         Connection conn =dataSource.getConnection();
21         String dbName =conn.getMetaData().getDatabaseProductName();
22         String dbAlias = "";
23         switch(dbName) {
24         caseDATABASE_MYSQL:
25             dbAlias = "mysql";
26             break;
27         caseDATABASE_POSTGRESQL:
28             dbAlias = "pg";
29             break;
30         caseDATABASE_ORACLE:
31             dbAlias = "oracle";
32             break;
33         caseDATABASE_DB2:
34             dbAlias = "db2";
35             break;
36         default:
37             break;
38 }
39         returndbAlias;
40     }

然后在databaseIdProvider中做如下配置:

1 <!--数据库厂商标示 -->
2     <databaseIdProvider type="com.daily.objectfactory.MyDatabaseIdProvider" />

property属性可以不做配置了,其他都一样。

以上就是数据库厂商标识databaseIdProvider的相关介绍。

免责声明:文章转载自《MyBatis配置文件(八)--databaseIdProvider数据库厂商标识》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇浅谈Sass与Less区别、优缺点矩阵LU分解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mybatis中parameterType、resultMap、statementType等等配置详解(标签中基本配置详解)

一、(转自:https://blog.csdn.net/majinggogogo/article/details/72123185) 映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert、update、delete、select(增删改查);cache、cache-ref、resultMap、parameterMa...

.NET连接MySQL数据库的方法实现

突然对.NET连接MySQL数据库有点兴趣,于是乎网上到处找资料,学习MySQL的安装,MySQL的使用等等等等,终于搞定了! 最终效果就是显示数据库中数据表的数据: 首先,当然要有MySQL数据库啦,MySQL下载地址:www.mysql.com/downloads/ ,我下载的是最新版本的MySQL。 安装方法可以参考这篇文章:5.6版本MySQL的...

SQL Server 2012 Express LocalDB 的作用

微软最新推出的 SQL Server 2012 Express LocalDB 是一种 SQL Server Express 的运行模式,特别适合用在开发环境使用,也内置在 Visual Studio 2012 之中。 关于SQL Server 2012 Express LocalDB 的运作方式 在安装 LocalDB 时会复制一个 SQL Server...

Mysql查找如何判断字段是否包含某个字符串

Mysql查找如何判断字段是否包含某个字符串 有这样一个需求,在Mysql数据库字符串字段(权限)中,用户有多个不同的邮箱,分别被‘,’分开,现在要取出某个邮箱的所有成员列表。 假设有个表: CREATE TABLE users(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),user_name VA...

Microsoft SQL Server 查询连接数和关闭连接数

1.查询指定数据库有哪些连接(connection) SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT [DBID] FROM [Master].[dbo].[SYSDATABASES] WHERE NAME='test'...

ubuntu apt 安装mysql 5.7

Ubuntu上安装MySQL非常简单只需要几条命令就可以完成。 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client 3. sudo apt-get install libmysqlclient-dev 安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使...