关于数据库方言MySQLDialect、MySQL5Dialect、MySQL55Dialect、MySQL57Dialect、MySQL8Dialect之间的区别与联系

今天在配置Hibernate数据连接池的时候遇到一点小问题,于是就上网搜啊搜,总结了一下,干货摆放如下:

我们在用hibernate框架时,设置配置文件的时候要用到一项属性是数据库方言:

org.hibernate.dialect.MySQL57Dialect

但是在MySQL57Dialect这儿有很多版本,如果配置不好就会出现各种错误,都有哪些版本呢?

我收集了一下:

①MySQLDialect

②MySQL5Dialect

③MySQL55Dialect

④MySQL57Dialect

⑤MySQL8Dialect

MySQLInnoDBDialect

⑦MySQLMyISAMDBDialect

首先来看看MySQLInnoDBDialect 和 MySQLMyISAMDBDialect 的区别:

 https://blog.csdn.net/lc0817/article/details/52757194

MyISAMySQL引擎不支持外键,所有如果要映射的表里有外键的话,就会创建失败

这两个明白了,那其他的又有什么区别,再看:

一、MySQLDialect

MySQLDialect是MySQL5.X之前的版本,其默认的引擎是MyISAM。部分源码如下:

private MySQLStorageEngine storageEngine;


//org.hibernate.dialect.MySQLDialect.getDefaultMySQLStorageEngine()
protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
        return MyISAMStorageEngine.INSTANCE;
}

//org.hibernate.dialect.MyISAMStorageEngine.getTableTypeString(String)
@Override
public String getTableTypeString(String engineKeyword) {
    return String.format( " %s=MyISAM", engineKeyword );
}

可以看到,确实用的是MyISAMySQL引擎;

二、MySQL5Dialect

看一下部分源码:

//org.hibernate.dialect.MySQL5Dialect
public class MySQL5Dialect extends MySQLDialect{}

可以看到,它还是用的MySQLDialect的引擎,所以它依然不支持外键;

三、MySQL55Dialect

先看一下部分源码:

//org.hibernate.dialect.MySQL55Dialect
public class MySQL55Dialect extends MySQL5Dialect {

    @Override
    protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
        return InnoDBStorageEngine.INSTANCE;
    }
}

//org.hibernate.dialect.InnoDBStorageEngine
public class InnoDBStorageEngine implements MySQLStorageEngine{

    public static final MySQLStorageEngine INSTANCE = new InnoDBStorageEngine();

    @Override
    public String getTableTypeString(String engineKeyword) {
        return String.format( " %s=InnoDB", engineKeyword );
    }   
}

可以看到,虽然它是继承的MySQL5Dialect,但是它的引擎已经改为innoDB了;而且它支持事务操作,;

剩下的 MySQL57Dialect MySQL8Dialect 的还不太清楚,不敢乱发,有时间看下官方文档再解释,一般来说mysql5.x以上的用MySQL55Dialect就可以支持大多数常用操作了。

 

点个赞,举手之劳~~~

 

你可能感兴趣的:(java)