1.创建项目
若勾选Use library,则点击右侧的Create,使用本地已下载的Hibernate 5.2.13框架(必须导入hibernate-release-5.2.13.Final\lib\required
下所有jar包):
设置项目名和项目位置,点击Finish:
项目构建完成后自动创建lib目录和将Hibernate所有jar包放到此目录下并自动Add as Library。同时,自动生成了hibernate.cfg.xml和Main.java(下文有用到这两文件):
创建项目流程如下:
此外,还需要添加MySQL JDBC驱动。 将MySQL JDBC驱动的jar包拷贝至lib目录下,右键选择Add as Library:
MySQL JDBC驱动的Library的Name任意即可:
四、完善项目
Hibernate可以根据Java实体类如Student类映射生成数据库Student表,亦可以根据数据库表Student映射生成Java实体类Student。所以使用Hibernate不需要先在数据库中建表。
通过Hibernate的Java类Configuration对象读取Hibernate配置文件hibernate.cfg.xml,通过其mapping标签读取Hibernate实体类映射文件如Student.hbm.xml,然后根据其class标签找到Java实体类Student,然后就可以根据对Java实体类Student的操作映射到对数据库表Student的CRUD操作。故可以先创建Java实体类,然后创建其Hibernate映射文件,接着创建Hibernate配置文件,最后可以编码测试。
<1>、创建Java实体类
Java实体类,也称为持久化类,是一个POJO(Plain Old Java Object,简单的Java对象,普通JavaBean),可以这么理解,需要创建这么一个Java实体类:公有的类,私有的属性,并提供公有无参构造函数,以及私有属性的公有的Getter/Setter方法。。
学生实体类Student,其有四个属性:id(学号,主键)、name(姓名)、sex(性别)和birthday(出生日期)。
Student.java如下:
package com.nerwer.pojo;import java.util.Date;/** * @author:Mr.Tan * @Create:2018-10-28-03-34 * 公有的学生实体类Student,将映射到数据库表Student **/public class Student { ???/** ????* 学生的属性,应为私有的属性,学生实体类主键为id ????*/ ???private int id; ???private String name; ???private String sex; ???//注意使用java.util.Date包下的日期类型 ???private Date birthday; ???/** ????* 应提供无参构造函数 ????*/ ???public Student() { ???} ???/** ????* 若提供了带有参数的构造函数,则必须显示提供无参构造函数 ????*/ ???public Student(int id, String name, String sex, Date birthday) { ???????this.id = id; ???????this.name = name; ???????this.sex = sex; ???????this.birthday = birthday; ???} ???// 为属性提供公有的Getter/Setter方法 ???public int getId() { ???????return id; ???} ???public void setId(int id) { ???????this.id = id; ???} ???public String getName() { ???????return name; ???} ???public void setName(String name) { ???????this.name = name; ???} ???public String getSex() { ???????return sex; ???} ???public void setSex(String sex) { ???????this.sex = sex; ???} ???public Date getBirthday() { ???????return birthday; ???} ???public void setBirthday(Date birthday) { ???????this.birthday = birthday; ???} ???@Override ???public String toString() { ???????return "Student{" + ???????????????"id=" + id + ???????????????", name=‘" + name + ‘\‘‘ + ???????????????", sex=‘" + sex + ‘\‘‘ + ???????????????", birthday=" + birthday + ???????????????‘}‘; ???}}
<2>、创建Java实体类的Hibernate映射文件
如何让Java实体类和数据库表映射呢(Java映射为SQL)?目前有两种方式:XML和Annotation。
XML即Extensible Markup Language,可扩展标记语言,用来传输和存储数据,独立于软件和硬件的信息传输工具,能实现不同应用系统间数据的共享和交互,故XML可以作为媒介,将Java映射为SQL。Annotation,即注解,在Java类、属性、方法上添加@注解名称的形式。
学生实体类映射文件Student.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 将Java实体类Student与数据库Hibernate表Student映射 --> ???<class name="com.newer.tanlei.Student" table="Student"> ???????<!-- 主键 --> ???????<id name="id" column="id" type="java.lang.Integer"> ???????????<generator class="assigned"/> ???????</id> ???????<!-- 非主键属性使用property --> ???????<property name="name" type="java.lang.String" length="20" not-null="true"/> ???????<property name="sex" type="java.lang.String" length="2"/> ???????<property name="birthday" type="java.util.Date"/> ???</class></hibernate-mapping>
实体类映射文件通过class标签将Java实体类和数据库表映射,通常有如下三个属性:
name:Java实体类的全路径,必须设置此属性;table:Java实体类映射到数据库中的表名,可省略,默认与Java实体类名一致;schema:Java实体类映射到数据库名,可省略,因为在hibernate.cfg.xml中的connection.url属性中指定了所要操作的数据库名。
<class name="com.rcnjtech.entity.Student" table="Student"> ???...</class>
然后在class标签里配置Java实体类映射到数据库中表的主键(id标签)、属性(property标签)字段等,这两标签常用的属性有:
name:Java实体类的属性(数据成员),必须设置此属性;column:Java实体类的属性映射到数据库表的字段名,可省略,默认与属性名一致;type:Java实体类的属性映射到数据库表的字段的数据类型,可以指定为Java数据类型或者Hibernate映射类型(在Java和SQL数据类型之间转换的转换器)。可省略,若未指定此属性,则Hibernate将尝试使用反射机制自动确定类型(Date类型需注意),但会增加资源开销,因此建议指定此属性;length:映射到数据库表的字段的长度,可省略;not-null:映射到数据库表的字段能否为空,可省略。
id:主键,generator标签表示主键生成策略,目前先介绍两种主键生成策略分别为native(自动增长)和assigned(手工赋值):
<!-- 主键属性使用id --><id name="id" column="id" type="java.lang.Integer"> ???<!-- 使用手工赋值 --> ???<generator class="assigned"/></id>
property:非主键属性的字段使用property标签:
<!-- 非主键属性使用property --> ???????<property name="name" type="java.lang.String" length="20" not-null="true"/> ???????<property name="sex" type="java.lang.String" length="2"/> ???????<property name="birthday" type="java.util.Date"/>
故可简化为如下:
<!-- 主键属性使用id --><id name="id"><generator class="assigned"/></id><!-- 非主键属性使用property --><property name="name"/><property name="sex"/><!-- type指定为Hibernate映射类型,date只含年月日 --><property name="birthday" type="date"/>
<3>、创建或修改Hibernate配置文件
Hibernate配置文件即hibernate.cfg.xml定义了Hibernate的配置信息,值得注意的是Hibernate配置文件的名称和位置是约定好的,即名称必须为hibernate.cfg.xml,位置在src根目录下。修改自动生成的hibernate.cfg.xml。
一个hibernate.cfg.xml模板文件如下:
<?xml version=‘1.0‘ encoding=‘utf-8‘?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> ?<hibernate-configuration> ?<session-factory> <!-- 1、数据库连接信息 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> ?<!-- useUnicode=true&characterEncoding=UTF-8可避免中文乱码 --> ?<property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8</property> ?<property name="connection.username">root</property> ?<property name="connection.password">1234</property> ?<!-- 2、数据库操纵信息 --> ?<property name="show_sql">true</property> ?<property name="format_sql">true</property> ?<!-- 注意dialect的值,否则会出现奇怪的问题 --> ?<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hbm2ddl.auto">create</property> <!-- 3、添加实体类映射文件 --> ?<mapping resource="com/rcnjtech/entity/Student.hbm.xml"/> </session-factory> ?</hibernate-configuration>
hibernate.cfg.xml里所有的配置信息都是以<property name="属性名">属性值</property>的形式(即键值对,键名 = 键值),并且所有的属性名可以省略前缀hibernate.(如hibernate.connection.driver_class可以简写为connection.driver_class),配置信息包含了如下三部分内容:
①、数据库连接信息,必须要有下面四个属性,以MySQL数据库为例:
connection.driver_class:数据库驱动器类;connection.url:数据库URL,至少由三部分组成,如jdbc:mysql://localhost:3306/hibernate,jdbc:mysql://为MySQL JDBC,localhost:3306/为本机数据库,端口号为3306,hibernate则为MySQL数据库里的一个名为hibernate的数据库。此外,还可以设置是否使用SSL、设置Timezone以及设置字符编码和字符集等。其还有一种简写形式为jdbc:mysql:///hibernate,即默认访问的是本机数据库;connection.username:数据库用户名(MySQL数据库默认用户名root);connection.password:数据库root用户对应的密码。
<!-- 1、数据库连接信息 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> ?<!-- useUnicode=true
&characterEncoding=UTF-8可避免中文乱码 -->
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
&=&
其配置信息对应于使用JDBC时注册驱动器类和获得数据库连接对象Connection:
// JDBC代码// 注册驱动器类Class.forName(driver_class);// 获得数据库连接对象Connection conn = DriverManager.getConnection(url, username, password);
②、数据库操纵信息,目前常用的有如下几个,还有一些设置以后会补充的:
show_sql:控制台输出SQL语句;format_sql:对控制台输出SQL语句进行排版格式化;dialect:数据库方言,针对不同的数据库不同的版本的语法特征。MySQL5Dialect适用于MySQL 5.x版本 ,MySQLDialect适用于MySQL 5之前的版本。故当MySQL 版本在5.0以上时dialect属性建议设置为org.hibernate.dialect.MySQL5Dialect;hbm2ddl.auto:DDL表结构策略,如每次生成表结构是删除以前的表重新创建,还是更新表结构。
<!-- 2、数据库操纵信息 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 注意dialect的值,否则会出现奇怪的问题 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hbm2ddl.auto">create</property>
③、Java实体类映射文件配置信息:将实体类映射文件路径添加到<mapping/>标签中(注意实体类映射文件路径的写法),Hibernate会根据映射文件使用java.lang.ClassLoader加载实体类。
<!-- 3、添加实体类映射文件 ?--><mapping resource="com/rcnjtech/entity/Student.hbm.xml"/>
<4>、编写测试程序
项目创建的时候默认创建了hibernate.cfg.xml和Main.java,其中Main.java,修改Main.java,
Main.java代码如下:
import com.newer.tanlei.Student;import org.hibernate.*;import org.hibernate.cfg.Configuration;import org.hibernate.metadata.ClassMetadata;import java.util.Date;import java.util.Map;/** ?* * 测试类 * ?* * @author RCNJTECH ?*/public class Main { ???private static final SessionFactory sessionFactory; ???static { ???????Configuration configuration = new Configuration(); ???????configuration.configure(); ???????sessionFactory = configuration.buildSessionFactory(); ???} ???public static Session getSession() { ???????return sessionFactory.openSession(); ???} ???public static void main(String[] args) { ???????final Session session = getSession(); ???????Transaction transaction = session.beginTransaction(); ???????try { Student student = new Student(10001, "张三", "男", new Date()); ???????????session.save(student); transaction.commit(); ???????} catch (Exception e) { ???????????transaction.rollback(); ???????????e.printStackTrace(); ???????} finally { ???????????session.close(); sessionFactory.close(); ???????} ???}}
运行Main.java测试。首先判断数据库中是否已有表Student,否则删表。根据根据Hibernate映射文件生成表Student,然后插入一条数据:
通过IDEA自带的数据库管理工具,可查看到的确创建了Student表,并成功向Student表中添加了一条数据10001 | 张三 | 男 | 2018-02-20 17:55:36
:
五、遇到一些问题
运行测试程序通过,并且也成功向数据库中添加表和数据,但Student.hbm.xml文件中仍有报错的地方,但此处的可以忽略,因为并没有错,IDEA没有找到DataSource(数据源),需要使用IDEA自带的数据库管理工具连接上MySQL数据库并为之分配DataSource即可:
五、遇到一些问题
运行测试程序通过,并且也成功向数据库中添加表和数据,但Student.hbm.xml文件中仍有报错的地方,但此处的可以忽略,因为并没有错,IDEA没有找到DataSource(数据源),需要使用IDEA自带的数据库管理工具连接上MySQL数据库并为之分配DataSource即可:
利用idea构建hibernate
原文地址:https://www.cnblogs.com/tanlei-sxs/p/9864278.html