hibernate 连接 mysql_Hibernate学习笔记(一) --- 使用Hibernate连接数据库

本文介绍了如何使用Hibernate连接MySQL数据库,包括数据类定义、ORM配置、Hibernate配置、程序启动类编写,以及解决时区和方言配置问题。
摘要由CSDN通过智能技术生成

Hibernate用来操作数据库,它对开发人员隐藏了底层JDBC的操作及不同数据库的差异,通过它,开发人员基本上只用关心自己的对象就可以了

构建一个最基本的Hibernate应用需要四个部分:

1.数据类。数据类同数据库的表存在对应关系,使用Hibernate操作数据类时,Hibernate会将之转换为对数据库中对应表的操作;

2.ORM配置文件,用于配置数据类及数据库中表的对应关系;

3.Hibernate配置文件,用于配置JDBC数据源、ORM配置文件路径等信息;

4.程序启动类,用于加载Hibernate并启动整个应用;

以一个基于maven的项目为例,其项目结构示例如下,该项目将创建一个电影表用来管理电影数据

7e9079b4db8eb3cca05e0f25bb0941cf.png

首先,在pom.xml中配置Hibernate相关的依赖

1

2

3

4 org.hibernate

5 hibernate-core

6 5.2.11.Final

7

8

9

10

11 mysql

12 mysql-connector-java

13 8.0.8-dmr

14

15

16

17

18

19

20 ${basedir}/src/main/resources

21

22

23

24 ${basedir}/src/main/java

25

26 **/*.hbm.xml

27

28

29

30

其次,编写数据类Movie.java,其内包含ID、电影名称及描述信息

1 packagestudy.hibernate.model;2

3 /**

4 * 电影数据类5 *@authoryaoyao6 *7 */

8 public classMovie {9 private intid;10

11 privateString name;12

13 privateString description;14

15 public intgetId() {16 returnid;17 }18

19 public void setId(intid) {20 this.id =id;21 }22

23 publicString getName() {24 returnname;25 }26

27 public voidsetName(String name) {28 this.name =name;29 }30

31 publicString getDescription() {32 returndescription;33 }34

35 public voidsetDescription(String description) {36 this.description =description;37 }38

39 }

接着,编写ORM配置文件Movie.hbm.xml,用于告诉Hibernate,该数据类同数据库中哪个表对应,该表的数据结构是什么样的

/p>

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

接下来,编写Hibernate配置文件,配置JDBC、ORM配置文件 路径等相关信息

1 <?xml version="1.0" encoding="UTF-8"?>

2 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

5

6

7

8

9 com.mysql.cj.jdbc.Driver

10 jdbc:mysql://localhost:3306/MOVIE_DB?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8

11 root

12 root

13

14

15 10

16

17

18

19 org.hibernate.dialect.MySQL5Dialect

20

21

22 org.hibernate.cache.internal.NoCacheProvider

23

24

25 true

26

27

28 create

29

30

31

32

33

最后,编写程序启动类Launcher.java,加载Hibernate并启动应用程序

1 packagestudy.hibernate;2

3 importorg.hibernate.Session;4 importorg.hibernate.SessionFactory;5 importorg.hibernate.boot.MetadataSources;6 importorg.hibernate.boot.registry.StandardServiceRegistry;7 importorg.hibernate.boot.registry.StandardServiceRegistryBuilder;8

9 importstudy.hibernate.model.Movie;10

11 public classLauncher {12 public static voidmain(String[] args) {13 StandardServiceRegistry registry = newStandardServiceRegistryBuilder()14 .configure()15 .build();16 SessionFactory sessionFactory = null;17 Session session = null;18 try{19 sessionFactory = newMetadataSources( registry ).buildMetadata().buildSessionFactory();20 session =sessionFactory.openSession();21

22 Movie movie = newMovie();23 movie.setId(1);24 movie.setName("速度与激情8");25 movie.setDescription("多米尼克(范·迪塞尔 Vin Diesel 饰)与莱蒂(米歇尔·罗德里格兹 Michelle Rodriguez 饰)共度蜜月,布莱恩与米娅退出了赛车界,这支曾环游世界的顶级飞车家族队伍的生活正渐趋平淡。然而,一位神秘女子Cipher(查理兹·塞隆 Charlize T heron 饰)的出现,令整个队伍卷入信任与背叛的危机,面临前所未有的考验。");26

27 session.beginTransaction();28 session.save(movie);29 session.getTransaction().commit();30 } catch(Exception e) {31 e.printStackTrace();32 } finally{33 if (session != null) {34 session.close();35 }36

37 if(sessionFactory != null) {38 sessionFactory.close();39 }40 }41 }42 }

运行程序,并查看数据,发现数据库中已经创建了movie表并且其内已经插入了一条数据

mysql>use MOVIE_DB;

Database changed

mysql> selectname from Movie;+------------------+

| name |

+------------------+

| 速度与激情8 |

+------------------+

1 row in set (0.00sec)

mysql>

学习过程中遇到的一些问题:

1.MYSQL使用的是5.7版本,而JDBC使用的最新的8.0.8版本,启动的时候提示时区信息不可识别

Caused by: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize timezone support.

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:81)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:55)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:65)

at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:70)

at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:853)

at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:440)

at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241)

at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:221)

at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)

...28 more

该问题在hibrnate.cfg.xml中指定时区(GMT+8,其中+需用%2B转义)信息即可:jdbc:mysql://localhost:3306/MOVIE_DB?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8

2.Hibernae官方基础示例中配置的方言为org.hibernate.dialect.H2Dialect,需更改为正确的方言配置org.hibernate.dialect.MySQL5Dialect,否则会提示DDL语句执行失败

WARN: GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement

at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:440)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:424)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:315)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121)

at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:155)

at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)

at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:313)

at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:452)

at org.hibernate.boot.internal.MetadataImpl.buildSessionFactory(MetadataImpl.java:170)

at study.hibernate.Launcher.main(Launcher.java:19)

3.Hibernate.cfg.xml中的create配置只会自动创表,不会帮忙把schemal一起创建出来,因此程序运行前必须手动创建:create database MOVIE_DB;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值