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.xmlMain.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)?目前有两种方式:XMLAnnotation

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
&ampcharacterEncoding=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>
&amp=&

其配置信息对应于使用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的更多相关文章

  1. 利用Dockerfile构建一个基于centos 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像

    Dockerfile内容如下: FROM centos MAINTAINER Victor ivictor@foxmail.com WORKDIR /root RUN rm -f /etc/yum.r ...

  2. 利用node构建本地服务

    利用node构建本地服务 首先安装下node.js,地址为https://nodejs.org/en/,然后安装npm. node.js的中文api地址http://nodeapi.ucdok.com ...

  3. Spark:利用Eclipse构建Spark集成开发环境

    前一篇文章“Apache Spark学习:将Spark部署到Hadoop 2.2.0上”介绍了如何使用Maven编译生成可直接运行在Hadoop 2.2.0上的Spark jar包,而本文则在此基础上 ...

  4. [Gradle] 在 Eclipse 下利用 gradle 构建系统

      转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 构建系统时候常常要用到 Ant, Maven 等工具,对于初学者 ...

  5. 利用 vue-cli 构建一个 Vue 项目

    一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...

  6. springboot+mybatis-puls利用swagger构建api文档

    项目开发常采用前后端分离的方式.前后端通过API进行交互,在Swagger UI中,前后端人员能够直观预览并且测试API,方便前后端人员同步开发. 在SpringBoot中集成swagger,步骤如下 ...

  7. 利用openssl构建根证书-服务器证书-客户证书

    利用openssl构建根证书-服务器证书-客户证书 OpenSSL功能远胜于KeyTool,可用于根证书,服务器证书和客户证书的管理 一.构建根证书 1.构建根证书前,需要构建随机数文件(.rand) ...

  8. [转]利用Docker构建开发环境

    利用Docker构建开发环境 Posted by  makewonder on 2014 年 4 月 2 日   最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境, ...

  9. 利用Xamaria构建Android应用-公交发车信息屏

    原文:利用Xamaria构建Android应用-公交发车信息屏 1.背景 在公交整个运营系统中,信息展示占据了很大一部分的内容.各种除了户外的各种LED拼接屏,还有用于室内信息提示用的LCD屏幕.对于 ...

随机推荐

  1. LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板

    P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...

  2. consul理解

    假设consul软件安装在电脑ComputerA上,那么需要注册的服务ServiceA1也需要安装在电脑ComputerA上, 一个服务就是一个提供了ip+port(或者域名)的应用程序. 服务: 服 ...

  3. Redis源码解析:17Resis主从复制之主节点的部分重同步流程及其他

    本文主要讲解主节点部分重同步的实现,以及主从复制中的其他功能.本文是Redis主从复制机制的最后一篇文章. 主节点在收到从节点发来的PSYNC命令之前,主节点的部分重同步流程,与完全重同步流程是一样的 ...

  4. IOException parsing XML document from ServletContext resource

    错误是我们学习的机会,不要错过明白明这个错误原因的机会,那么我们就可以更加深刻得理解这个问题. 在启动springmvc的程序去访问的时候,报IO异常,一般情况下IO异常就是文件找不到. 详细错误如下 ...

  5. a标签实现 批量下载

    // 批量下载 download (name, href) { var a = document.createElement('a') var e = document.createEvent('Mo ...

  6. 使用 prerender 实现 SEO

    server { listen 80; server_name www.umount.com; access_log /var/log/nginx/livefrontend/access.log LF ...

  7. Linux图形界面安装卸载,与命令界面之间的转换

    1.图形界面与命令界面之间的转换 软切换: ctrl+alt+F6进入命令行模式,ctrl+alt+F1进入图形界面,(有些情况下不管用) 注意: 该方法转为命令行界面后图形界面依然占据着系统资源. ...

  8. python基础--迭代器、生成器、内置函数、面向对象编程

    迭代器:迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束.迭代器只能往前不会后退 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 使用迭代器的 ...

  9. Centos无法连接无线网络解决办法

    系统->管理->服务器设置->服务,将NetworkManager选项勾选,点击重启服务.然后就可以看到右上角已经有了网络连接.

  10. tcpdump命令介绍

    命令格式为:tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae] [-qX] [-r 文件] [所欲捕获的数据内容] 参数: -nn,直接以 IP 及 Port ...