关于MySQL8.0.11连接JDBC代码及连接Hibernate-5.3.1.Final时Hibernate.cfg.xml文件的写法遇到的问题及解决过程

CSDN上的第一篇博客,研究了一下午加一晚上终于找到问题并解决问题。

第一个问题:

最近复习mysql数据库相关内容,去官网下载MySQL发现出了个MySQL8.0.11版本,头铁去下了个来用,然后发现JDBC连接数据库时报错(已下载对应的mysql-connector-java-8.0.11.jar),各种百度后总结应注意以下两点:

1.注册驱动时Driver类的全限定性类名为:com.mysql.cj.jdbc.Driver,即:

Class.forName("com.mysql.cj.jdbc.Driver");


2.mysql8的url需要追加参数,否则无法连接,会报错;

需要将SSL手动关闭,并且将服务器时区设置为UTC,即:

String url = "jdbc:mysql://localhost:3306/zhengyang?useSSL=false&serverTimezone=UTC";


最终JDBC连接数据库代码如下:

package com.zhengyang.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCTest11 {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			//注册驱动
			Class.forName("com.mysql.jdbc.Driver");
			//连接数据库
			String url = "jdbc:mysql://localhost:3306/zhengyang?useSSL=false&serverTimezone=UTC";
			String user = "root";
			String password = "1111";
			conn = DriverManager.getConnection(url, user, password);
			//关闭自动提交,开启事务
			conn.setAutoCommit(false);
			//定义SQL语句,事务只与DML语句有关
			String sql = "delete from t_user where id = ?";
			//预编译
			ps = conn.prepareStatement(sql);
			//赋值
			ps.setInt(1, 1);
			//执行SQL语句
			int count = ps.executeUpdate();
			System.out.println(count);
			//提交事务
			conn.commit();
		} catch (Exception e) {
			//回滚事务
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}finally{
			//关闭资源
			if(ps != null){
				try {
					ps.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

该问题通过这位同学的博客解决:https://blog.csdn.net/beyond9305/article/details/80330125 (表示感谢)


============================================================================

============================================================================


第二个问题:

MySQL8.0.11连接Hibernate-5.3.1.Final时Hibernate.cfg.xml文件的写法问题

刚开始按照连接JDBC时的写法将Hibernate.cfg.xml文件中的URL写成

<property name="hibernate.connection.url">

        jdbc:mysql://localhost:3306/oa?useSSL=false&serverTimezone=UTC
</property>

发现运行后报错:

“Message: 对实体 "serverTimezone" 的引用必须以 ';' 分隔符结尾。”

各种百度后才找到原因:

xml文件中有些特殊字符是被禁止的,而‘&’就是其中一个,如果要想使用它,需要用到它的转义字符"&amp;"

所以URL应写为:


<property name="hibernate.connection.url">
    jdbc:mysql://localhost:3306/oa?useSSL=false&amp;serverTimezone=UTC
</property>

还有在设置dialect时,应注意选择MySQL8Dialect.class,而不是MySQLDialect.class, 即:

<!-- 设置方言 -->
	<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>

最后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>

	<property name="hibernate.connection.driver_class">
		com.mysql.cj.jdbc.Driver
	</property>
	<property name="hibernate.connection.url">
		jdbc:mysql://localhost:3306/oa?useSSL=false&serverTimezone=UTC
	</property>
	<property name="hibernate.connection.username">root</property>
	<property name="hibernate.connection.password">1111</property>
	
	<!-- 设置方言 -->
	<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
	
	<!-- 数据源C3P0:数据库连接池 -->
	<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
	
	<!-- 注册当前session上下文:保证同一线程中获得的session是同一个session -->
	<property name="hibernate.current_session_context_class">thread</property>
	
	<!-- 自动建表 -->
	<property name="hibernate.hbm2ddl.auto">update</property>
	
	<!-- 显示SQL -->
	<property name="hibernate.show_sql">true</property>
	
	<!-- 格式化SQL -->
	<property name="hibernate.format_sql">true</property>
	
	<!-- 注册映射文件 -->
	<mapping resource="com/zhengyang/beans/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>


关于MySQL8连接hibernate的问题目前在百度上很少,可能因为版本太新吧(至少我在2018年6月3日查找是没能找到),所以自己写了这一篇来解决MySQL8的连接问题。


猜你喜欢

转载自blog.csdn.net/m0_37922841/article/details/80553693