Hibernate - ClassNotFoundException:com.mysql.jdbc.Driver

时间:2013-10-11 13:43:16

标签: java mysql hibernate jdbc

我正在尝试通过Hibernate从MySQL数据库中检索数据,但我遇到了这个错误:

Failed to create sessionFactory object.org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver could not be loaded

java.lang.ClassNotFoundException: Could not load requested class : com.mysql.jdbc.Driver
[...]

我使用一个名为DAOFactory的类来获取hibernate会话:

public class DAOFactory {

    private static boolean isInstance = false;  
    private static SessionFactory sessionFactory;
    private static ServiceRegistry serviceRegistry; 
    private static Session session;

    private DAOFactory() throws ExceptionInInitializerError{        
        if( !isInstance ) {
            try {               
                Configuration cfg   = new Configuration().configure();              
                serviceRegistry     = new ServiceRegistryBuilder().applySettings(cfg.getProperties())
                                                .buildServiceRegistry();
                sessionFactory      = cfg.buildSessionFactory(serviceRegistry);
            } catch (Throwable ex) {
                System.err.println("Failed to create sessionFactory object."+ ex);
                throw new ExceptionInInitializerError(ex);
            }
            session = sessionFactory.openSession();         
            isInstance = true ;
        }               
    }

    public static DAOFactory getInstance() {        
        return new DAOFactory() ;
    }

    public Session getSession() {
        return session ;
    }
}

hibernate.cfg.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory name="">
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/enigma</property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="connection.pool_size">1</property>
        <property name="current_session_context_class">thread</property>
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
    </session-factory>
</hibernate-configuration>

并且mysql-connector-java-5.1.26-bin.jar已经在类路径中了:

classpath

有人看到我缺少的东西吗?

8 个答案:

答案 0 :(得分:28)

感谢Reimeus的回答。 mysql-connector-java-5.1.26-bin.jar需要位于运行时类路径中。

运行 - &gt;运行配置... - &gt; Classpath - &gt;添加外部JAR。

清理所有内容,再试一次,异常消失。

答案 1 :(得分:17)

对于使用 Maven 的用户:在pom.xml中添加以下依赖项。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
</dependency>

或从here中选择其他版本。

然后你可以使用:

来获取工件
mvn dependency:resolve

(如果您不使用IDE)。

答案 2 :(得分:4)

遇到与mysql-connector-java-5.1.48-bin.jar.相同的问题,要解决此问题,我将驱动程序类名称从

更改为
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

答案 3 :(得分:1)

在某些情况下,通过运行->运行配置...->类路径->添加外部JAR jar添加到classpath可能不是一个合适的解决方案。

第一种情况

当无法将jar文件放入classpath文件夹中时,有另一种方法可以从另一个位置加载类。您只需要实例化URLClassLoader,然后在其上调用loadClass()(已提到here):

URLClassLoader urlCL = new URLClassLoader(new URL[] {"path_to_jar"});
Class driverClass = urlCL.loadClass("com.mysql.jdbc.Driver");

第二种情况

如果您想在运行时将类添加到classpath(我更喜欢Ranjit Aneesh here的答案),为此,您可以创建一个非常简单的自定义类加载器URLClassLoader和唯一覆盖的addUrl方法:

public class DynamicURLClassLoader extends URLClassLoader {

    public DynamicURLClassLoader(URLClassLoader classLoader) {
        super(classLoader.getURLs());
    }

    @Override
    public void addURL(URL url) {
        super.addURL(url);
    }
}

然后调用它:

URLClassLoader urlCL = (URLClassLoader) ClassLoader.getSystemClassLoader();
new DynamicURLClassLoader(urlCL).addURL("path_to_jar");

答案 4 :(得分:1)

使用mysql-connector-java-5.1.48-bin.jar遇到了相同的问题。要解决此问题,我将驱动程序类名称从更改为

com.mysql.cj.jdbc.Driver

com.mysql.jdbc.Driver

答案 5 :(得分:0)

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.15</version>
    <scope>provided</scope> 
</dependency>
  • 我在Maven中具有高度依赖性。
  • 范围标记引起了错误。
  • 删除范围标签可以解决此问题。

答案 6 :(得分:0)

下载mysql-connector-java-8.0.20.jar 来自https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.20/ 将jar添加到类路径

运行->运行配置...->类路径->添加外部JAR。

答案 7 :(得分:-1)

在intellij想法中的

进入文件->项目结构->库,并添加mysql-connector-java-5.1.26-bin.jar。那么com.mysql.jdbc.Driver将可用