hibernate的初次使用

转载地址:http://blog.csdn.net/aboy123/article/details/10222675

一、Hibernate概述

(一)什么是Hibernate?

           hibernate核心内容是ORM(关系对象模型)。可以将对象自动的生成数据库中的信息,使得开发更加的面向对象。这样作为程序员就可以使用面向对象的思想来操作数据库,而不用关心繁琐的JDBC。所以,Hibernate处于三层架构中的D层(持久层)。

(二)使用Hibernate的优点

1、Hibernate可以使用在Java的任何项目中,不一定非要使用在Java web项目中。因为Hibernate不需要类似于tomact这些容器的支持,可以直接通过一个main方法进行测试。

2、通过下面的实例,可以发现使用Hibernate可以大大减少代码量。

3、由于使用了Hibernate,代码中不涉及具体的JDBC语句,所以就方便了代码的可移植性。

二、Hibernate开发的环境搭建

(一)Hibernate的环境搭建非常简单,只需要引入Hibernate核心包(单击下载)以及Hibernate依赖包(单击下载)即可。
(二)加入数据库驱动。下面的例子中主要是采用Mysql数据库来演示的,所以在这里引入MysqL的JDBC驱动(点击下载)。
(三)提供核心配置文件hibernate.cfg.xml文件(在src文件夹下即可)。其中的配置如下(针对mysql)
[html] view plaincopyprint?
  1. <!DOCTYPE hibernate-configuration PUBLIC  
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  3.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  4.   
  5. <hibernate-configuration>  
  6.     <session-factory >  
  7.         <!-- mysql数据库驱动 -->  
  8.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
  9.         <!-- mysql数据库名称 -->  
  10.         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>  
  11.         <!-- 数据库的登陆用户名 -->  
  12.         <property name="hibernate.connection.username">root</property>  
  13.         <!-- 数据库的登陆密码 -->  
  14.         <property name="hibernate.connection.password">root</property>  
  15.         <!-- 方言:为每一种数据库提供适配器,方便转换 -->  
  16.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
  17.           
  18.     </session-factory>  
  19. </hibernate-configuration>  
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory ><!-- mysql数据库驱动 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- mysql数据库名称 --><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property><!-- 数据库的登陆用户名 --><property name="hibernate.connection.username">root</property><!-- 数据库的登陆密码 --><property name="hibernate.connection.password">root</property><!-- 方言:为每一种数据库提供适配器,方便转换 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property></session-factory>
</hibernate-configuration>

三、HIbernate第一个实例

该实例的目录结构如下
说明:最后一个HIBERNATE3里面包含了所有的需要引用的jar包

1、新建一个普通的java项目,按照上面的步骤引入相关的jar包和配置文件

2、建立User实体类
[java] view plaincopyprint?
  1. import java.util.Date;  
  2.   
  3. public class User {  
  4.     private String id;  
  5.     private String username;  
  6.     private String password;  
  7.     private Date createTime;  
  8.     private Date expireTime;  
  9.       
  10.     public String getId() {  
  11.         return id;  
  12.     }  
  13.     public void setId(String id) {  
  14.         this.id = id;  
  15.     }  
  16.     public String getUsername() {  
  17.         return username;  
  18.     }  
  19.     public void setUsername(String userName) {  
  20.         this.username = userName;  
  21.     }  
  22.     public String getPassword() {  
  23.         return password;  
  24.     }  
  25.     public void setPassword(String password) {  
  26.         this.password = password;  
  27.     }  
  28.     public Date getCreateTime() {  
  29.         return createTime;  
  30.     }  
  31.     public void setCreateTime(Date createTime) {  
  32.         this.createTime = createTime;  
  33.     }  
  34.     public Date getExpireTime() {  
  35.         return expireTime;  
  36.     }  
  37.     public void setExpireTime(Date expireTime) {  
  38.         this.expireTime = expireTime;  
  39.     }  
  40. }  
import java.util.Date;public class User {private String id;private String username;private String password;private Date createTime;private Date expireTime;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String userName) {this.username = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getExpireTime() {return expireTime;}public void setExpireTime(Date expireTime) {this.expireTime = expireTime;}
}

2、提供User.hbm.xml文件,完成实体类的映射
[html] view plaincopyprint?
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.       
  6. <hibernate-mapping>  
  7.     <class name="com.example.hibernate.User">  
  8.         <id name="id">  
  9.             <generator class="uuid"/>  
  10.         </id>  
  11.         <property name="username"/>  
  12.         <property name="password"/>  
  13.         <property name="createTime"/>  
  14.         <property name="expireTime"/>  
  15.     </class>  
  16. </hibernate-mapping>  
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.example.hibernate.User"><id name="id"><generator class="uuid"/></id><property name="username"/><property name="password"/><property name="createTime"/><property name="expireTime"/></class>
</hibernate-mapping>
其中的property标签是将要生成是数据库表中的字段,在这里不用关心各个字段是什么类型的。因为Hibernate会根据上面的实体类中属性的类型来决定将来表中字段的类型

3、配置hibernate.cfg.xml文件
[html] view plaincopyprint?
  1. <hibernate-configuration>  
  2.     <session-factory >  
  3.         <!-- mysql数据库驱动 -->  
  4.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
  5.         <!-- mysql数据库名称 -->  
  6.         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>  
  7.         <!-- 数据库的登陆用户名 -->  
  8.         <property name="hibernate.connection.username">root</property>  
  9.         <!-- 数据库的登陆密码 -->  
  10.         <property name="hibernate.connection.password">root</property>  
  11.         <!-- 方言:为每一种数据库提供适配器,方便转换 -->  
  12.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
  13.           
  14.         <span style="color: rgb(255, 0, 0);"><mapping resource="com/example/hibernate/User.hbm.xml"/></span>  
  15.     </session-factory>  
  16. </hibernate-configuration>  
<hibernate-configuration><session-factory ><!-- mysql数据库驱动 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- mysql数据库名称 --><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property><!-- 数据库的登陆用户名 --><property name="hibernate.connection.username">root</property><!-- 数据库的登陆密码 --><property name="hibernate.connection.password">root</property><!-- 方言:为每一种数据库提供适配器,方便转换 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><mapping resource="com/example/hibernate/User.hbm.xml"/></session-factory>
</hibernate-configuration>
注意:必须是“/”而不能是“.”。
4、生成表:编写工具类ExoprtDB.java,将hbm生成ddl
[java] view plaincopyprint?
  1. import org.hibernate.cfg.Configuration;  
  2. import org.hibernate.tool.hbm2ddl.SchemaExport;  
  3. /** 
  4.  * 将hbm生成ddl 
  5.  * @author BCH 
  6.  * 
  7.  */  
  8. public class ExoprtDB {  
  9.   
  10.     public static void main(String[] args) {  
  11.         //默认读取hibernate.cfg.xml文件  
  12.         Configuration cfr = new Configuration().configure();  
  13.           
  14.         SchemaExport export = new SchemaExport(cfr);  
  15.         export.create(truetrue);  
  16.     }  
  17. }  
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/*** 将hbm生成ddl* @author BCH**/
public class ExoprtDB {public static void main(String[] args) {//默认读取hibernate.cfg.xml文件Configuration cfr = new Configuration().configure();SchemaExport export = new SchemaExport(cfr);export.create(true, true);}
}
到这里就可以生成User表了,但是如果直接运行ExoprtDB.java文件是不能生成User表的。因为在mysql数据中还没有建立数据库Hibernate-first。所以在mysql控制台中通过create database hibernate-first; use hibernate-first;之后再执行ExoprtDB.java文件就可以生成表了。

5、向表中添加数据
[java] view plaincopyprint?
  1. import java.util.Date;  
  2.   
  3. import org.hibernate.Session;  
  4. import org.hibernate.SessionFactory;  
  5. import org.hibernate.cfg.Configuration;  
  6.   
  7. public class Client {  
  8.     public static void main(String[] args) {  
  9.         //读取配置文件  
  10.         Configuration cfg = new Configuration().configure();  
  11.           
  12.         SessionFactory factory = cfg.buildSessionFactory();  
  13.           
  14.         Session session = null;  
  15.         try{  
  16.             session = factory.openSession();  
  17.             //开启事务  
  18.             session.beginTransaction();  
  19.               
  20.             User user = new User();  
  21.             user.setUsername("用户名");  
  22.             user.setPassword("123");  
  23.             user.setCreateTime(new Date());  
  24.             user.setExpireTime(new Date());  
  25.               
  26.             session.save(user);  
  27.             //提交事务  
  28.             session.getTransaction().commit();  
  29.               
  30.         }catch(Exception e){  
  31.             e.printStackTrace();  
  32.             //回滚事务  
  33.             session.getTransaction().rollback();  
  34.         }finally{  
  35.             if(session != null){  
  36.                 if(session.isOpen()){  
  37.                     //关闭session  
  38.                     session.close();  
  39.                 }  
  40.             }  
  41.         }  
  42.     }  
  43. }  
import java.util.Date;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class Client {public static void main(String[] args) {//读取配置文件Configuration cfg = new Configuration().configure();SessionFactory factory = cfg.buildSessionFactory();Session session = null;try{session = factory.openSession();//开启事务session.beginTransaction();User user = new User();user.setUsername("用户名");user.setPassword("123");user.setCreateTime(new Date());user.setExpireTime(new Date());session.save(user);//提交事务session.getTransaction().commit();}catch(Exception e){e.printStackTrace();//回滚事务session.getTransaction().rollback();}finally{if(session != null){if(session.isOpen()){//关闭sessionsession.close();}}}}
}

执行该java文件就可以完成向表中增加数据了,效果如下


(四)总结

通过上面的代码我们可以看出,在代码中没有涉及到任何有关JDBC的代码,作为开发人员只需要写好相应的实体类,然后通过配置就可以实现了表的建立以及向表中实现数据的插入。
在代码中有许多Hibernate的核心对象,例如Configuration、SessionFactory、Session等等。这些内容将在以后介绍。


一、什么是映射

在上一篇文章中 新手上路之Hibernate:第一个Hibernate例子,通过一个例子了解了什么是hibernate。而其中最重要的就是通过User.hbm.xml来配置映射。这里所说的映射就是对象关系映射:将对象数据保存到数据库中,同时可以将数据库数据读入对象中,开发人员只对对象进行操作就可以完成对数据库数据的操作。


二、什么是基本映射

知道了什么是映射,那么我们先来看一下最基本的映射关系——基本映射,即根据表结构创建相应实体类


例如:还是以MySQL数据库为例,进行说明。有如下一张表:

建立相应的实体类:User

[java] view plaincopy
  1. public class User {  
  2.     private String id;  
  3.     private String username;  
  4.       
  5.     public String getId() {  
  6.         return id;  
  7.     }  
  8.     public void setId(String id) {  
  9.         this.id = id;  
  10.     }  
  11.     public String getUsername() {  
  12.         return username;  
  13.     }  
  14.     public void setUsername(String userName) {  
  15.         this.username = userName;  
  16.     }  
  17. }  

对于Hibernate来说,最重要的就是配置文件,即还需要一个User.hbm.xml文件

[html] view plaincopy
  1. <hibernate-mapping>  
  2.     <class name="com.example.hibernate.User" table="t_user">  
  3.         <id name="id">  
  4.             <generator class="uuid"/>  
  5.         </id>  
  6.         <property name="username"/>  
  7.           
  8.     </class>  
  9. </hibernate-mapping>  

其他部分的代码参照上一篇文章即可。


三、建立User实体类的一些原则

       1、实现无参的默认的构造函数

       2、提供一个标识

       3、建议不要使用fianl修饰实体类

       4、建议为实体类生成setter和getter方法

对于第3条建议,如果使用了fianl关键字,那么延迟加载(load)将会无效。具体含义将会在下一篇文章中给出实例。


四、HIbernate主键生成策略

在上面User.hbm.xml配置文件中有一个标签:<generator>。它表示的是主键生成策略。主键生成策略必须配置,用来为该持久化类的实例生成唯一的标识。它有如下几种策略

    uuid: 用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了IP地址),UUID被编码为一个32位16进制数字的字符串,它的生成是由Hibernate生成,一般不会重复UUID包含:IP地址,JVM的启动时间,系统时间和一个计算器值。

    identity:MySql数据库中自增长

    Sequence:Oracle数据库自增长

    native:根据底层数据库能力选择identity、sequence中的一个。

    assigned:手动分配主键.<generator>没有指定时的默认生成策略

    foreign:使用另外一个相关联的对象的标示符。通常和<one-to-one>配合使用

五、总结

概括一下Hibernate的基本映射就是:
实体类——对应了——数据库中表、实体类中的属性——对应了——表中字段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我用过 | Keil的发展历史

Keil&#xff0c;相信搞嵌入式软硬件开发的读者都不陌生&#xff0c;在全球单片机&#xff08;MCU&#xff09;集成开发环境&#xff08;IDE&#xff09;中&#xff0c;可以说 Keil 占据了半壁江山。Keil 既是一家公司的名称&#xff0c;也是一款 IDE 软件。下面讲述一下 Keil …

嵌入式算法-傅里叶变换算法

摘要&#xff1a;傅里叶变换的核心在于&#xff0c;“任何连续周期信号可以由一组适当的正弦曲线组合而成”&#xff0c;在这个基础上对信号的中特定频率的正弦波进行分解或者重组&#xff0c;基于频率方面分析波形。1、傅里叶变换的意义近似周期性的方波&#xff08;橙色&…

Server 2008 R2 AD RMS完整部署:AD部署篇

在上一篇里我们完成了基本环境的准备&#xff0c;这一篇主要是讲AD的部署&#xff0c;完成之后我们需要把RMS服务器和两个客户端都加入到域中。好了废话就不说了&#xff0c;首先在我们创建的DC虚机上登录&#xff0c;并对计算机名称进行修改。 完成后先不要忙着重启&#xff0…

2018-2019-1 20165219 实验三 实时系统

2018-2019-1 20165219 实验三 实时系统 任务一 实验要求 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc&#xff08;1&#xff09;服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文件给服务器 服务器返加文本文件中的单词数 客户端 #include<netinet/in…

音视频基础知识大全

今天跟几个朋友聊天&#xff0c;他们问我是不是在腾讯&#xff0c;在腾讯做什么&#xff1f;然后我就说了我做的事情&#xff0c;我说我在腾讯做音频方面的开发&#xff0c;对外的产品主要是腾讯会议。然后他我一个朋友就截图了他的腾讯会议的软件截图过来。音视频是一个很好玩…

详解Android Touch事件的传递机制

1、基础知识 (1) 所有Touch事件都被封装成了MotionEvent对象&#xff0c;包括Touch的位置、时间、历史记录以及第几个手指(多指触摸)等。 (2) 事件类型分为ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL&#xff0c;每个事件都…

项目专访|在ESP32上移植Linux

大家好&#xff0c;我是写代码的篮球球痴&#xff0c;最近在网上看到一个非常有意思的项目&#xff0c;有大神把Linux内核移植到ESP32上&#xff0c;并成功运行。在国外网站上&#xff0c;有很多人在议论这件事情https://hackaday.com/2021/07/21/its-linux-but-on-an-esp32/ES…

4.3英寸屏双核 LG Prada K2通过FCC认证

我们此前曝光过一款型号为LG Prada K2的智能手机&#xff0c;这款手机不仅配置出色而且外观极为时尚。如今&#xff0c;来自国外媒体的最新消息显示&#xff0c;LG Prada K2已经通过FCC认证&#xff0c;这意味着它距离上市已经为期不远。 LG Prada K2通过FCC认证 LG Prada K2是…

国内MCU厂商也开始卷了

最近我大学老师准备做一个项目&#xff0c;需要用到STM32的芯片&#xff0c;然后我就帮忙着一起找&#xff0c;不找不知道&#xff0c;找了才知道这个东西真的是贵。然后我就看了GD32&#xff0c;不了解不知道&#xff0c;这个东西也是真的贵。然后我又去看的MM32&#xff0c;结…

Google Flash转换HTML5工具Swiffy测试版发布

Google今年六月推出的Flash转换HTML5工具已经从实验室转为测试版&#xff0c;并新增一个Flash Professional扩充模组&#xff0c;可以直接将档案储存为HTML5格式。一开始Swiffy仅以网站方式&#xff0c;让使用者上传Flash的.swf档案&#xff0c;支持Flash所使用的swf 8格式与Ac…

什么是MCU里应尽量遵循的寄存器谨慎赋值法?

有人觉得搞MCU是一件简单的事情&#xff0c;往往觉得简单的事反而出错更多&#xff0c;今天转发一篇我朋友痞子衡的文章&#xff0c;说说MCU里面的寄存器的事。大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是改动i.MXRT1xxx里IOMUXC_G…

惠普电脑如何下载c语言软件,惠普笔记本电脑上的语言栏怎么弄

满意答案mygood12f32013.01.23采纳率&#xff1a;53% 等级&#xff1a;11已帮助&#xff1a;6723人首先运行“regedit”&#xff0c;展开“HKEY_CURRENT_USER/keyboard layout/preload”分支&#xff0c;在其下新建一个字符串值&#xff0c;命名为“1”&#xff0c;并将它对…

单件模式(Singleton Pattern)

1、单件模式试用与窗口管理器或者是打印假脱机、数据库连接池&#xff1b;2、目的&#xff1a;在单独得对象实例中&#xff0c;集中了这个对象所属类得所有权利&#xff1b;3、DoNet解决方案 public class DotNetSigleton { private static readonly DotNetSiglet…

LeetCode:二进制手表【401】

LeetCode&#xff1a;二进制手表【401】 题目描述 二进制手表顶部有 4 个 LED 代表小时&#xff08;0-11&#xff09;&#xff0c;底部的 6 个 LED 代表分钟&#xff08;0-59&#xff09;。 每个 LED 代表一个 0 或 1&#xff0c;最低位在右侧。 例如&#xff0c;上面的二进制手…

反馈电路中相位补偿,到底是什么鬼?

帮朋友做镍氢充电器&#xff0c;利用镍氢电池充满电时电压有一个微小的下降这个特点来识别是否已经充满&#xff0c;比如1.2V的镍氢电池&#xff0c;快充满的时候&#xff0c;电压在1.35V&#xff0c;之后逐步下降&#xff0c;电压可以低于1.30V。所以需要单片机间歇检测电池两…

RoseHA集群:RHEL+RoseMirror+Oracle【2】

博主正在参加“2011年度IT博客大赛”&#xff0c;欢迎帮顶&#xff01; 投票地址 --------------------------------------------- 三&#xff0e;安装Rose Mirror HA&#xff1a;准备工作&#xff1a;在安装 Rose Mirror HA 前检查相应的软件包是否安装&#xff0c;如果没有安…

c语言笔试面试面试题,最新华为c语言笔试面试题

最新华为c语言笔试面试题本文是百分网小编搜索整理的一份最新华为c语言笔试面试题&#xff0c;有需要的朋友们一起看看吧!想了解更多相关信息请持续关注我们应届毕业生考试网!1、局部变量能否和全局变量重名答&#xff1a;能&#xff0c;局部会屏蔽全局。要用全局变量&#xff…

【项目管理】CMMI-需求跟踪矩阵模版

需求菜单/功能模块需求名称需求变更类型&#xff08;新增、修改&#xff09;需求状态&#xff08;已建议、已批准、已设计、已实现、已验证、已删除&#xff09;优先级&#xff08;高、中、低&#xff09;软件需求&#xff08;工作产品、章节号&#xff09;概要设计&#xff08…

嵌入式工程师薪资调查

大家好&#xff0c;嵌入式行业薪资一直是大家关心的问题&#xff0c;刚好我的好朋友发起了一个调查&#xff0c;大家可以匿名写下自己的薪资&#xff0c;也可以看看其他的薪资水平。3月4月份确实是找工作的好机会&#xff0c;求职和跳槽最好的月份要来了吗 &#xff0c;最近看到…

在STM32单片机上跑神经网络算法

摘要&#xff1a;为什么可以在STM32上面跑神经网络&#xff1f;简而言之就是使用STM32CubeMX中的X-Cube-AI扩展包将当前比较热门的AI框架进行C代码的转化&#xff0c;以支持在嵌入式设备上使用&#xff0c;目前使用X-Cube-AI需要在STM32CubeMX版本5.0以上&#xff0c;支持转化的…